js網(wǎng)站計數(shù)器代碼網(wǎng)絡(luò)推廣
STM32CubeMx的配置
????????此博客僅僅作為記錄,這個像是有bug一樣,有時候好使,有時候不好,所以趁現(xiàn)在好使趕緊記錄一下,很多地方用到串口接收數(shù)據(jù),DMA又是一種非常好的接收方式,可以節(jié)約CPU的時間,提高利用率,首先是在CubeMX的配置,這個很簡單,首先配置成異步收發(fā)。這樣配置可以接收不固定長度的字符
然后配置DMA接收和發(fā)送:
Keil的配置
其余配置都一樣,在編譯工程里面也需要配置一些東西(Keil工程)
首先就是必須勾選,要不然打印不了數(shù)據(jù),使用DMA發(fā)送數(shù)據(jù)的時候,可能printf函數(shù)就不好使了,這個需要注意:
代碼配置
接下來就是添加代碼
先在usart.c文件定義幾個變量
uint8_t?? ??? ??Rx_Flag = 0;
uint16_t?? ??? ?Rx_Len = 0;
uint8_t?? ??? ??Rx_Buf[Rx_Max] = {0};?? ?
在usart.h文件里面聲名一下,防止其他地方調(diào)用會報錯
#define Rx_Max 1024
extern uint8_t Rx_Flag; //接收數(shù)據(jù)標志位
extern uint16_t Rx_Len; //DMA接收數(shù)據(jù)的長度
extern uint8_t Rx_Buf[Rx_Max];
先在main函數(shù)里面開啟DMA接收和開啟空閑中斷
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //開啟空閑中斷,當(dāng)時沒有數(shù)據(jù)的時候中斷HAL_UART_Receive_DMA(&huart1, Rx_Buf, Rx_Max);//開啟DMA接收
最后需要在串口中斷函數(shù)stm32f1xx_it.c操作一些東西,首先在此函數(shù)中引用usart.h文件,否則會報錯
uint32_t temp;if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET)) { /*清除狀態(tài)寄存器和串口數(shù)據(jù)寄存器*/__HAL_UART_CLEAR_IDLEFLAG(&huart1);/*失能DMA接收*/HAL_UART_DMAStop(&huart1); /*讀取接收長度,總大小-剩余大小*/temp = huart1.hdmarx->Instance->CNDTR; Rx_Len = Rx_Max - temp; /*接收標志位置1*/Rx_Flag=1; /*使能接收DMA接收*/HAL_UART_Receive_DMA(&huart1,Rx_Buf,Rx_Max); }
在while(1)中的代碼操作,就是判斷標志位,然后把接收到的數(shù)據(jù)打印出來
if(Rx_Flag == 1){Rx_Flag = 0;HAL_UART_Transmit_DMA(&huart1,Rx_Buf,Rx_Len);}