01-RT1060(Quad Timer)同时触发4路通道

发布时间:2026/8/16 14:35:02
01-RT1060(Quad Timer)同时触发4路通道 RT1060-Quad Timer外设的使用概要RT1062中有4路TMRQuad Timer每个TMR有4个计数器可以实现4路定时中端功能。TMR的功能非常强大这里我们只实现同时触发4路通道定时触发不同的通道中断。初始化TRM定时器void tmr_init(void) { qtmr_config_t t_qtmrConfig; //定义TMR 定时器初始化结构体 uint32_t t_TMR_Timer 1000; //定义测试时间 1000us QTMR_GetDefaultConfig(t_qtmrConfig); //获取默认配置 t_qtmrConfig.debugMode kQTMR_RunNormalInDebug; //DEBUG下 计数器模式选择 t_qtmrConfig.enableExternalForce false; //使能外部 t_qtmrConfig.faultFilterCount 0; //故障过滤器计数 t_qtmrConfig.faultFilterPeriod 0; //滤波周期 t_qtmrConfig.primarySource kQTMR_ClockDivide_128; //时钟分频系数 t_qtmrConfig.secondarySource kQTMR_Counter0InputPin; //指定辅助计数源 QTMR_Init(TMR1, kQTMR_Channel_0, t_qtmrConfig); //初始化通道 QTMR_Init(TMR1, kQTMR_Channel_1, t_qtmrConfig); QTMR_Init(TMR1, kQTMR_Channel_2, t_qtmrConfig); QTMR_Init(TMR1, kQTMR_Channel_3, t_qtmrConfig); /*设置自动重装载值*/ clock_hz CLOCK_GetFreq(kCLOCK_IpgClk); QTMR_SetTimerPeriod(TMR1, kQTMR_Channel_0, USEC_TO_COUNT(TMR_TIMIER, (CLOCK_GetFreq(kCLOCK_IpgClk) / 128))); QTMR_SetTimerPeriod(TMR1, kQTMR_Channel_1, USEC_TO_COUNT(TMR_TIMIER*2, (CLOCK_GetFreq(kCLOCK_IpgClk) / 128))); QTMR_SetTimerPeriod(TMR1, kQTMR_Channel_2, USEC_TO_COUNT(TMR_TIMIER*4, (CLOCK_GetFreq(kCLOCK_IpgClk) / 128))); QTMR_SetTimerPeriod(TMR1, kQTMR_Channel_3, USEC_TO_COUNT(TMR_TIMIER*8, (CLOCK_GetFreq(kCLOCK_IpgClk) / 128))); /*使能比较中断*/ QTMR_EnableInterrupts(TMR1, kQTMR_Channel_0, kQTMR_CompareInterruptEnable); QTMR_EnableInterrupts(TMR1, kQTMR_Channel_1, kQTMR_CompareInterruptEnable); QTMR_EnableInterrupts(TMR1, kQTMR_Channel_2, kQTMR_CompareInterruptEnable); QTMR_EnableInterrupts(TMR1, kQTMR_Channel_3, kQTMR_CompareInterruptEnable); /*使能中断*/ EnableIRQ(TMR1_IRQn); /*开启定时器计数*/ QTMR_StartTimer(TMR1, kQTMR_Channel_0, kQTMR_PriSrcRiseEdge); QTMR_StartTimer(TMR1, kQTMR_Channel_1, kQTMR_PriSrcRiseEdge); QTMR_StartTimer(TMR1, kQTMR_Channel_2, kQTMR_PriSrcRiseEdge); QTMR_StartTimer(TMR1, kQTMR_Channel_3, kQTMR_PriSrcRiseEdge); }注1.设置自动重装载值出的128配合预分配kQTMR_ClockDivide_128使用也可以根据自己的需求设定相应分频系数2.USEC_TO_COUNT是计算微妙us的宏入口参数为定时时间定义的时钟频率TRM定时中断/*TMR定时器中断服务函数*/ uint32_t qter_irt_flag 0; volatile uint32_t qtmrIsrFlag_1 0; volatile uint32_t qtmrIsrFlag_2 0; volatile uint32_t qtmrIsrFlag_3 0; volatile uint32_t qtmrIsrFlag_4 0; void TMR1_IRQHandler(void) { qter_irt_flag QTMR_GetStatus(TMR1, kQTMR_Channel_0) kQTMR_CompareFlag; //获取中断标志 if (qter_irt_flag) { QTMR_ClearStatusFlags(TMR1, kQTMR_Channel_0, kQTMR_CompareFlag); //清除中断标志位 qtmrIsrFlag_1; //中断计数 } qter_irt_flag QTMR_GetStatus(TMR1, kQTMR_Channel_1) kQTMR_CompareFlag; //获取中断标志 if (qter_irt_flag) { QTMR_ClearStatusFlags(TMR1, kQTMR_Channel_1, kQTMR_CompareFlag); //清除中断标志位 qtmrIsrFlag_2; //中断计数 } qter_irt_flag QTMR_GetStatus(TMR1, kQTMR_Channel_2) kQTMR_CompareFlag; //获取中断标志 if (qter_irt_flag) { QTMR_ClearStatusFlags(TMR1, kQTMR_Channel_2, kQTMR_CompareFlag); //清除中断标志位 qtmrIsrFlag_3; //中断计数 } qter_irt_flag QTMR_GetStatus(TMR1, kQTMR_Channel_3) kQTMR_CompareFlag; //获取中断标志 if (qter_irt_flag) { QTMR_ClearStatusFlags(TMR1, kQTMR_Channel_3, kQTMR_CompareFlag); //清除中断标志位 qtmrIsrFlag_4; //中断计数 } SDK_ISR_EXIT_BARRIER; } //中断计数 } SDK_ISR_EXIT_BARRIER; }