一知半解学CubeMX——UART:空闲中断结合DMA实现不定长数据收发
2017-11-22 17:34
666 查看
一知半解学习环境:
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收发的套路,需要的时候套用即可;
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收发的套路,需要的时候套用即可;
相关文章推荐
- STM32CubeMX 串口空闲中断加DMA 实现不定长度收发数据
- STM32F207运用串口空闲中断+DMA接收不定长数据
- STM32空闲中断+DMA解决接收不定长数据问题
- STM32空闲中断+DMA解决接收不定长数据问题
- 串口1配合DMA接收不定长数据(空闲中断+DMA接收)
- STM32F207运用串口空闲中断+DMA接收不定长数据
- 一知半解学CubeMX——UART:Printf实现
- Stm32——串口空闲中断+DMA接收不定长数据
- 一知半解学CubeMX——TIM:定时中断实现LED闪烁
- STM32F207运用串口空闲中断+DMA接收不定长数据
- STM32利用串口空闲中断在串口DMA配置下接收变长数据
- STM32F4 UART1 DMA发送和接收不定长度数据
- dsp控制DM9000实现802.3数据收发第三篇,调试过程程序第三版;采用外部引脚中断方式获取中断,优化掉帧现象
- stm32串口DMA收发,可以接收不定长数据,格式化输出。
- STM32使用DMA加串口空闲中断接收数据
- 【已实现】stm32 SPI DMA中断收发
- cube生成STM32F103ZET串口中断的使用方法;DMA加串口空闲中断的使用方法
- SYD8801 UART使用说明【uart轮发数据代码实现】【 uart中断发数据代码实现】【RFSleep函数对串口的影响】【中断中调用串口打印函数有可能会造成死机】
- STM32 串口 空闲中断接收不定长数据
- STM32—无需中断来实现使用DMA接收串口数据