(7)STM32使用HAL庫實現RS485通訊(全雙工串口)


一、硬件

如下圖所示,485芯片鏈接到單片機的USART2上,但是默認的USART2並不是在PD5和PD6上,這里是需要重映射的。另外PG4作為485收發的控制(在485協議中,RE、DE同時為高電平那么芯片使能發送,如果同時為低電平那么芯片使能接收)

二、軟件設計

1.軟件功能

默認485芯片是接收功能,每隔1s發送一個0x88,如果接收到0x55那么返回0x01,如果接收到的數據不是0x55就返回0x00。

2.CubeMX操作

(1)時鍾

(2)調試

注意:這里一定要選擇上,否則會導致Jlink無法下載,Cube這里默認是不使能的,那么調試引腳就會被配置成普通IO。

(3)usart2

(4)重映射

(5)配置485芯片使能引腳-PG4

(6)配置時鍾,這個要根據具體的芯片與晶振來配置

(7)配置串口,這里默認就行

(8)配置串口中斷

(9)配置485收發使能引腳PG4

默認是接收功能,所以是低電平

(10)點擊生成工程

3.軟件設計

(1)根據功能,系統要每一秒發送一個0x88出去,那么就在main的while(1)循環中填寫如下代碼:

復制代碼
  while (1) { //將485芯片設置為發送模式  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET); TxByte = 0x88; //發送數據 HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF); //將485芯片設置為接收模式  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET); HAL_Delay(1000); }
復制代碼

 

(2)如果接收到0x55那么返回0x01,如果接收到的數據不是0x55就返回0x00。

這里用到中斷,寫一個中斷回調函數如下:

復制代碼
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (0x55 == RxByte) { TxByte = 0x01; HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET); HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF); } else { TxByte = 0x02; HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET); HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF); } HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);   //重新使能串口接收中斷 HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, 1); }
復制代碼

 

(3)默認是要使能485接收的,那么串口接收中斷默認應該也是開啟的,所以在main函數的while(1)之前添加上下面的代碼:

HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, 1);

 

 

齊活,下載驗證:


免責聲明!

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



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