本帖最后由 muyichuan2012 于 2020-8-31 09:11 编辑
调试F413定时器遇到问题,程序只开了溢出中断,最开始每次溢出产生两次中断。
后来在中断函数退出前加 __DSB()指令可以恢复正常,或者在清中断标志后插入10条NOP指令也可以。
错误现象虽然消失,但问题的根源不清楚。 是CPU有BUG还是原本就是这样,这个解决办法是否可靠。
代码:
#define APP_TIM TMR4
#define app_timer_isr TMR4_GLOBAL_IRQHandler
#define APP_TIM_IRQn TMR4_GLOBAL_IRQn
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] app timer init
* @param None
* @retval None
*/
void app_timer_init(char pos)
{
RCC_ClockType RCC_Clocks;
RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_TMR4, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1PERIPH_TMR4, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1PERIPH_TMR4, DISABLE);
APP_TIM->CTRL1 = TMR_CTRL1_UVERS;
APP_TIM->CTRL2 = 0;
APP_TIM->DIE = TMR_DIE_UEVIE;
APP_TIM->STS = 0;
/*1ms 中断*/
RCC_GetClocksFreq(&RCC_Clocks);
APP_TIM->DIV = RCC_Clocks.APB1CLK_Freq / 1000000-1;
APP_TIM->AR = 2000-1;
NVIC_SetPriority(APP_TIM_IRQn, 0x01);
NVIC_ClearPendingIRQ(APP_TIM_IRQn);
NVIC_EnableIRQ(APP_TIM_IRQn);
APP_TIM->CTRL1 |= TMR_CTRL1_CNTEN;
}
OBJ_INIT_APP_EXPORT(app_timer_init);
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] app timer isr
* @param None
* @retval None
*/
void app_timer_isr(void)
{
if(APP_TIM->STS & TMR_STS_UEVIF)
{
sys_st.u_tick++;
}
else
{
sys_st.app_timer_err++;
}
APP_TIM->STS = 0;
__DSB();
}
|