3009|2

1291

帖子

0

TA的资源

纯净的硅(中级)

【R7F0C809】小试定时器 [复制链接]

本帖最后由 强仔00001 于 2015-9-15 00:07 编辑

   今天看到了瑞莎R7F0C8096定时器的功能,挺强大的,可以产生中断,还可以输出PWM和测量脉冲宽度等。分别有单通道和多通道的功能,如下三图:
QQ截图20150912232015.png
QQ截图20150912232032.png
以上两图是单通道的功能。

接下来是多通道的功能:
QQ截图20150912232057.png
今天就来做个小实验,用定时器产生1ms中断,然后再中断服务程序中计数,当计算到1000时也就是1s时把LED的状态取反一次,并用OLED刷新定时器累计的数和秒数。
配置定时器的步奏基本跟其他的MCU配置大同小异:
1)打开定时器的时钟
2)设定定时器的参数
3)使能定时器相关的中断
4)编写中断服务函数,实现自己预定的功能。
首先我设定的系统时钟为20MHz
void R_CGC_Create(void)
{
    OSMC = 0x10U;
    /*设置系统时钟为20MHz*/
    HOCODIV = 0x01U;
}
接下来就是定时器的一下设定了。
void R_TAU0_Create(void)
{
    TAU0EN =1U;        /* 使能定时器的时钟 */
    TPS0 &= 0x00U;       /*设置时钟的分频系数为0,即定时器的时钟源为20MHz*/
    /*停止所有通道 */
    TT0 |= 0x0FU;
    /*Mask channel 0 interrupt */
    TMMK00 =1U;        /* 关闭 INTTM00 中断 */
    TMIF00 =0U;        /* 清除 INTTM00 中断标志位 */
   
    /*设定INTTM00 低优先级*/
    TMPR100 = 1U;
    TMPR000 = 1U;
   
    /*通道0作为间隔定时器 */
    TMR00H = 0x00U;
    TMR00L = 0x00U;
   
    /*给定时器装初值 */
    TDR00H = 0x4EU;
    TDR00L = 0x1FU;
   
    TO0 &= 0x0EU;
    TOE0 |= 0x01U;
}
这里需要配置中断相关的寄存器,如优先级这些的,可以看中断部分的介绍

我们关注的地方是中断向量表,看下面的表就可以了解:
QQ截图20150912231436.png
这个是中断相关的寄存器:
QQ截图20150912231526.png
值得注意的是,优先级只有4个等级,如下图:
QQ截图20150913000822.png
还有定时器产生中断的时间可以用以下公式算:
QQ截图20150912232647.png
    以我的程序作为例子:我设定的系统时钟为20MHz,定时时钟的分频系数为0,即计数器时钟的周期为:1/20000000Hz = 0.5us,我这里需要设置产生的中断为1ms,所以可以算出TDR00 = (1 / 0.00005)-1=19999,转成16进制就是0x4E1F,因为TDR00分为高八位的TDR00H和第八位的TDR00L,所以装的初值为:
    TDR00H = 0x4EU;
   TDR00L =0x1FU;

中断程序就是不断装原先的初值,然后不断累加计数值,当到达1s时,翻转LED状态并清零计数值。
__interrupt void R_TAU0_Channel0_Interrupt(void)
{
    /*Start user code. Do not edit comment generated here */
    if (++inttm00counter ==1000U)         /* 250 times interrupt ? */
    {
        TDR00H =0x4EU;           /* Set new timer interval to TAU0 channel 0 */
        TDR00L = 0x1FU;
      
        P0 ^=0b00000010U;                /* Invert LED output */
        inttm00counter =0U;              /* Clear TM00 interrupt count */
       count++;
    }
    /*End user code. Do not edit comment generated here */
}
然后再主函数不断刷新计数值和秒数:
void main(void)
{
    /*Start user code. Do not edit comment generated here */
    MD_STATUS result;                   /* communication result */
    hdwinit();
    R_CSI00_Start();                    /* start serial module */
    GPIO_Init();
    R_PORT_Create();
    LCD_Init();
    LCD_CLS();
    R_TAU0_Create();
    R_TAU0_Channel0_Start();
    LCD_show();
    while (1U)
    {
        OLED_Refresh();
    }
    /*End user code. Do not edit comment generated here */

}
放个图和git动画图
IMG_20150913_004110.jpg
VID_20150913_005343.mp4_1442076649.gif
源代码分享:
TIMER.zip (233.29 KB, 下载次数: 10)

最新回复

  感谢分享。。。。  详情 回复 发表于 2015-9-13 08:09

赞赏

2

查看全部赞赏


回复
举报

1891

帖子

2

TA的资源

纯净的硅(中级)

  感谢分享。。。。

点评

谢谢版主的支持  详情 回复 发表于 2015-9-13 10:09
个人签名
分享铸就美好未来。。。





回复

1291

帖子

0

TA的资源

纯净的硅(中级)

574433742 发表于 2015-9-13 08:09
感谢分享。。。。

谢谢版主的支持

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表