STM32 HAL 库开启串口中断

stm32 HAL 设置串口中断函数 void HAL_UART_MspInit(UART_HandleTypeDef* huart),该函数位于stm32f0xx_hal_msp.c ,该文件存放板级初始化代码。

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    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_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }
  else if(huart->Instance==USART2)
  {
  /* USER CODE BEGIN USART2_MspInit 0 */

  /* USER CODE END USART2_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART2_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART2 GPIO Configuration
    PA14     ------> USART2_TX
    PA15     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART2 interrupt Init */
    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
  /* USER CODE BEGIN USART2_MspInit 1 */

  /* USER CODE END USART2_MspInit 1 */
  }

}

关键点     HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
               HAL_NVIC_EnableIRQ(USART1_IRQn);

                HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
                HAL_NVIC_EnableIRQ(USART2_IRQn);

设置中断优先级 ,和 开启中断 

STM32HAL库是ST官方为STM32系列微控制器提供的硬件抽象层,它简化了对设备驱动的管理,包括串口通信。在使用STM32HAL库编写串口中断收发的代码时,一般有以下几个步骤: 1. **初始化**: 首先,你需要通过`HAL_UART_Init`函数初始化串口,设置波特率、数据位数、停止位和校验模式等配置。 ```c HAL_StatusTypeDef status; status = HAL_UART_Init(UARTx); if (HAL_OK != status) { // 初始化失败处理 } ``` 其中`UARTx`替换为你实际使用的串口实例,如USART1、USART2等。 2. **注册中断**: 接着,启用串口接收和发送中断,并在对应的中断服务函数(ISERVICES)里处理接收到的数据和发送完成的信号。 ```c HAL_NVIC_SetPriority(UARTx_IRQn, YOUR_INTERRUPT_PRIORITY, YOUR_SUBPRIOIRTY); HAL_NVIC_EnableIRQ(UARTx_IRQn); void UARTx_IRQHandler(void) { if (__HAL_UART_GET_IT_SOURCE(UARTx, UART_FLAG_RXNE)) { // 检查是否有数据接收 uint8_t data = __HAL_UART_READ(UARTx, 1); // 读取数据 // 处理接收到的数据... } if (__HAL_UART_GET_IT_SOURCE(UARTx, UART_FLAG_TXE)) { // 发送缓冲区空闲 HAL_UART_Transmit(&huart, &data_to_send, 1, TX_TIMEOUT); // 发送数据 } } ``` 3. **数据传输**: 在主循环中,你可以选择直接往串口发送数据,也可以从串口接收并处理数据。 ```c while (1) { if (some_condition) { // 向串口发送数据 HAL_UART_Transmit(&huart, &tx_buffer, buffer_size, timeout); } // 可能需要从串口接收数据并处理 while (HAL_UART_GetDataCount(&huart) > 0) { // 数据已接收,可以进行后续处理 } } ``` 4. **错误处理**: 别忘了添加适当的错误检查和处理,比如超时、溢出或者其他可能出现的异常情况。 ```c if (HAL_UART_Transmit_IT(&huart, &tx_buffer, buffer_size) != HAL_OK) { // 发送错误处理 } if (HAL_UART_Receive_IT(&huart, &rx_buffer, buffer_size) != HAL_OK) { // 接收错误处理 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值