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