【STM32CubeMx你不知道的那些事】第三章:STM32CubeMx串口配置(中斷接收)

在嵌入式環境中,串口通信是必不可少的通信方式,這一章我們主要是講解一下HAL庫怎麼應用串口外設做收發功能。

一、準備工作

1、使用我們第一章配置好工程文件。如圖

2、明確原理圖上面所需要的串口,這裏我們用串口1做實驗。

二、具體操作

1、Pinout菜單欄下,串口的選擇與配置。配置如圖

外設選擇USART1,Mode選擇Asynchronous(異步通信)。這樣右邊會顯示配置的兩個串口腳PA、PA10。

2、在Configuration菜單欄下,點擊connectivity下的USART1彈出配置界面,配置如圖

1)首先在Parameter Settings 下配置 Baud Rate(波特率)我們這裏設置115200(可根據自己需要而定)。

2)在NVIC Setting界面我們要把串口全局中斷使能,Enable選項打鉤。

3、生成工程

點擊Project菜單欄選擇Generate code,工程生成完畢。

好了現在基本的串口配置已經完成了,但是光光這裏配置是不夠的在工程代碼裏面還需要添加一些函數才能使用。

4、打開MDK工程,工程裏面配置

由於HAL庫裏面串口配置比較繁瑣,串口在接收的時候只能一個字節一個字節的接收,而且接受完成一次就需要重新使能接收中斷,這裏是比較麻煩的。我提供了以下解決辦法,這裏需要修改兩處代碼。

1)串口初始化.C裏面添加

這裏是在串口1初始化的情況下加了接受中斷使能和打開接受中斷。

代碼如下:

void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
     /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
    USART1->CR1 |= ((uint16_t)0x2000);//USART Enable
}

2)串口中斷函數裏面修改

這裏串口接受中斷本來是調用HAL庫自己的回調函數,這裏十分浪費時間。所以修改成我們經常使用的方式。

代碼如下:

void USART1_IRQHandler(void)
{
	
	unsigned char temp;

	if(__HAL_UART_GET_IT_SOURCE(&huart1,UART_IT_RXNE) != RESET)
	{
          temp = __HAL_UART_FLUSH_DRREGISTER(&huart1);
          HAL_UART_Transmit(&huart1,&temp, 1, 100); 
	}
	
	HAL_UART_IRQHandler(&huart1);	
	
}

HAL_UART_Transmit(&huart1,&temp, 1, 100); 這裏我是把接收到的數據返回發送了出去。如果需要其他處理則是在這裏調

用解析回調函數。

這裏就實現了串口中斷方式的接收功能。

發送功能可直接調用HAL庫函數 HAL_UART_Transmit(&huart1,arr, 10, 100);

這裏huart1代表選用的串口這裏是USART1arr代表傳入的數據首地址10代表的要發出的數據個數10個字節100代表超時時

100ms

如有什麼不懂聯繫加QQ羣:1063618791歡迎大家學習交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章