[原创] 【R7F0C809】小试定时器

强仔00001   2015-9-13 01:16 楼主
今天看到了瑞莎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 01:16 上传)
TIMER.zip (233.29 KB)
(下载次数: 10, 2015-9-13 01:16 上传)
本帖最后由 强仔00001 于 2015-9-15 00:07 编辑

回复评论 (2)

  感谢分享。。。。
分享铸就美好未来。。。
点赞  2015-9-13 08:09
引用: 574433742 发表于 2015-9-13 08:09
感谢分享。。。。

谢谢版主的支持
点赞  2015-9-13 10:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复