STM32 硬件UART接收超時檢測設置


STM32 硬件UART接收超時檢測設置

-----------------本文作者“智御電子”,期待與電子愛好者交流學習。----------------

應用場景

在uart應用中有時候需要進行雙工通信,主機需要對從機的數據進行接收超時檢測,例如modbus協議,主機在接收從機數據在3.5個字節時間后認為數據包接收完畢。那在這種情況下,一般的做法是設置一個定時器,在每接收到一個字節時清零定時器重新計數,直到定時器超過3.5個字節時間后觸發中斷即默認數據包接收完畢。

以上的定時器設置的超時判斷是需要軟件介入的。這里STM32的有些串口是提供硬件超時檢測功能。這樣就省去如上的步驟。

設置步驟

本實驗是利用CubeMx生成的工程進行驗證的。

  • 首先,利用cubemx配置usart1(注意:並不是每個STM32芯片的串口都具有硬件超時檢測功能的)。值得注意的是在cubeMX中並沒有設置硬件超時的選項,所以這里只是生產可用的usart工程。

  • 生成工程后,我們去數據手冊,其中有這樣的描述。

    所以本文添加一個使能超時檢測的函數,如下所示

void Uart_RxOvertimeEnable(void)
{
	/*使能接收超時功能*/
	SET_BIT(huart1.Instance->CR2,USART_CR2_RTOEN);
	/*使能超時接收中斷*/
	//SET_BIT(huart1.Instance->CR1,USART_CR1_RTOIE);
	/*向RTOR寄存器填入需要超時的長度,單位為一個波特時長,3.5個字節*11波特長度 = 39  */
	WRITE_REG(huart1.Instance->RTOR,39);  
}
  • 接着在main函數中添加這個函數,並且寫了一個小小的測試實例。

int main(void)
{

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /*使能超時檢測*/
  Uart_RxOvertimeEnable();
  /* Infinite loop */
  /*采用中斷接收數據,模擬接收*/
  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 100);
  while (1)
  {	
	//數據接收后,一直等待超時
   while(READ_BIT(huart1.Instance->ISR,USART_ISR_RTOF))
	{ 
		/*清除rtof標志*/
		 SET_BIT(huart1.Instance->ICR,USART_ICR_RTOCF);
		/*將接收的數據發送出去測試一下*/
	   HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, 100);
	   HAL_Delay(1000);
	}		
  }
}

  • 最后通過串口調試助手通過上位機發送數據(this is test!)給單片機,單片機能返回數據(后面的***是因為打印了空字節,忽略),則證明有效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM