STM32H743VIT6 KEIL RS485DMA发送和接受
一、RS485的介绍
全双工模式:
全双工模式下,RS485通信使用四条线路,两条用于发送数据,另外两条用于接收数据。这种模式下,通信双方可以同时进行数据的发送和接收,从而提高了通信效率。
半双工模式:
半双工模式下,RS485通常使用两条线路,一条用于发送数据,另一条用于接收数据。在这种模式下,通信设备在同一时间内只能进行数据的发送或接收,不能同时进行。半双工模式的优势在于它可以通过时间分配的方式实现设备间的交替通信,适用于周期性数据交互或需要避免数据冲突的应用场景。
二、STM32CubeMX
1.软件版本
STM32CubeMX version 6.14.1 库版本STM32Cube_FW_H7_V1.11.2
2.CORTEX_M7配置

3.RCC配置

3.USART2配置
参数配置

中断配置

DMA配置

引脚配置

4.时钟配置

5.工程管理

三、代码修改
#define MAXRECVMUN 160
#define MAXSENDNUM 160ALIGN_32BYTES (uint8_t uart2SendBuff[MAXSENDNUM]) __attribute__((section(".ARM.__at_0x24000000")));
ALIGN_32BYTES (uint8_t uart2RecvBuff[MAXRECVMUN]) __attribute__((section(".ARM.__at_0x240000A0")));uint8_t uart2GetRecvBuff[MAXRECVMUN]={0};uint8_t sendflag=1;
uint32_t recvtestcount2=0;//发送完成函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef* huart)
{if (huart->Instance == USART2) { HAL_UARTEx_ReceiveToIdle_DMA(&huart2,uart2RecvBuff,MAXRECVMUN);}
}
//接受函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t size)
{if (huart->Instance == USART2) {recvtestcount2++;sendflag=1;HAL_UART_DMAStop(&huart2);memcpy(uart2GetRecvBuff,uart2RecvBuff,size);__HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT); }
}
//发送函数
void DMA_USART2_Send (uint8_t *data, uint16_t size)
{if(sendflag!=1) return;sendflag=0;if (size<=0||size>MAXSENDNUM||data==NULL)return;while (huart2.gState!=HAL_UART_STATE_READY);memcpy((void*)&uart2SendBuff, data, size);HAL_UART_Transmit_DMA(&huart2, (uint8_t*)uart2SendBuff, size);
}四、测试结果

