STM32應用:使用STM32 USART接收不特定長度資料的設計

關鍵字 :STM32USARTMODBUS
一般利用USART接收不特定長度的資料時,傳統作法不外乎:
  1. 檢查USART的RXNE旗標是否有新資料。
  2. 開啟USART的RXNE中斷,當接收到新資料時跳到ISR。
第一種作法不但會浪費CPU運算資源,且若未將USART data register的資料讀取前又進來新資料時,會產生Overrun錯誤。
第二種作法則在有大量資料輸入時,會花費一定的CPU資源在ISR開銷上。

本文則介紹利用STM USART提拱的硬體功能來減少CPU資源開銷。其中用到的USART硬體功能,不是每個型號的每個USART皆有支援,使用前須先查閱手冊確認,以STM32F042K6T6為例,在datasheet中有列表如下




需要用到Reveiver timeout interrupt和Modbus communication這兩項功能,所以只能利用USART1來實作,以下是實作方式。

利用STM32CubeMX軟體,打開USART1,綁定DMA和USART1連結,並且開啟USART1中斷







產生程式碼後,在main.h中的USER CODE Includes區塊中加入USART Low Level Library header檔
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stm32f0xx_ll_usart.h"
/* USER CODE END Includes */

在main.c中的USER CODE區塊中,加入程式碼如下
LL_USART_EnableIT_RXNE(USART1);
LL_USART_EnableIT_RTO(USART1);

LL_USART_SetRxTimeout(USART1, 115);
第一行是打開USART RXNE中斷,第二行是打開USART RTO中斷,第三行是設定多少個bit time未收到新資料後發出RTO中斷,以115200bps為例,115個bit time約等於1ms。


在stm32f0xx_it.c中,找到USART1_IRQHandler,在/* USER CODE BEGIN USART1*/加入程式碼如下紅字部分
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if (LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1))
{
uart_rx_buffer[0] = LL_USART_ReceiveData8(USART1);
HAL_UART_Receive_DMA(&huart1, &uart_rx_buffer[1], (UART_BUFFER_SIZE - 1));
LL_USART_DisableIT_RXNE(USART1);
LL_USART_EnableRxTimeout(USART1);
}
else if ((LL_USART_IsActiveFlag_RTO(USART1)) && LL_USART_IsEnabledIT_RTO(USART1))
{
LL_USART_ClearFlag_RTO(USART1);
LL_USART_DisableRxTimeout(USART1);
HAL_UART_DMAStop(&huart1);
USER_PARSE_CODE();
LL_USART_EnableIT_RXNE(USART1);
}
else
{
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
}
/* USER CODE END USART1_IRQn 1 */
}


if (LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1))
這個區塊收取第一筆資料,啟動DMA傳輸和開啟RTO偵測。

else if ((LL_USART_IsActiveFlag_RTO(USART1)) && LL_USART_IsEnabledIT_RTO(USART1))
當全部資料收取完時會進入這個區塊,這邊將RTO旗標清除、關閉RTO偵測、停止DMA傳輸、重新開啟RXNE中斷,並且這邊處理USART收取的資料。

若只用RXNE處理USART收取的資料,當進來資料有多少筆時,就會產生多少的中斷。利用RXNE和RTO結合的方式處理收取的資料時,不管輸入的資料量多少,只會產生兩次中斷。

技術文檔

類型標題檔案
操作手冊設定產生工具用的專案檔
操作手冊User Manual

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論

will

will

2020年10月26日
很实用的博文,收藏