问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32F207串口进不去接收中断

GD32

GD32F207串口进不去接收中断

刘十九2022-07-14
本帖最后由 刘十九 于 2022-7-14 14:20 编辑

以下附上源码,求各位大佬解答

void Usart_Init(void)
{
    rcu_periph_clock_enable(RCU_AF);  // 使能 AF 时钟
    rcu_periph_clock_enable(RCU_GPIOD);  // 使能 GPIO 时钟
    rcu_periph_clock_enable(RCU_USART1);  // 使能串口时钟

    gpio_pin_remap_config(GPIO_USART1_REMAP,ENABLE);  // 重映射 USART1 管脚

    // 引脚初始化:推挽输出, 速度50MHz, PD5 TX
    gpio_init(USART1_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, USART1_TX);

    // 引脚初始化:浮空输入, 速度50MHz, PD6, RX
    gpio_init(USART1_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART1_RX);

    // 串口配置
    usart_deinit(USART1);  // 复用 USART1
    nvic_irq_enable(USART1_IRQn, 0, 0);  // 配置中断优先级
    usart_baudrate_set(USART1, 9600);  // 波特率设置
    usart_word_length_set(USART1, USART_WL_8BIT);  // 8位数据位
    usart_stop_bit_set(USART1, USART_STB_1BIT);  // 1位停止位
    usart_parity_config(USART1, USART_PM_NONE);  // 无校验位
    // usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);  // 配置RTS硬件控制流
    // usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);  // 配置CTS硬件控制流
    usart_receive_config(USART1, USART_RECEIVE_ENABLE);  // 配置 USART1 接收
    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);  // 配置 USART1 发送
    usart_enable(USART1);  // 使能 USART1

    usart_interrupt_enable(USART1, USART_INT_RBNE);  // 使能 读缓冲区非空中断和溢出错误中断
}

/*
函数:串口中断函数
*/
void USART1_IRQHandler(void)
{
    uint8_t res;

    // 判断接收中断是否产生
    if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE))
    {
        usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);  // 清除标志位

        res = (uint8_t)usart_data_receive(USART1);  // 读取数据

        // 判断是否溢出
        if(ReadCount < USART_READ_BUF_SIZE)
        {
            ReadBuf[ReadCount++ = res;
        }
        timeout_flag = 160;
    }

    // 判断发送中断是否产生
    if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE))
    {
        static uint8_t i = 0;  // 发送数据下标

        usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TBE);  // 清除标志位

        if(datalen > 0)
        {
            usart_data_transmit(USART1, SendBuf[i++);
            datalen--;
        }
        else if(datalen == 0)
        {
            usart_interrupt_disable(USART1, USART_INT_TBE);
            i = 0;
        }
    }
}
回答 +关注 1
3105人浏览 1人回答问题 分享 举报
1 个回答

您需要登录后才可以回复 登录 | 注册