STM32 HAL库的中断接收HAL_UART_Receive_IT 怎么用

因为HAL库都封装好了,如果想用中断接收,不能在中断里直接读RXD寄存器。

第一步,初始化时使能串口中断

MX_USART2_UART_Init();
     if (HAL_UART_Init(&huart2) != HAL_OK)
            HAL_UART_MspInit(huart);
            		......
    				HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    				HAL_NVIC_EnableIRQ(USART2_IRQn);

第二步,重点,在主循环前开启接收中断HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);

这是接收1个字节到rx_buf中

int main(void)
{
  /* Configure the system clock */
  HAL_Init();
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();

  HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);
 
  while (1)
  {
    ;
  }
}

第三步,串口启动接收的过程 原理------这一步不需要用户处理

HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1)---->
调用UART_Start_Receive_IT(huart, pData, Size)---->
配置函数指针 huart->RxISR = UART_RxISR_8BIT;
使能接收中断SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
--------------------------------------------------------------------------------------
当收到数据发生中断的时候会执行这个函数
void USART2_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart2);
}

HAL_UART_IRQHandler(&huart2);---huart->RxISR(huart);通过指针调用UART_RxISR_8BIT;---->判断接收完成后,关中断,调用HAL_UART_RxCpltCallback(huart);

第四、启动新的接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
      rx_cnt++;
      //把接收到的数据从rx_buf复制到buffer里,然后启动新的一次接收
      HAL_UART_Receive_IT(huart, (uint8_t *)rx_buf,1);
}

版权声明:本文为CSDN博主「D.luffy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liangbin414/article/details/121289379

因为HAL库都封装好了,如果想用中断接收,不能在中断里直接读RXD寄存器。

第一步,初始化时使能串口中断

MX_USART2_UART_Init();
     if (HAL_UART_Init(&huart2) != HAL_OK)
            HAL_UART_MspInit(huart);
            		......
    				HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    				HAL_NVIC_EnableIRQ(USART2_IRQn);

第二步,重点,在主循环前开启接收中断HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);

这是接收1个字节到rx_buf中

int main(void)
{
  /* Configure the system clock */
  HAL_Init();
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();

  HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);
 
  while (1)
  {
    ;
  }
}

第三步,串口启动接收的过程 原理------这一步不需要用户处理

HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1)---->
调用UART_Start_Receive_IT(huart, pData, Size)---->
配置函数指针 huart->RxISR = UART_RxISR_8BIT;
使能接收中断SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
--------------------------------------------------------------------------------------
当收到数据发生中断的时候会执行这个函数
void USART2_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart2);
}

HAL_UART_IRQHandler(&huart2);---huart->RxISR(huart);通过指针调用UART_RxISR_8BIT;---->判断接收完成后,关中断,调用HAL_UART_RxCpltCallback(huart);

第四、启动新的接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
      rx_cnt++;
      //把接收到的数据从rx_buf复制到buffer里,然后启动新的一次接收
      HAL_UART_Receive_IT(huart, (uint8_t *)rx_buf,1);
}

版权声明:本文为CSDN博主「D.luffy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liangbin414/article/details/121289379

生成海报
点赞 0

D.luffy

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

笔记3:STM32F103与STM32F030的区别

在替换芯片时,发现STM32f103与STM32F030的区别: 内部结构 下图是103的IO口内部结构: 下图是030的IO口内部结构图: 通过上面的比较可以看出: 两个

2、STM32点亮LED灯

一、寄存器操作 1、新建工程,新建一个目录存放以后所有的工程stmproject,在这个目录下新建文件夹寄存器点灯,文件名为LED。 接下来选择所用的软件包,之前安装软件时安装的&#xff

【零基础学STM32】CubeMx+HAL配置按键点灯实验

主要内容 上一篇文章中采用了EXTI中断的方式控制小灯的亮灭。其实也可以不采用中断,直接使用GPIO配置即可实现按键对应小灯的状态,且效果几乎相同。同样本次例程试验采用正点原子阿波罗STM32F429IGT6开发板

STM32 HAL库学习笔记-(SPI驱动ADXL345)

STM32 HAL库学习笔记-(SPI驱动ADXL345) 最近有项目需要需要用到ADXL345,网上转了一圈都是IIC驱动为主,正好最近在学习HAL库,所以本文将使用SPI驱动ADXL345 CU