一、GD32L233C-START评估板板载串口简介
GD32L233C-START评估板使用的具体芯片型号是GD32L233CCT6,该芯片支持2路UART,支持全双工/半双工异步串口通讯,可编程波特率信号发生器,通讯波特率最高可达8MBits/s。 GD32L233C-START评估板串口电路原理图,使用了一个Mini_USB接口,通过CH340 USB转串口芯片连接到串口UART0,方便客户进行串口的相关调试工作。串口信息输出在代码调试的过程中一般起到很重要的作用,一般可以通过printf重定向,方便程序调试过程中打印输出调试信息。
二、printf重定向原理
1.重写C的库函数
用户重写fputc()这个c标准库函数,(printf()在c标准库函数实质是一个宏,实际是调用fputc()函数)。链接器检查到用户编写了与C库函数相同名字的函数时,优先调用用户编写函数,这样就可以实现重定向。
2. 重定向printf()函数
fputc()默认是把字符输出到调试器控制窗口,要把数据通过USART输出到串口助手,需对fputc()的printf()函数的输出重定向到USART端口上去,要想使用USART功能,需重定向fputc()函数。
三、建立工程及代码实现
1、新建工程,移植标准库文件,建立后的工程目录树如下。可以直接通过例程直接进行工程的移植,也可以参见其他小伙伴的帖子进行工程代码的移植(如移植过程中碰到问题的可以留言讨论,如有需要,后续也可以单独介绍如何进行基础工程的移植方法和步骤)。
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、工程配置
注意勾选微库
下载设置
四、输出调试信息
五、总结
printf重定向在程序的开发调试过程中往往起到很重要的作用,所以有必要进行相应的测试,以便于后续代码开发过程中的调试信息输出打印功能的实现。学习这些外设的时候,主要的学习方法应该是根据官方提供的DEMO例程进行代码的移植,然后完成对应的功能。
代码卡死在printf函数里出不来了