功能:stm32f4采用DMA方式进行不定长串口接收
平台:STM32CubeIDE(STM32CubeMX)
1、新建工程
示例中采用的是stm32f401re,先设置调试接口(默认是关闭的,不设置的话调试一次就不能调试了)
stm32f4采用DMA方式进行不定长串口接收讲解
设置时钟,示例中采用的是无源12M晶振stm32f4采用DMA方式进行不定长串口接收讲解
stm32f4采用DMA方式进行不定长串口接收讲解
设置串口1
stm32f4采用DMA方式进行不定长串口接收讲解
DMA选项,默认就可以
stm32f4采用DMA方式进行不定长串口接收讲解
中断设置,需要打开中断
stm32f4采用DMA方式进行不定长串口接收讲解
新建设置完成了,另外加句,关于工程我个人喜欢这样设置
stm32f4采用DMA方式进行不定长串口接收讲解
2、修改源码
采用接收空闲中断方式,原库文件没有这个中断的代码,我的方法是改源代码,进入这个文件夹
stm32f4采用DMA方式进行不定长串口接收讲解
修改stm32f4xx_hal_usart.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;
}
stm32f4采用DMA方式进行不定长串口接收讲解
在这个文件如下图的位置添加

__weak void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
}
stm32f4采用DMA方式进行不定长串口接收讲解
进入这个文件夹
stm32f4采用DMA方式进行不定长串口接收讲解
修改stm32f4xx_hal_usart.h文件,打开该文件

在下图位置处添加

void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart);stm32f4采用DMA方式进行不定长串口接收讲解
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];
stm32f4采用DMA方式进行不定长串口接收讲解
添加

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));
}
}
stm32f4采用DMA方式进行不定长串口接收讲解
在usart.h文件中,添加

void UART_DMA_Init(void);
void UART_Info(void);
stm32f4采用DMA方式进行不定长串口接收讲解
main.c中添加

#include “usart.h”
stm32f4采用DMA方式进行不定长串口接收讲解
添加
UART_Info();
stm32f4采用DMA方式进行不定长串口接收讲解完成了。
通过串口调试工具,向开发板发送数据,开发板接收什么数据就向串口调试工具发送什么数据。

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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-24
  • 2021-08-02
  • 2021-11-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-04-30
  • 2021-05-26
  • 2021-06-17
  • 2021-12-18
  • 2021-03-27
  • 2022-12-23
  • 2021-06-10
相关资源
相似解决方案