服装网站建设定制,成都地区网站建设,百度联盟是什么,蚌埠市建设学校网站STM32CubeMx的配置 此博客仅仅作为记录#xff0c;这个像是有bug一样#xff0c;有时候好使#xff0c;有时候不好#xff0c;所以趁现在好使赶紧记录一下#xff0c;很多地方用到串口接收数据#xff0c;DMA又是一种非常好的接收方式#xff0c;可以节约CPU的时间…STM32CubeMx的配置 此博客仅仅作为记录这个像是有bug一样有时候好使有时候不好所以趁现在好使赶紧记录一下很多地方用到串口接收数据DMA又是一种非常好的接收方式可以节约CPU的时间提高利用率首先是在CubeMX的配置这个很简单首先配置成异步收发。这样配置可以接收不固定长度的字符 然后配置DMA接收和发送 Keil的配置
其余配置都一样在编译工程里面也需要配置一些东西Keil工程
首先就是必须勾选要不然打印不了数据使用DMA发送数据的时候可能printf函数就不好使了这个需要注意 代码配置
接下来就是添加代码
先在usart.c文件定义几个变量
uint8_t Rx_Flag 0;
uint16_t Rx_Len 0;
uint8_t Rx_Buf[Rx_Max] {0}; 在usart.h文件里面声名一下防止其他地方调用会报错
#define Rx_Max 1024
extern uint8_t Rx_Flag; //接收数据标志位
extern uint16_t Rx_Len; //DMA接收数据的长度
extern uint8_t Rx_Buf[Rx_Max]; 先在main函数里面开启DMA接收和开启空闲中断 __HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE); //开启空闲中断当时没有数据的时候中断HAL_UART_Receive_DMA(huart1, Rx_Buf, Rx_Max);//开启DMA接收 最后需要在串口中断函数stm32f1xx_it.c操作一些东西首先在此函数中引用usart.h文件否则会报错 uint32_t temp;if((__HAL_UART_GET_FLAG(huart1,UART_FLAG_IDLE) ! RESET)) { /*清除状态寄存器和串口数据寄存器*/__HAL_UART_CLEAR_IDLEFLAG(huart1);/*失能DMA接收*/HAL_UART_DMAStop(huart1); /*读取接收长度总大小-剩余大小*/temp huart1.hdmarx-Instance-CNDTR; Rx_Len Rx_Max - temp; /*接收标志位置1*/Rx_Flag1; /*使能接收DMA接收*/HAL_UART_Receive_DMA(huart1,Rx_Buf,Rx_Max); } 在while1中的代码操作就是判断标志位然后把接收到的数据打印出来 if(Rx_Flag 1){Rx_Flag 0;HAL_UART_Transmit_DMA(huart1,Rx_Buf,Rx_Len);} 结论接收不固定长度的字符串