本帖最后由 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();
- }
|