在线时间176 小时
UID3472105
注册时间2018-6-26
NXP金币5009
TA的每日心情 | 开心 2025-1-21 10:02 |
---|
签到天数: 9 天 连续签到: 1 天 [LV.3]偶尔看看II
金牌会员
 
- 积分
- 2950
- 最后登录
- 2025-8-14
|
在上一节中我们实现了循环点灯的操作做,通过在while中延时的方法实现的,这种阻塞式的循环灯的方法基本上也就式用在点灯这样的初级操作这里,这种延时对于系统的实时性非常不好,这一节我们就用定时器的方式实现循环灯操作,通过定时达到要求后执行相应的操作,定时器定时功能有几方面优势,其一就是定时精准,延时咱们看着式精准的实际上差的还是不少的,也是通过不断的调整才得到了一个差不多的延时,而定时器可以实现精准定时;第二个就是定时时间到了后是在终端中处理内容,优先级更高。
接下来我们就实现循环点亮LED(定时器,循环间隔500mms)。
使用配置工具添加外设——LPTMR,并配置为基础定时器功能(10ms):
这里有一个优点就是你可以添加频率单位,也可以直接填写时间,对应的prescaler都会直接生成,更新初始化代码;
中断回调函数可以直接在这里进行举例,复制过去修改就可以了;
可以看到初始化都已经自动生成了:
配置完成,中断开启并配置,定时器启动;
编写定时器中断函数:
- void LPTMR0_IRQHandler(void) {
- LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
- /* Place your code here */
- cnt++;
- if(cnt > 50)
- {
- cnt = 0;
- LED_state++;
- if(LED_state == 99)
- LED_state = 0;
- }
- /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
- Store immediate overlapping exception return operation might vector to incorrect interrupt. */
- #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif
- }
复制代码 修改主函数:
- uint16_t cnt = 0;
- uint8_t LED_state = 0;
- uint8_t LED_Oldstate = 1;
- while (1)
- {
- if(LED_state != LED_Oldstate)
- {
- LED_Oldstate = LED_state;
- LED_BLUE_OFF();
- LED_GREEN_OFF();
- LED_RED_OFF();
- switch(LED_Oldstate%3)
- {
- case 0:
- LED_RED_ON();
- break;
- case 1:
- LED_GREEN_ON();
- break;
- case 2:
- LED_BLUE_ON();
- break;
- default:
- break;
- }
- }
- }
复制代码 效果如下:
|
|