本文将开始分析定时器初始化的代码,其他已发布的代码分析可参看以下链接
一、系统时钟初始化R_SYSTEM_ClockInit();
email:1256153255@qq.com
website for get 瑞萨RH850开发板 and 瑞萨E1仿真器
言归正传开始介绍本文的内容。
2、定时器OSTM0初始化
此处是初始化定时器OSTM0,用于产生1ms tick
Code segment 2.1
2.1、R_OSTM0_Init()
Code segment 2.2
Code segment 2.2-> Line82配置OSTM0仿真寄存器
图2.1
通过上图可知,配置OSTM0仿真寄存器,使之在Debuger接入MCU时,count clock停止。
由下图可知,EPS.SVSTOP可通过Debugger进行set,用户禁止对其进行设置。
图2.2
Code segment 2.2-> Line83配置OSTM0CTL寄存器
①配置counter的操作模式(Interval timer mode或Free-run compare mode),此处设置为Interval timer mode
②配置开始计数时OSTMTINT中断的产生(开始计数时禁能中断或开始计数时使能中断),此处配置为开始计数时禁能中断
图2.3
Code segment 2.3
图2.4
图2.5
在Code segment 2.2->Line83中设置opereation mode为 Interva timer mode,因此Code segment 2.3 -> Line116的形参cmp_value值为计数器向下计数的初始值。
那么到了这里之后可能就有朋友纳闷了,在code segment 2.1->Line241的注释中说经过配置后产生1ms的tick,这个1ms tick怎么产生的,和 code segment 2.1->Line248的实参39999有什么关系?又是怎么算出来的?
别急!稳住!且听我徐徐道来。
首先从图2.6可知OSTM0的时钟是由CPUCLK2提供的,那么我只要知道CPUCLK2是多少就行了。
从图2.7可知,PLL→CPUCLKS→CPUCLKD→CPUCLK2(CPUCLKD/2),所以呢其实CPUCLK2是由PLL二分频得到的,那么PLL又是多少呢?请看图2.8,一切尽在不言中。
综上分析可知OSTM0的频率为40MHz,那么从39999减到0需要多长时间呢?答对了,正好是1ms。
图2.6
图2.7
图2.8
至此,定时器OSTM0初始化完成
这里以一个实例来说明定时时间的用法:
在Code segment 2.1->Line 248,函数的实参是39999,算出的定时时间是1ms
在后边的Mode1中,会以倒计时方式串口打印距离进入DeepStop模式的时间
code segment 2.4
从code segment2.4得知,计数满100,进行一次打印
我们要求无操作30s后Mode1 → DeepStop,因此会出现图2.9的打印信息
图2.9
结合图2.9和code segment2.4可知变量是1ms自加一次, 自加100次是100ms,刚好和图2.9吻合
将Code segment 2.1->Line 248,函数的实参变成399999,算出的定时时间应该是是10ms,变量自加100次进行一次打印,那么应该是1s打印一次,经实参调整验证,确实是1s打印一次
到此,大家对OSTM0的定时应该有个初步了解了吧