stm32 uart dma crc
时间: 2025-06-22 07:48:32 浏览: 12
### STM32 UART DMA CRC 实现细节
在STM32微控制器中,利用DMA引擎可以显著提高UART通信效率,尤其是在处理大量数据时。通过配置DMA来自动管理UART的数据传输过程,CPU仅需初始化传输动作,后续操作交由DMA引擎执行直至完成并通过中断通知CPU[^1]。
对于CRC校验功能,在发送端可以通过软件计算待发数据包的CRC值,并将其附加到数据之后一并发送;接收端则同样先接收到整个数据包(含CRC),再进行CRC验证以确认数据完整性。为了实现这一目标,通常会采用如下方法:
#### 配置DMA用于UART传输
首先设置好USART外设参数,包括波特率、字长等基本信息。接着开启DMA模式,指定缓冲区地址及大小,使能相应的DMA通道及其对应的中断源。
```c
// 初始化串口结构体
static 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();
}
}
// 设置DMA流/通道
void Configure_DMA_for_UART(void)
{
hdma_usart1_tx.Instance = DMAMUX_Channel0; // 假定使用DMAMUX Channel0连接至USART1 TX
hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
hdma_usart1_tx.Init.Direction = MEMORY_TO_PERIPH;
hdma_usart1_tx.Init.PeriphInc = DISABLE;
hdma_usart1_tx.Init.MemInc = ENABLE;
hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart1_tx.Init.Mode = DMA_NORMAL;
hdma_usart1_tx.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&huart1, hdmatx, hdma_usart1_tx);
}
```
#### 计算与验证CRC
当准备发送数据前,应预先计算出该批数据的CRC码,并附带于消息结尾一同发出。而在接收侧,则是在获取全部预期长度的消息后立即实施CRC检验工作。
```c
#include "stm32f4xx_hal.h"
uint16_t Calculate_CRC(uint8_t *pData, uint16_t DataLen)
{
uint16_t crc = 0xFFFF;
while(DataLen--){
crc ^= (*pData++);
for(int i=0 ;i<8;i++){
if(crc & 0x0001){
crc >>= 1;
crc ^= 0xA001;
}else{
crc >>= 1;
}
}
}
return crc;
}
bool Verify_CRC(uint8_t* pDataWithCrc,uint16_t TotalLen)
{
uint16_t received_crc = ((uint16_t)pDataWithCrc[TotalLen-2]<<8)|pDataWithCrc[TotalLen-1];
uint16_t calculated_crc = Calculate_CRC(pDataWithCrc, TotalLen-2);
return (received_crc == calculated_crc)?true:false;
}
```
上述代码片段展示了如何基于STM32硬件平台构建起一套完整的UART-DMA-CRC解决方案框架。实际应用过程中可能还需要针对具体应用场景做出适当调整优化。
阅读全文
相关推荐


















