在线时间10 小时
UID3408782
注册时间2019-7-24
NXP金币12
TA的每日心情 | 慵懒 2019-11-1 15:16 |
---|
签到天数: 10 天 连续签到: 1 天 [LV.3]偶尔看看II
注册会员

- 积分
- 177
- 最后登录
- 2020-4-7
|
RT1061的PIT定时器模块有4个独立的通道(ch0,ch1,ch2,ch3),可作为独立的4个定时器来使用。但我在同时使用4个定时器时,发现通道1(ch1)和其他通道一样打开后并不能进入中断。
//中断回调函数
void PIT_LED_HANDLER(void)
{
if(PIT_GetStatusFlags(PIT, kPIT_Chnl_0) == kPIT_TimerFlag)
{
PIT_ClearStatusFlags(PIT, kPIT_Chnl_0, kPIT_TimerFlag);
pitIsrFlag0 = true;
}
if(PIT_GetStatusFlags(PIT, kPIT_Chnl_1) == kPIT_TimerFlag)
{
PIT_ClearStatusFlags(PIT, kPIT_Chnl_1, kPIT_TimerFlag);
pitIsrFlag1 = true;
}
if(PIT_GetStatusFlags(PIT, kPIT_Chnl_2) == kPIT_TimerFlag)
{
PIT_ClearStatusFlags(PIT, kPIT_Chnl_2, kPIT_TimerFlag);
pitIsrFlag2 = true;
}
if(PIT_GetStatusFlags(PIT, kPIT_Chnl_3) == kPIT_TimerFlag)
{
PIT_ClearStatusFlags(PIT, kPIT_Chnl_3, kPIT_TimerFlag);
pitIsrFlag3 = true;
}
}
//定时器的配置是在官方pit的例子中改的,定时器周期为1s
//主函数
int main(void)
{
/* Structure of initialize PIT */
pit_config_t pitConfig;
/* Board pin, clock, debug console init */
BOARD_ConfigMPU();
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
/* Set PERCLK_CLK source to OSC_CLK*/
CLOCK_SetMux(kCLOCK_PerclkMux, 1U);
/* Set PERCLK_CLK divider to 1 */
CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U);
/*
* pitConfig.enableRunInDebug = false;
*/
PIT_GetDefaultConfig(&pitConfig);
/* Init pit module */
PIT_Init(PIT, &pitConfig);
/* Set timer period for channel 0,1,2,3 */
PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));
PIT_SetTimerPeriod(PIT, kPIT_Chnl_1, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));
PIT_SetTimerPeriod(PIT, kPIT_Chnl_2, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));
PIT_SetTimerPeriod(PIT, kPIT_Chnl_3, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));
/* Enable timer interrupts for channel 0,1,2,3 */
PIT_EnableInterrupts(PIT, kPIT_Chnl_0, kPIT_TimerInterruptEnable);
PIT_EnableInterrupts(PIT, kPIT_Chnl_1, kPIT_TimerInterruptEnable);
PIT_EnableInterrupts(PIT, kPIT_Chnl_2, kPIT_TimerInterruptEnable);
PIT_EnableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
/* Enable at the NVIC */
EnableIRQ(PIT_IRQ_ID);
/* Start channel 0,1,2,3 */
PRINTF("\r\nStarting Timer...");
PIT_StartTimer(PIT, kPIT_Chnl_0);
PIT_StartTimer(PIT, kPIT_Chnl_1);
PIT_StartTimer(PIT, kPIT_Chnl_2);
PIT_StartTimer(PIT, kPIT_Chnl_3);
while (true)
{
if (true == pitIsrFlag0)
{
PRINTF("\r\n Channel No.0 interrupt is occurred !");
pitIsrFlag0 = false;
}
if (true == pitIsrFlag1)
{
PRINTF("\r\n Channel No.1 interrupt is occurred !");
pitIsrFlag1 = false;
}
if (true == pitIsrFlag2)
{
PRINTF("\r\n Channel No.2 interrupt is occurred !");
pitIsrFlag2 = false;
}
if (true == pitIsrFlag3)
{
PRINTF("\r\n Channel No.3 interrupt is occurred !");
pitIsrFlag3 = false;
}
}
}
运行后现象如下:
只有通道0、通道2和通道3能顺利计时并进入中断
在中断函数中添加断点后也不能进入通道1。
使用的环境是MCUXpresso IDE(移植在IAR后也是有这个问题)。
在不开启其他通道,只开启通道1时(只对通道1进行配置和开启)也是无法启动进入中断。
不知是否还存在其他原因导致定时器未开启。
|
|