一、硬件
如下圖所示,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);
齊活,下載驗證: