![]() |
發布時間: 2022-5-4 16:47
正文摘要:不知道有沒有人遇到過,最近學習系統之類的自己熟悉的單片機RAM不夠,用STM的但是之前都是用標準庫的,HAL庫非常不習慣,這個調了一天也不知道是哪里出現問題了,發送過快的壞還會出現卡死的情況,這個程序就是接受 ... |
這個問題解決了,就是因為hal庫這個回調函數處理時間太長了HAL_UART_IRQHandler(&huart5);我波特率為115200,兩個數據間隔的時間有可能處理不完這個函數,導致會丟失一個數據,解決方法就是自己寫一個中斷函數,這樣就不會漏數據或者觸發ORE中斷了 void UART5_IRQHandler(void) { /* USER CODE BEGIN UART5_IRQn 0 */ if(((UART5->SR) & USART_SR_RXNE) != RESET) //判斷讀取不為空標志 { Rxd[Count] = (unsigned char)(UART5->DR & 0x000000ff); //讀取對應數據 UART5->DR = (unsigned long)Rxd[Count]; //發送數據 __HAL_UART_ENABLE_IT(&huart5, UART_IT_TXE); //打開發送空中斷 Count++; if(Count >= 35) { Count = 0; } UART5->SR &= ~UART_FLAG_RXNE; //清除讀取不為空標志 } if(((UART5->SR) & USART_SR_TXE) != RESET) //判斷發送空標志 { UART5->SR &= ~USART_SR_TXE; //清除標志 __HAL_UART_DISABLE_IT(&huart5, UART_IT_TXE); //關閉發送中斷 } /* USER CODE END UART5_IRQn 0 */ // HAL_UART_IRQHandler(&huart5); /* USER CODE BEGIN UART5_IRQn 1 */ /* USER CODE END UART5_IRQn 1 */ } |
問題解決了,HAL_UART_IRQHandler(&huart5);hal庫這個函數處理的時間太長了,我波特率115200一次性發多個數據后可能會在兩個數據間隔時間內處理不完,導致丟失一個數據,解決方法,自己寫一個中斷函數不要使用回調了,void UART5_IRQHandler(void) { /* USER CODE BEGIN UART5_IRQn 0 */ if(((UART5->SR) & USART_SR_RXNE) != RESET) //判斷讀取不為空標志 { Rxd[Count] = (unsigned char)(UART5->DR & 0x000000ff); //讀取對應數據 UART5->DR = (unsigned long)Rxd[Count]; //發送數據 __HAL_UART_ENABLE_IT(&huart5, UART_IT_TXE); //打開發送空中斷 Count++; if(Count >= 35) { Count = 0; } UART5->SR &= ~UART_FLAG_RXNE; //清除讀取不為空標志 } if(((UART5->SR) & USART_SR_TXE) != RESET) //判斷發送空標志 { UART5->SR &= ~USART_SR_TXE; //清除標志 __HAL_UART_DISABLE_IT(&huart5, UART_IT_TXE); //關閉發送中斷 } /* USER CODE END UART5_IRQn 0 */ // HAL_UART_IRQHandler(&huart5); /* USER CODE BEGIN UART5_IRQn 1 */ /* USER CODE END UART5_IRQn 1 */ } |
munuc_w 發表于 2022-5-5 08:33 大哥你這個說對了,自己單獨寫一個就沒問題,HAL_UART_IRQHandler(&huart5);hal庫這個函數處理的太繁瑣了,我168M主頻的都有幾率在下一個數據來前處理不完 |
好像找打原因了,HAL_UART_Transmit(&huart5,&RxData,1,2);HAL_UART_Receive_IT(&huart5,&RxData,1);這兩個不能都&RxData,因為發送那邊沒有把發送的值先讀出來,而是*p直接賦值到DR寄存器,如果這時候還沒賦給DR前就觸發了下一個讀取中斷的話就會導致調過了一個數據,但是新的問題又出現了,改好后確實不漏了,但是如果發送的間隔比較短會出現串口卡死的情況![]() ![]() ![]() ![]() ![]() |
HAL的接收函數太繁瑣,可以自己寫一個接收函數,中斷調用,回調函數是在中斷中調用的,中斷中不易處理數據,中斷函數月精簡越好。 |
發表于 2022-5-5 08:08 我這個就是用CubeMx的DMA沒怎么用過,主要是也沒理由說串口中斷就不行啊 |
使用CubeMX配置 用DMA試試 |
頂一下 |