在线时间1328 小时
UID3124330
注册时间2015-11-26
NXP金币3320
TA的每日心情 | 开心 2019-3-5 08:47 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
金牌会员
 
- 积分
- 9100
- 最后登录
- 2025-9-11
|
阅读芯片手册的时候,发现MRT也挺有意思。翻其他LPC MCU手册的时候,也有这个功能,看起来像标配。正好测试一下。 MRT(Multi-Rate Timer)具有多个计时器通道,每个通道可以独立配置和运行,允许系统在不同的时间基准上执行多个定时任务。有时候项目中还是需要几个不同时间的定时器,当然普定也能实现,有了MRT会更方便一点。
从数据手册上看,LPC865的MRT共有4个独立通道。按照说明每个通道是相互独立的,它们在硬件上是隔离的,因此它们不会相互影响。每个通道都有自己的计时器和计数寄存器。你只需要配置和使用各个通道,它们就会独立地工作。
这次测试时基于官方SDK的Demo,官方比较simple,现进行修改为两通道,目的是使用其中两个通道做不同的定时,翻转不同的LED,观察测试效果。
使用的LED为板卡上的两个,如图1所示:
图1
其中一个修改为200ms翻转一次,一个修改为500ms翻转一次,使用通道0和通道1.部分修改代码如下:
- if (USEC_TO_COUNT(500000U, mrt_clock) > MRT_CHANNEL_INTVAL_IVALUE_MASK)
- {
- mrtDividerValue5 = 0;
- mrtEnableCount5 = true;
- while (USEC_TO_COUNT((500000U >> (++mrtDividerValue5)), mrt_clock) > MRT_CHANNEL_INTVAL_IVALUE_MASK)
- {
- }
- MRT_StartTimer(MRT0, kMRT_Channel_1, USEC_TO_COUNT((500000U >> mrtDividerValue5), mrt_clock));
- }
- else
- {
- MRT_StartTimer(MRT0, kMRT_Channel_1, USEC_TO_COUNT(500000U, mrt_clock));
- }
复制代码
因为不同的通道中断标志位不一样,在IRQ函数中增加一下两个通道的中断标志位判断,原SDK没写这部分,修改完就没问题了。中断处理如下:
- if (MRT_GetStatusFlags(MRT0, kMRT_Channel_1) & kMRT_TimerInterruptFlag)
- {
- MRT_ClearStatusFlags(MRT0, kMRT_Channel_1, kMRT_TimerInterruptFlag);
- mrtCountValue5++;
- if (mrtCountValue5 == (1 << mrtDividerValue5))
- {
- mrtIsrFlag5 = true;
- }
- }
复制代码
开始debug,看一下效果,如图2所示:
图2
这样就能够理解MRT的基本使用了。
|
|