STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收相关的知识,希望对你有一定的参考价值。
STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收
-
✨
STM32CubeMX
工程配置过程演示:
📓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屏幕