1. 配置CubeMX工程USART
首先配置時鐘,配置同學習筆記二。
配置USART1:選擇序列槽模式為Asynchronous(異步):
配置波特率,位元組位數,校驗方式和停止位:
配置DMA:點選Add添加序列槽1接收中斷
配置中斷優先級:
在NVIC頁面勾選序列槽1中斷
點選系統檢視中的NVIC
在NVIC設定區中選中USART1中斷,在紅圈中設定優先級,注意不要與其他外設的優先級産生沖突
設定完成後生成代碼,打開工程
2. 添加使用者代碼
在USART.C及USART.h中分别加入要用到的外部變量
USART.c中:
/* USER CODE BEGIN 0 */
volatile uint8_t Usart1_RX_LEN;//序列槽1接收到的資料長度
volatile uint8_t Usart1_RecvEndFlag; //序列槽1接收完成标志位
uint8_t USART1_Tx_Buffer[USART1_TxBuffer_Size]; //序列槽1資料發送緩存數組
uint8_t USART1_Rx_Buffer[USART1_RxBuffer_Size]; //序列槽1資料接收緩存數組
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
void USART_Init(void)
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//開啟USART1空閑中斷
HAL_UART_Receive_DMA(&huart1,USART1_Rx_Buffer,USART1_RxBuffer_Size);//USART1使用DMA傳輸
}
void USART1_Recv(void)//序列槽1接收處理
{
if(Usart1_RecvEndFlag == 1)
{
printf1("Usart1_RX_LEN=%d\r\n",Usart1_RX_LEN);//列印接收長度
HAL_UART_Transmit(&huart1,USART1_Rx_Buffer, sizeof(USART1_Rx_Buffer),USART1_TxTimeOut);//接收資料列印出來
printf1("\r\n");//換行
for(uint8_t i=0;i<sizeof(USART1_Rx_Buffer);i++)
{
USART1_Rx_Buffer[i]=0;//清接收緩存
}
Usart1_RX_LEN=0;//清除計數
Usart1_RecvEndFlag=0;//清除接收結束标志位
HAL_UART_Receive_DMA(&huart1,USART1_Rx_Buffer,USART1_RxBuffer_Size);//重新打開DMA接收
}
}
/* USER CODE END 1 */
USART.h中:
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN Private defines */
#define printf1(...) HAL_UART_Transmit(&huart1,(uint8_t *)USART1_Tx_Buffer,sprintf((char*)USART1_Tx_Buffer,__VA_ARGS__),0xffff)//序列槽1列印函數
#define USART1_RxBuffer_Size 255
#define USART1_TxBuffer_Size 255
#define USART1_TxTimeOut 200
/* USER CODE END Private defines */
/* USER CODE BEGIN Prototypes */
extern volatile uint8_t Usart1_RX_LEN;//序列槽1接收到的資料長度
extern volatile uint8_t Usart1_RecvEndFlag; //序列槽1接收完成标志位
extern uint8_t USART1_Tx_Buffer[USART1_TxBuffer_Size]; //序列槽1資料發送緩存數組
extern uint8_t USART1_Rx_Buffer[USART1_RxBuffer_Size]; //序列槽1資料接收緩存數組
void USART_Init(void);
void USART1_Recv(void);
/* USER CODE END Prototypes */
在stm32f1xx_it.c中插入代碼:
/* USER CODE BEGIN Includes */
#include "usart.h"
/* USER CODE END Includes */
在
USART1_IRQHandler
中加入空閑中斷處理:
/* USER CODE BEGIN USART1_IRQn 0 */
uint32_t tmp_flag = 0;
uint32_t temp;
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
if((tmp_flag != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
temp = huart1.Instance->SR;
temp = huart1.Instance->DR;
HAL_UART_DMAStop(&huart1);
temp = hdma_usart1_rx.Instance->CNDTR;
Usart1_RX_LEN = USART1_RxBuffer_Size - temp;
Usart1_RecvEndFlag= 1;
}
/* USER CODE END USART1_IRQn 0 */
在main.c中初始化部分插入開啟USART1空閑中斷和DMA傳輸:
/* USER CODE BEGIN 2 */
USART_Init();
/* USER CODE END 2 */
3. 測試代碼
在主循環中加入:
/* USER CODE END WHILE */
USART1_Recv();
/* USER CODE BEGIN 3 */
測試效果:
4.遇到的問題:
一開始調試代碼都寫好了怎麼調試都不通!!!!!!!!
最後發現是口插錯了==
以後貼片器件還是畫在Bottom層吧==
參考文章:
列印函數:https://www.cnblogs.com/hjf-log/p/12522796.html
其他函數:https://blog.csdn.net/qq_33728095/article/details/97778147