一知半解学CubeMX——UART:空闲中断结合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收发的套路,需要的时候套用即可;
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值