在线时间168 小时
UID3914144
注册时间2023-4-15
NXP金币3291
TA的每日心情 | 开心 5 小时前 |
---|
签到天数: 528 天 连续签到: 23 天 [LV.9]以坛为家II
金牌会员
 
- 积分
- 2317
- 最后登录
- 2025-7-27
|
请叫我点灯小菜鸟吧。前面用延时来实现了对RGB灯的控制,今天我继续点灯。
MCX的定时器是最基础的外设之一,定时器有着许许多的功能,其实让他点灯,简单是天大的浪费,但是点灯是最好的检验手段。如果你用单片机会一百种点灯,那你的就是大师了,如果你有1000+的点灯方式,估计你就是点灯大神!
经过学习定时器例程,(例程为:SDK_2_13_1_MCX-N9XX-BRK\boards\mcxn9xxbrk\driver_examples\lptmr\cm33_core0)
我总结了一下,定时器的配置与开启为以下几步:
1、先定义一下,我们需要定时器多少时间溢出,以us为单位,在fsl_lptmr.c中有这样的换算:
- /*! Macro to convert a microsecond period to raw count value 宏定义将微秒转换为计数器的预装值ARR*/
- #define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U)
复制代码 例程中用宏定义了#define LPTMR_USEC_COUNT 1000000
即1秒定期器溢出。
2、配置定时器,分为四步,第一是将定义一个定时器结构体,lptmr_config_t lptmrConfig;
二是将时器结构体恢复初值即:LPTMR_GetDefaultConfig(&lptmrConfig); 三是将恢复黙认值的数据写入到定时器寄存器中:LPTMR_Init(DEMO_LPTMR_BASE, &lptmrConfig); 四是配置定时器溢出值:LPTMR_SetTimerPeriod(DEMO_LPTMR_BASE, USEC_TO_COUNT(LPTMR_USEC_COUNT, LPTMR_SOURCE_CLOCK));
3、使能定时器中断,中断中好实现对LED灯的操作。
/* Enable timer interrupt */
LPTMR_EnableInterrupts(DEMO_LPTMR_BASE, kLPTMR_TimerInterruptEnable);
/* Enable at the NVIC */
EnableIRQ(DEMO_LPTMR_IRQn);
4、开启定时器:
/* Start counting */
LPTMR_StartTimer(DEMO_LPTMR_BASE);
定时器中断函数,在汇编中已经实现了弱函数 .weak LPTMR0_IRQHandler,我们需要对他进行重写。
- void LPTMR_LED_HANDLER(void) //开开头,使用宏定义进行了转换即:#define LPTMR_LED_HANDLER LPTMR0_IRQHandler
- {
- LPTMR_ClearStatusFlags(DEMO_LPTMR_BASE, kLPTMR_TimerCompareFlag);
- lptmrCounter++;
- LED_TOGGLE();
- /*
- * Workaround for TWR-KV58: because write buffer is enabled, adding
- * memory barrier instructions to make sure clearing interrupt flag completed
- * before go out ISR
- */
- __DSB();
- __ISB();
- }
复制代码 在中断函数中,首先清除中断,对计数值进行递加,然后进行LED的翻转,最后DSB ISB是NXP的特有操作吧,先不解释。
在主函数中获取最新的计数据,然后打印出来。
烧写示例后,实现了对LED的1秒钟翻转一次:
|
|