[GD32L233C-START 评测] GD32L233C-START测评 串口USART0 printf重定向的实现

happy_njr   2022-1-29 22:27 楼主

一、GD32L233C-START评估板板载串口简介

        GD32L233C-START评估板使用的具体芯片型号是GD32L233CCT6,该芯片支持2路UART,支持全双工/半双工异步串口通讯,可编程波特率信号发生器,通讯波特率最高可达8MBits/s。 GD32L233C-START评估板串口电路原理图,使用了一个Mini_USB接口,通过CH340 USB转串口芯片连接到串口UART0,方便客户进行串口的相关调试工作。串口信息输出在代码调试的过程中一般起到很重要的作用,一般可以通过printf重定向,方便程序调试过程中打印输出调试信息。

uart原理图.jpg

 

 

二、printf重定向原理

   1.重写C的库函数

        用户重写fputc()这个c标准库函数,(printf()在c标准库函数实质是一个宏,实际是调用fputc()函数)。链接器检查到用户编写了与C库函数相同名字的函数时,优先调用用户编写函数,这样就可以实现重定向。

   2. 重定向printf()函数

       fputc()默认是把字符输出到调试器控制窗口,要把数据通过USART输出到串口助手,需对fputc()的printf()函数的输出重定向到USART端口上去,要想使用USART功能,需重定向fputc()函数。

三、建立工程及代码实现

1、新建工程,移植标准库文件,建立后的工程目录树如下。可以直接通过例程直接进行工程的移植,也可以参见其他小伙伴的帖子进行工程代码的移植(如移植过程中碰到问题的可以留言讨论,如有需要,后续也可以单独介绍如何进行基础工程的移植方法和步骤)。

      

工程目录树.jpg

2、为了便于模块化,新建uart.c和uart.h文件,并添加到工程中来,此处放到的是HARDWARE工程目录下,此后该文件下放置外设硬件资源的相关文件。

编写程序代码

uart.c文件代码如下:

     GD32L23x标准固件库——>GD32L23x_Firmware_Library_V1.0.0——>Examples——>USART——>Printf——>main.c进行代码移植改写,该代码是UART1,GD32L233C-START评估板板载Mini_USB连接的串口,如上电路原理图,使用的是串口0 USART0,适当的修改,即可。

#include "uart.h"

void com_usart_init(void)
{
    /* 使能GPIOA时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* 使能USART0时钟  */
    rcu_periph_clock_enable(RCU_USART0);

    /* PA9连接到USART TX */
    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);
    /* PA10连接到UUSART RX */
    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);

    /* 配置端口模式 */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);

    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);

    /* USART 初始化 */
    usart_deinit(USART0);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_baudrate_set(USART0, 115200U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    
    //使能串口USART0
    usart_enable(USART0);
}

/* 重写fputc */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t) ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}

uart.h头文件代码如下:

#ifndef _UART_H_
#define  _UART_H_

#include "gd32l23x.h"
#include <stdio.h>
#include <string.h>

void com_usart_init(void);

#endif

main.c 测试代码

#include "gd32l23x.h"
#include "systick.h"
#include "uart.h"

int main(void)
{
   uint32_t cnt = 0;
    systick_config();
    com_usart_init();
    printf("HELLO GD32L233C-START...\r\n");
    while(1) 
    {
        cnt++;       
        printf("%d ",cnt);
        if(cnt == 100)
            cnt = 0;
        printf("兆易创新GD32L233C 测评!\r\n");
        delay_1ms(1000);
    }
}

3、工程配置

     注意勾选微库

微库.jpg

下载设置

下载配置.jpg

下载2.jpg

四、输出调试信息

   

串口输出.jpg

五、总结

    printf重定向在程序的开发调试过程中往往起到很重要的作用,所以有必要进行相应的测试,以便于后续代码开发过程中的调试信息输出打印功能的实现。学习这些外设的时候,主要的学习方法应该是根据官方提供的DEMO例程进行代码的移植,然后完成对应的功能。

回复评论 (1)

代码卡死在printf函数里出不来了

 

点赞  2024-1-8 13:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复