一知半解学习环境:
1、CubeMX 4.23.0
2、uVision 5.14.2
3、
MCU 启明 STM32F407 开发板(高配版) V3.1
一知半解学习目标:
1、掌握CubeMX下RCC以及SYS的相关配置;
2、掌握CubeMX下串口相关配置;
3、掌握
空闲中断结合DMA实现串口不定长数据收发
;
一知半解实现过程:
1、配置系统调试接口及时基时钟源;
2、配置外部高速时钟源;
3、根据原理图配置对应串口(USART1);
4、配置时钟树;
5、配置串口参数
、开启串口中断、
开启串口接收与发送DMA;
6、生成工程(工程生成配置请参考“一知半解学CubeMX—创建工程”),并添加程序;
首先,打开工程,在usart.c文件的最上方定义相关变量并在usart.h文件中声明为全局可用;
/* 串口接收缓冲区 */
uint8_t rx_buffer[100] = {0};
/* 串口接收完成标记 */
uint8_t recv_end_flag = 0;
/* 串口接收数据长度 */
uint16_t rx_len = 0;
/* DMA接收长度宏定义 */
#define BUFFER_SIZE 100
extern uint8_t rx_buffer[];
extern uint8_t recv_end_flag;
extern uint16_t rx_len;
其次,在stm32f4xx_it.c中修改串口中断处理函数如下;
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint32_t tmp_flag = 0;
uint32_t temp;
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
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);
/* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */
temp = hdma_usart1_rx.Instance->NDTR;
rx_len = BUFFER_SIZE - temp;
recv_end_flag = 1;
}
/* USER CODE END USART1_IRQn 1 */
}
最后,在main.c函数中添加相关程序(串口空闲中断以及DMA接收开启、接收数据后的处理工作)
/*开启串口空闲中断*/
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/*启动串口DMA接收*/
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
if(recv_end_flag ==1){
HAL_UART_Transmit_DMA(&huart1,rx_buffer,rx_len);
rx_len=0;
recv_end_flag=0;
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
}
7、串口调试助手发送与接收验证;
一知半解
套路
回顾:
1、掌握CubeMX配置的常规套路,如SYS、RCC以及时钟树的配置等;
2、掌握CubeMX串口的参数配置;
3、牢固掌握串口空闲中断结合DMA收发的套路,需要的时候套用即可;