最近因為調試ESP8266,發現一直USART1(ESP8266用的是UASRT1)中斷函數一直進入死循環問題,網上也找了很多資料,可是都是說ORE沒有清除的原因導致的,嘗試了還是不行,反復檢查了我的代碼N次,一點頭緒都沒有,想了下,我就使用USART2純粹的做一個實驗,驗證一下到底是哪里出了問題?
我用的芯片是STM32F030R8,在USART2中斷函數增加如下紅色代碼,就會進入中斷死循環,放在任何地方都不行,如果要在中斷發送字符給USART(在中斷函數中發送字符給USART,中斷就會進入死循環),最好是按照藍色字體的方式!
USART2中斷服務函數
void USART2_IRQHandler(void) { uint8_t temp; //printf("coming in USART2\r\n"); //USART2_Send_Byte(USART2,65); //printf("coming in USART2_Interrupt i---- %d\n",i++); if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET) { //printf("coming in USART2_Interrupt z---- %d\n",z++); // temp = USART_ReceiveData(USART2); //USART_SendData(USART2, USART_ReceiveData(USART2)); // USART2_Send_Byte(USART2,65); } //USART2_Send_Byte(USART2,65); }
編輯的時候可以看到着色,編輯完就沒有了,按照C語言的風格來了,這里截個編輯時的着色圖片
printf,USART2_Send_Byte封裝函數如下
void USART2_Send_Byte(USART_TypeDef* pUSARTX, uint8_t Data) { pUSARTX->TDR = (Data & (uint16_t)0x01FF); while(USART_GetFlagStatus(pUSARTX, USART_FLAG_TXE) == RESET); } int fputc(int data, FILE * file) { USART_SendData(USART2, (uint8_t)data); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); return data; } int fgetc(FILE * file) { while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART2); }