stm32hal库串口DMA收发
Cubemx配置串口DMA数据传输
摘要:串口功能十分简单,配置串口DMA传输主要是为了熟悉DMA配置过程,所以编写了一个简单的串口回显功能(自收自发),利用串口空闲中断,+DMA来进行数据传输。
Cubemx配置
- 配置串口
- 配置DMA
- 打开串口中断
- 记得配置时钟
根据个人使用MCU配置就好
个人代码编写
在生成代码之后我们打开工程,使能串口空闲中断,添加串口中断的处理函数,添加串口DMA发送数据函数。
- 在while循环前添加使能串口空闲中断和开启DMA中断接收
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能串口空闲中断
HAL_UART_Receive_DMA(&huart1, RX_Buff,RX_LEN);//开启DMA接收,不加此局自启后接收一次空字符
- 添加个人的串口中断处理函数
void MX_RXCallBack(UART_HandleTypeDef *huart)
{
uint8_t tmp_flag,temp;
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
if((tmp_flag != RESET))
{
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
HAL_UART_Receive_DMA(&huart1,RX_Buff,RX_LEN);
RX_Count= RX_LEN - temp;
RX_flag = 1;
}
}
此函数要在生成的Src目录下的stm32xxxx_it.c中的void USART1_IRQHandler(void)函数中调用
3. main函数中对接收到的数据进行处理(通过串口发送出去)
if (RX_flag)
{
if(HAL_UART_Transmit(&huart1,RX_Buff,RX_Count,1000)!=HAL_OK){
printf("error\r\n");
}
RX_flag=0;
memset(RX_Buff,0,RX_Count);
}r
上面程序添加至主函数中的while循环内
总计
在调试过程中遇到DMA传输数据不通的现象,同过调试发现cubemx在生成串口DMA代码时候,将串口1的DMA初始化的时钟放在串口DMA初始化的后面,导致DMA串口初始化失败,在调试串口3的时候代码又是正确的,所以不可盲目使用cubemx工具。一旦有错误,比较难调试。导致我找了一天。
持之以恒的学习,方是进步的唯一途径!