国民技术N32G430开发笔记(4)- - 串口2中断+IDLE接收不定长数据

串口2中断+IDLE接收不定长数据

1、根据手册可查PA6 PA7可复用usart2功能

在这里插入图片描述
2、复用功能配置如图
在这里插入图片描述

3、串口初始化代码:

#define USARTz              USART2
#define USARTz_CLK          RCC_APB1_PERIPH_USART2
#define USARTz_GPIO         GPIOA
#define USARTz_GPIO_CLK     RCC_AHB_PERIPH_GPIOA
#define USARTz_RxPin        GPIO_PIN_7
#define USARTz_TxPin        GPIO_PIN_6
#define USARTz_Rx_GPIO_AF   GPIO_AF11_USART2
#define USARTz_Tx_GPIO_AF   GPIO_AF11_USART2
#define USARTz_APBxClkCmd   RCC_APB1_Peripheral_Clock_Enable

void usart_init(void)
{
    GPIO_InitType GPIO_InitStructure;
    USART_InitType USART_InitStructure;
    NVIC_InitType NVIC_InitStructure;

    RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA);
    /* Enable USARTy and USARTz Clock */
    RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_USART2);

    /* Enable the USARTy Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Initializes(&NVIC_InitStructure);

    /* Initialize GPIO_InitStructure */
    GPIO_Structure_Initialize(&GPIO_InitStructure);
    
    /* Configure USARTz Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.Pin            = USARTz_TxPin;
    GPIO_InitStructure.GPIO_Alternate = USARTz_Tx_GPIO_AF;
    GPIO_Peripheral_Initialize(USARTz_GPIO, &GPIO_InitStructure);  

    /* Configure USARTz Rx as alternate function push-pull */
    GPIO_InitStructure.Pin            = USARTz_RxPin;
    GPIO_InitStructure.GPIO_Alternate = USARTz_Rx_GPIO_AF;
    GPIO_Peripheral_Initialize(USARTz_GPIO, &GPIO_InitStructure);    

    /* USARTy and USARTz configuration ------------------------------------------------------*/
    USART_InitStructure.BaudRate            = 115200;
    USART_InitStructure.WordLength          = USART_WL_8B;
    USART_InitStructure.StopBits            = USART_STPB_1;
    USART_InitStructure.Parity              = USART_PE_NO;
    USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
    USART_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;

    /* Configure USARTy and USARTz */
    USART_Initializes(USARTz, &USART_InitStructure);

    /* Enable USARTz Receive and Transmit interrupts */
    USART_Interrput_Enable(USARTz, USART_INT_RXDNE);
    USART_Interrput_Enable(USARTz, USART_INT_IDLEF);

    //USART_Interrput_Enable(USARTz, USART_INT_TXDE);

    /* Enable the USARTy and USARTz */
    USART_Enable(USARTz);
  
}

4、中断处理函数

我们将电脑端发送过来的数据 返还回电脑

/**
*\*\name    USARTz_IRQHandler.
*\*\fun     This function handles USARTz global interrupt request.
*\*\param   none
*\*\return  none 
**/
static uint8_t RxBuffer1[128];//接收数据缓存区
static uint32_t RxCounter1 = 0;//接收数据长度

void USART2_IRQHandler(void)
{
    if (USART_Interrupt_Status_Get(USART2, USART_INT_RXDNE) != RESET)
    {
        /* 读取数据并清除标志 */
        RxBuffer1[RxCounter1++] = USART_Data_Receive(USART2);
    }
    else if (USART_Interrupt_Status_Get(USART2, USART_INT_IDLEF) != RESET)
    {
        /* 清除IDLE标志*/
        USART_Interrupt_Status_Clear(USART2,USART_INT_IDLEF);
        Usart_SendString((char *)RxBuffer1,RxCounter1);
        RxCounter1 = 0;
    }
}

5、main.cpp调用usart_init后,make烧录进板卡,电脑端串口助手发送数据现象如图:
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
针对STM32G4HAL库串口空闲中断接收不定数据的问题,可以按照以下步骤进行解决: 1. 开启串口空闲中断,即在初始化串口时,将USART_CR1_REG中的USART_CR1_IDLEIE位设置为1。 2. 在串口空闲中断中,通过读取USART_ISR_REG寄存器中的位USART_ISR_RXNE和USART_ISR_IDLE来判断是接收数据还是空闲中断。 3. 如果是接收数据,则读取USART_RDR_REG寄存器中的数据,并将其存储到缓冲区中。 4. 如果是空闲中断,则通过计算接收到的数据度来确定数据度,并将其存储到缓冲区中。 5. 在数据度达到预定度时,可以通过回调函数或者其他方式来通知数据接收已经完成。 下面是一个示例代码: ```c uint8_t rx_buffer[100]; uint8_t rx_counter = 0; uint8_t rx_length = 0; uint8_t rx_flag = 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USARTx) { if(rx_flag == 0) { //接收数据 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == RESET)) { rx_buffer[rx_counter++] = (uint8_t)(huart->Instance->RDR & 0x00FF); } //空闲中断 else if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET) { rx_length = rx_counter; rx_counter = 0; rx_flag = 1; } } } } ``` 在上面的代码中,当接收数据时,将数据存储到缓冲区中,并将计数器rx_counter加1。当空闲中断发生时,计算接收到的数据度,并将其存储到rx_length中。在接收完成后,将rx_flag设置为1,表示数据接收已经完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值