STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收相关的知识,希望对你有一定的参考价值。

STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收


📓DMA参数介绍

  • 🎉DMA传输方式
  • 🌿传输方向; 外设到内存;内存到外设;内存到内存; 外设到外设
  • 🌿DMA_Mode_Normal,正常模式,

🍁当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次

  • 🌿DMA_Mode_Circular ,循环传输模式

🍁当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式.

  • 🌿Data Width :DMA内存地址自增,每次增加一个Byte(字节)

⛳注意事项

  • 🚩本例程的串口1中断服务函数不是由STM32CubeMX自动配置生成的,而是定义在main.c文件中,默认是勾选上的,如果没有取消勾选,生成代码后,会与stm32f1xx_it.c中生成相关的中断服务函数会与main.c中的USART1_IRQHandler函数重复冲突,导致编译报错。

🌼主程序main.c代码完善

  • 📜在main.c中添加下面的代码
#define UART_RX_LEN 1024           // 一次最大接收的数据量
uint8_t UART_RX_BUF[UART_RX_LEN];  // DMA数据接收缓存
__IO uint16_t UART_RX_STA = 0;     // 第15bit表示一帧数据接收完成,第14~0位表示接收到的数据量

void USART1_IRQHandler(void)
//串口中断函数
	if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)  // 空闲中断标记被置位
	
	    __HAL_UART_CLEAR_IDLEFLAG(&huart1);  // 清除中断标记
	    HAL_UART_DMAStop(&huart1);           // 停止DMA接收
	    UART_RX_STA = UART_RX_LEN - __HAL_DMA_GET_COUNTER(huart1.hdmarx);  // 总数据量减去未接收到的数据量为已经接收到的数据量
	    UART_RX_BUF[UART_RX_STA] = 0;  // 添加结束符
	    UART_RX_STA |= 0X8000;         // 标记接收结束
	    HAL_UART_Receive_DMA(&huart1, UART_RX_BUF, UART_RX_LEN);  // 重新启动DMA接收
	

  • 🔖在while(1)中添加下面的代码:
		if(UART_RX_STA & 0X8000)

	HAL_UART_Transmit(&huart1, UART_RX_BUF, UART_RX_STA & 0X7FFF, 100);    // 将接收到的数据发送回去
	UART_RX_STA = 0;  // 清除标记

 printf("STM32F103CET6");
	HAL_Delay(1000);
  

📝printf重定向相关代码

  • 📑在usart.c文件中添加下面的代码,并在target设置中勾选Use Micro Lib选项,,并在调用printf函数的地方包含stdio.h头文件。
#include <stdio.h>
int fputc(int ch,FILE *f)

    uint32_t temp = ch;
 
    HAL_UART_Transmit(&huart1,(uint8_t *)&temp,1,0xFFFF);        //huart1是串口的句柄
    HAL_Delay(2);
 
    return ch;

📚工程源码

链接:https://pan.baidu.com/s/1O1CnA0eMttLLXWZPpUWJEQ 
提取码:ud7l

以上是关于STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103VET6基于STM32CubeMX创建EXTI外部中断工程

STM32F103VET6基于STM32CubeMX RTC时钟秒更新中断使用示例

STM32F103VET6基于STM32CubeMX 配置非DMA方式获取内部温度

STM32F103VET6基于STM32CubeMX 配置硬件I2C驱动ssd1306 OLED屏幕

STM32F103VET6基于STM32CubeMX RTC时钟使用示例

STM32F103VET6基于STM32CubeMX 配置DMA方式获取内部温度