打印
[研电赛技术支持]

GD32F303串口调试记录

[复制链接]
188|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Haizangwang|  楼主 | 2025-6-9 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 串口初始化

void BSP_USART0_Init(void)
{
        /* enable GPIO clock */
        rcu_periph_clock_enable(RCU_GPIOA);

        /* enable USART clock */
        rcu_periph_clock_enable(RCU_USART0);
       
        /* connect port to USARTx_Tx */
        gpio_init(USART0_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, USART0_TX_PIN);

        /* connect port to USARTx_Rx */
        gpio_init(USART0_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART0_RX_PIN);

        /* configure USART */
        usart_deinit(USART0);
        usart_baudrate_set(USART0, 9600);
        usart_word_length_set(USART0, USART_WL_8BIT);
        usart_stop_bit_set(USART0, USART_STB_1BIT);
        usart_parity_config(USART0, USART_PM_NONE);
        usart_receive_config(USART0, USART_RECEIVE_ENABLE);
        usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
        usart_enable(USART0);
       
        usart_receiver_timeout_enable(USART0);
        usart_receiver_timeout_threshold_config(USART0, 300);
        nvic_irq_enable(USART0_IRQn, 0, 0);
        usart_interrupt_enable(USART0, USART_INT_RBNE);//接收中断       
        usart_interrupt_enable(USART0, USART_INT_RT);//超时中断

}



2. 串口中断

void USART0_IRQHandler(void)
{
        if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET) //开始接受数据
        {
                /* receive data */
                usart0msg.recv_buff[usart0msg.recv_index] = usart_data_receive(USART0);
                usart0msg.recv_index++;
                if(usart0msg.recv_index>=1500)
                {
                        usart0msg.recv_index=0;
                }                               
                usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
        }

        if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RT) != RESET)   //接收数据完成
        {
                usart0msg.recv_flag = 1;
                usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RT);
        }
}



3. 串口单字节发送

void BSP_USART0_Send_data(uint8_t ch)
{
        usart_data_transmit(USART0, (uint8_t)ch);
  while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}       


4. 串口数组发送

void BSP_USART0_SendBuf(uint8_t *pdata, uint8_t len)
{
        uint8_t i = 0;
        for(i = 0;i < len;i++)
        {
                BSP_USART0_Send_data(pdata[i]);
        }
}


5. 串口字符串发送

void BSP_USART0_SendString(char *pdata, uint8_t len)
{
        uint8_t i = 0;
        for(i = 0;i < len;i++)
        {
                BSP_USART0_Send_data(pdata[i]);
        }
}



串口配置时,串口中断中没有用到的中断标志,不要在配置中打开,否则会造成卡死在串口中断里

usart_receiver_timeout_enable(UART3);
usart_receiver_timeout_threshold_config(UART3, 300);
nvic_irq_enable(UART3_IRQn, 0, 0);
usart_interrupt_enable(UART3, USART_INT_RBNE);//接收中断       
usart_interrupt_enable(UART3, USART_INT_RT);//超时中断
usart_interrupt_enable(UART3, USART_INT_TC);


例如这个配置使能了TC

void UART3_IRQHandler(void)
{
        if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_RBNE) != RESET) //开始接受数据
        {
                /* receive data */
                uart3msg.recv_buff[uart3msg.recv_index] = usart_data_receive(UART3);
                uart3msg.recv_index++;
                if(uart3msg.recv_index>=1500)
                {
                        uart3msg.recv_index=0;
                }                               
                usart_interrupt_flag_clear(UART3, USART_INT_FLAG_RBNE);
        }

        if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_RT) != RESET)   //接收数据完成
        {
                uart3msg.recv_flag = 1;
                usart_interrupt_flag_clear(UART3, USART_INT_FLAG_RT);
        }
       
//        if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_TC) != RESET)   //发送数据完成
//        {
//                usart_interrupt_flag_clear(UART3, USART_INT_FLAG_TC);
//        }
}



但是在中断中并没有使用TC,就会造成卡死在中断里的现象
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_53961291/article/details/145260449

使用特权

评论回复
沙发
yangxiaor520| | 2025-6-9 21:59 | 只看该作者
串口是最基础的通信接口,是调试的打印终端。

使用特权

评论回复
板凳
guijial511| | 2025-6-10 08:15 | 只看该作者
串口应该是MCU最常用得外设了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

140

帖子

0

粉丝