环境介绍
Keil : 版本5.34.0.0 编译器V6
官方SDK版本:Nuvoton.NuMicro_DFP.1.3.12
RT_THREAD -3.15 nano 请在KEil 的Run-Time Environment环境进行下载, 需要自行实现systick定时器的中断定时器功能
最开始自行从零搭建工程发现非常多的警告,使用的是V6的编译器, 而编译警告选项选着问题。当然现在很少需要这样创建工程了,有官方例程可以使用
芯片资源介绍
手上的这个M2354芯片定时器资源十分的丰富,6个32位定时器,每个定时器有 1 个 24 位向上计数器。其中TMR0-TMR3四个功能强大,PWM功能适合电机控制,TMR4-TMR5 PWM简单一些。详细功能参考TRM_M2354_Series_EN_Rev1.01文档 第6章9小节。
例程功能介绍
绿灯在使用操作RT RTOS 一个线程实现绿灯1秒闪烁一次。
实现功能: 定时器1实现100MS中断一次进行LED状态切换,如此循环。
配置步骤
确认外设时钟源,以及频率,设置预分频器
设置工作模式
设置CMP 的初始值
配置中断优先级
使能中断,TIMERx_CMP与TIMERx_CNT值匹配中断,TIF中断。
使能定时器
初始化函数
void TIMER1_Init(void)
{
CLK_EnableModuleClock(TMR1_MODULE); // /* APBCLK0 */
TIMER_SET_CMP_VALUE(TIMER1,49999);
TIMER_SET_PRESCALE_VALUE(TIMER1,191);
TIMER_SET_OPMODE(TIMER1,TIMER_PERIODIC_MODE);
NVIC_SetPriority (TMR1_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
NVIC_EnableIRQ(TMR1_IRQn);
TIMER_EnableInt(TIMER1);
TIMER_Start(TIMER1);
}
中断处理
void TMR1_IRQHandler(void)
{
if(TIMER1->INTSTS&1)
{
TIMER1->INTSTS |= 0x0001;
LED_YELLOW ^= 1;
}
}
工作原理:
定时器使用的是周期模式(手册6.9.5.4 Periodic Mode),开启定时器之后CNT寄存器计数,到达CMP的值之后将中断标志位TIF设置位1 ,使能中断之后,发生中断,CNT值变为0,继续向上计时如此回环
中断检测是TIF中断后清除中断标志,后操作LED.
中断时间(ms)计算:(CMP+1)/TMR_CLK(96Mhz) / (预分频值+1) *1000
本例:(49999+1)/96000000/(191+1)1000= 50000/5000001000 = 100ms
从示波器可以看的本例中断中期199.73MS 频率5.0068HZ 符合计算结果的。
![1.jpg](//file.elecfans.com/web2/M00/6F/D3/pYYBAGNFIV-AeBc0AAGz5yPrB9w551.jpg)
原作者:wenkit
|