STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收,解决第一笔数据无法收发问题
目的:
为了能使UART通讯不受长度和回车等字符限制,同时也记录下自己的实施过程,方便以后查阅.
使用工具:
-
STM32CubeMX 6.01 生成代码
-
编译工具可以使用IAR或KEIL,依照个人习惯,本文使用KEIL 5
DFU代码生成:
STM32CubeMX部分:
-
打开STM32CubeMX
-
选择"ACCESS TO MCU SELECTOR""
-
MCU选择"STM32F103VCTx"
-
System Core配置
RCC选择,
如下图,High Speed Clock(HSE)选择Crystal,其他默认即可
SYS配置,
如果用HAL库不进行SWD或JTAG配置,单片机只能进行下载一次程序,要进行第二次或更多次程序下载,需要按复位键(如果你的单片机有复位按键的话),或者用镊子夹住复位线路上的电容使其短路,点击Keil下载,再松开镊子,我们选择使用Serial Wire.
-
USART1配置
模式选择异步模式,其他参数默认
TX和RX的DMA都打开
开启USART1的中断
-
Clock配置
通常Clock会自动按照前边选择的功能自动分配,如果没有自动分配,可以按照以下进行配置:
(1) 外部晶振选择8MHz
(2) RTC晶振选择内部40kHz
(3) USB必须要腰围48MHz,如果不是可以微调前方的选项.
(4) HCLK可以选择与USB相同,或者更高也可以.
-
Project Manager设定
Project设定,
填写Project Name和存储位置,IDE选择MDK-ARM, 修改Linker Setting的Heap Size 为0x1000.
Keil 代码修改:
Main.c
作如下修改:
- 添加宏定义
//UART Define
#define UART1_RX_BUFFER_SIZE 128
#define UART1_TX_BUFFER_SIZE 128
#define USB_RX_BUFFER_SIZE 63
uint8_t g_USART1_RX_Buffer[UART1_RX_BUFFER_SIZE];
volatile uint8_t g_USART1_RX_Buffer_Size = 0;
volatile uint8_t g_USART1_RX_Received_Flg=0;
uint8_t g_USART1_DMA_RX_Buffer[UART1_RX_BUFFER_SIZE]