您的位置:首页 > 其它

一知半解学CubeMX——UART:空闲中断结合DMA实现不定长数据收发

2017-11-22 17:34 603 查看
一知半解学习环境:
    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收发的套路,需要的时候套用即可;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: