• 【STM32】简述串口中断流程


    串口中断的实现(函数名参考MX生成代码)

            初始化:

            1、void MX_USART1_UART_Init()

            基于UART_HandleTypeDef huart,对huart的成员进行配置,并将数据传入HAL_UART_Init(UART_HandleTypeDef *huart),完成对串口功能特性的配置

            接下来需要分情况了:是将接受处理写在中断服务函数里还是写在中断Callback里面,若写在Callback里面,我们还需要对HAL_UART_Receive_IT()进行配置,传入参数有&huart,buffer的首指针与buffersize;若写在中断服务函数里则不需要对Receive IT进行配置,相对来说写在中断服务函数里效率会相对高效

            

    UART_HandleTypeDef huart1;
    
    void MX_USART1_UART_Init(void)
    {
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        Error_Handler();
      }
    }

            2、void HAL_UART_MspInit(UART_HandleTypeDef *huart)

            又是一个weak函数,这个函数写在HAL_UART_Init(UART_HandleTypeDef *huart)里面,HAL库通过引出这个API,使得用户可以自行在外部配置硬件资源,此处主要是对GPIO的配置以及中断优先级配置和允许

            以上两个函数需要用户自行编写,或使用CubeMX生成

            

    void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      if(uartHandle->Instance==USART1)
      {
        __HAL_RCC_USART1_CLK_ENABLE();
    
        __HAL_RCC_GPIOA_CLK_ENABLE();
     
        GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(USART1_IRQn);
      }
    }

            中断时:

            1、void USART1_IRQHandler(void)

            这是中断服务函数,假设用户采用直接写在中断服务函数里的方式,那么到此为止了,这时只需要在此函数里写用户对于接收数据的处理(接收值在寄存器里,限于篇幅不赘述),设置标志清零即可,如果用CubeMX,这个服务函数会生成再stm32xxx_it.c里,用户需要自己编写回调

            假设用户采用回调的方式,那么需要在此函数里调用总的Handler:HAL_UART_IRQHandler(),这里面会调用UART_Receive_IT(),在里面会调用HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

            回调:

            HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

            叕是一个weak函数,用户在外部定义这个Callback,写法和另一种方式的写在中断服务函数的内容一样,不过由于是公用的Callback,需要在这里面判断是串口几,done

            续:由于是简述,目前理解还不太深,潦潦草草先写这么多后再补充。。。

  • 相关阅读:
    Linux 虚拟机虚拟网卡问题导致无法连接问题
    使用 Load Balancer,Corosync,Pacemaker 搭建 Linux 高可用集群
    如何在 Linux 虚拟机上扩展根文件系统
    Linux 虚拟机中配置 GNOME + VNC
    在 Linux 中使用 Azure Premium 存储的基本优化指南
    如何为运行的 ARM Linux 启用 LAD2.3 版本的诊断扩展
    如何解决 Linux 虚拟机磁盘设备名不一致的问题
    Java 调用 Rest api 设置经典 Linux 虚拟机的实例启停
    CentOS: 将虚拟机迁移到 Azure (以阿里云为例)
    Linux 虚拟机的计划维护
  • 原文地址:https://www.cnblogs.com/ZYQS/p/15038718.html
Copyright © 2020-2023  润新知