【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

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

posted @ 2021-07-22 16:57  骤雨重山  阅读(867)  评论(0编辑  收藏  举报