stm32f4采用DMA方式进行不定长串口接收讲解

功能:stm32f4采用DMA方式进行不定长串口接收
平台:STM32CubeIDE(STM32CubeMX)
1、新建工程
示例中采用的是stm32f401re,先设置调试接口(默认是关闭的,不设置的话调试一次就不能调试了)
在这里插入图片描述
设置时钟,示例中采用的是无源12M晶振在这里插入图片描述
在这里插入图片描述
设置串口1
在这里插入图片描述
DMA选项,默认就可以
在这里插入图片描述
中断设置,需要打开中断
在这里插入图片描述
新建设置完成了,另外加句,关于工程我个人喜欢这样设置
在这里插入图片描述
2、修改源码
采用接收空闲中断方式,原库文件没有这个中断的代码,我的方法是改源代码,进入这个文件夹
在这里插入图片描述
修改stm32f4xx_hal_uart.c文件,打开该文件
找到HAL_UART_IRQHandler函数,在下图位置处添加

/* UART in mode Idle -------------------------------------------------*/
if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
HAL_UART_IdleCpltCallback(huart);
return;
}
在这里插入图片描述
在这个文件如下图的位置添加

__weak void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
}
在这里插入图片描述
进入这个文件夹
在这里插入图片描述
修改stm32f4xx_hal_uart.h文件,打开该文件

在下图位置处添加

void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart);在这里插入图片描述
3、工程代码

回到工程文件,修改usart.c文件,添加
#include <string.h>
#define RXBUF_1_SIZE 255
uint8_t rx1_len=0;
uint8_t recv1_end_flag=0;
uint8_t rx1_buffer[RXBUF_1_SIZE];
在这里插入图片描述
添加

void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_DMAStop(huart);
if(huart->Instance == USART1)
{
rx1_len = RXBUF_1_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
recv1_end_flag = 1;
}
}
void UART_DMA_Init(void)
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer));
}
void UART_Info(void)
{
if(recv1_end_flag ==1)
{
HAL_UART_Transmit(&huart1,rx1_buffer, rx1_len,500);//接收数据打印出来
memset(rx1_buffer,0,sizeof(rx1_buffer));
rx1_len=0;
recv1_end_flag=0;
HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer));
}
}
在这里插入图片描述
在usart.h文件中,添加

void UART_DMA_Init(void);
void UART_Info(void);
在这里插入图片描述
main.c中添加

#include “usart.h”
在这里插入图片描述
添加
UART_Info();
在这里插入图片描述完成了。
通过串口调试工具,向开发板发送数据,开发板接收什么数据就向串口调试工具发送什么数据。

这个工程是我临时建立的,有什么问题留言吧,我尽量解决。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值