【GD32F310开发板试用】入门向-usart的使用及printf函数的重定向

news/2024/12/5 8:14:36/

首发极术社区。如对兆易创新GD32F310 MCU感兴趣,欢迎添加微信 aijishu2020 加入GD32技术讨论群。

摘要

  • 首先感谢极术社区和兆易创新公司给我这次机会,入选GD32F310K-START开发板的测评和试用。
  • 本开发板板载一块GD32F310K8T6芯片,该芯片是ARM Cortes-M4的核心,片内内置64K的FLASH及8K的SRAM供开发者使用。板载一个用户LED及一个用户Wakeup按键,同时版上集成了GD-Link下载器,开箱即用。
  • 本人是微电子专业,所以在项目中,重点使用单片机对ASIC芯片进行测试,开发相应的测试程序。这对单片机的IO及外设性能和可靠性有较高的要求。本文站在入门的角度,从建立工程开始到配置工程再到USART外设的使用,重点提及printf的重定向问题。
  • 后续将会陆续完成对USART、IIC及SPI等外设的DEMO及功能测评。

正文

开发环境

  • 系统:windows 10 professional
  • 软件:keil uVision 5.36

开箱上电

拿到开发板,如果供电正确,即会开始执行板内程序,用户LED1会开始闪烁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eATiLrVY-1649731067799)(/img/bVbt70 “图片1.jpg”)]

创建工程

打开Keil软件后新建工程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-soc8c57f-1649731067801)(/img/bVbt71 "图片2.png")]

选择保存路径,注意不要出现中文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YtbUQF5-1649731067802)(/img/bVbt72 “图片3.png”)\

选择器件,选择GigaDevice -> GD32F3x0 -> GD32F310 -> GD32F310K8
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBHvgNnL-1649731067802)(/img/bVbt73 "图片4.png")]

这里不使用操作系统,cancel即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cOVEn6w-1649731067803)(/img/bVbt74 "图片5.png")]

之后,右键工程,配置工程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIYbbNrw-1649731067804)(/img/bVbt75 "图片6.png")]

在这里可以重命名,可以对代码文件进行管理和添加删除。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KqTQSx11-1649731067805)(/img/bVbt76 "图片7.png")]

库文件和源代码。

这里沿用固件库的文件组织方式,包括Application、CMSIS、Peripherals、Startup和Utilities几个组,其中CMSIS、Peripherals、Startup都是沿用固件库中的文件,将开发板配置文件夹中加入GD32F310K-START开发板的驱动文件,驱动文件可在开发板历程库中获取。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtikwV7v-1649731067806)(/img/bVbt77 "图片8.png")]

之后,在usart.c文件中配置usart的initial和config函数。

/*!\brief      configure the USART0 GPIO ports\param[in]  none\param[out] none\retval     none
*/
void usart0_gpio_config(void)
{/* enable COM GPIO clock */rcu_periph_clock_enable(RCU_GPIOA);/* connect port to USARTx_Tx */gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);/* connect port to USARTx_Rx */gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);/* configure USART Tx as alternate function push-pull */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);/* configure USART Rx as alternate function push-pull */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);
}/*!\brief      configure the USART0\param[in]  none\param[out] none\retval     none
*/
void usart0_config(void)
{/* enable USART clock */rcu_periph_clock_enable(RCU_USART0);/* USART configure */usart_deinit(USART0);/* config data length */usart_word_length_set(USART0, USART_WL_8BIT);/* config stop bit(s) length */usart_stop_bit_set(USART0, USART_STB_1BIT);/* config if has parity length */usart_parity_config(USART0, USART_PM_NONE);/* config usart speed(BPS) */usart_baudrate_set(USART0, 115200U);/* config receive mode enable */usart_receive_config(USART0, USART_RECEIVE_ENABLE);/* config transmit mode enable */usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);usart_enable(USART0);
}

在usart.h中配置头文件

#ifndef USART_H
#define USART_H/* configure the USART0 GPIO ports */
void usart0_gpio_config(void);
/* configure the USART0 */
void usart0_config(void);#endif /* USART_H */

创建主函数文件main.c

#include "gd32f3x0.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32f310k_start.h"#include "usart.h"
#include "gpio.h"/*!\brief      main function\param[in]  none\param[out] none\retval     none
*/
int main(void)
{/* initilize the USART  */usart0_gpio_config();usart0_config();/* print out */printf("Hello world!\n\r");while(1) {}
}

配置工程

之后配置工程,点开小锤子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-awX3jyHL-1649731067807)(/img/bVbt79 "图片9.png")]

在define中加入与开发板和芯片相关的define选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekC90KzT-1649731067807)(/img/bVbt8a "图片10.png")]

之后查看include paths,将所需要的头文件include进工程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lyrr3S53-1649731067808)(/img/bVbt8b "图片11.png")]

之后将仿真器和下载器配置成板载的GD-Link,也就是CMSIS-DAP,下载器与仿真器一致即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpr2jWUH-1649731067809)(/img/bVbt8c "图片12.png")]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nP6Ze8gL-1649731067810)(/img/bVbt8d "图片13.png")]

之后进入setting,勾选reset and run,方便后续下载后即复位运行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YCbuo2l8-1649731067811)(/img/bVbt8e "图片14.png")]

至此,配置完成,可以点击rebuild进行工程建立,无错后即可进行Download。但是,如果打开串口助手,并没有出现”Hello world”的输出。经对比库中例程发现,其相比较本工程,多配置了一个Use MicroLIB,即使用缺省C语言库。它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。MicroLib提供了一个有限的stdio子系统,它仅支持未缓冲的stdin、stdout和stderr。勾选该选项后重写fputc函数即可实现printf输出到串口。实际上该问题有三种解决方法。

printf重定向

方法1

使用microLIB库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FWo2ecvL-1649731067811)(/img/bVbt8f "图片15.png")]

之后重定向fputc

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{usart_data_transmit(USART0, (uint8_t) ch);while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));return ch;
}

方法2

不使用MicroLIB库,但要取消半主机模式,然后重定向fputc

#if __ARMCC_VERSION >= 6000000__asm(".global __use_no_semihosting");
#elif __ARMCC_VERSION >= 5000000#pragma import(__use_no_semihosting)struct __FILE { int handle; };
#endifFILE __stdout;          
void _sys_exit(int x) 
{ x = x; 
}/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{usart_data_transmit(USART0, (uint8_t) ch);while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));return ch;
}

根据此处配置的编译器不同而编译不同的语句
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6us15rBQ-1649731067812)(/img/bVbt8g "图片16.png")]

方法3

如果使用gcc编译,则上两种方法都不可行,所以此时不用重定义fputc函数,而是重定义_write函数。

#include <stdio.h>int _write(int fd, char *ptr, int len)  
{  HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF);return len;
}

至此,通过编译及下载,连上串口助手,即可看到久违的“Hello World”。

结果展示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZFwdeyrr-1649731067813)(/img/bVbt8h "图片17.png")]

参考文档及blog

GD32F3x0_Firmware_Library_V2.2.0
GD32F3x0_Demo_Suites_V2.2.0
GD32F3x0_yonghushouce_Rev2.5.pdf
GD32F3x0_shiyongzhinan_Rev1.2.pdf
https://blog.csdn.net/toopoo/article/details/115287497
https://blog.csdn.net/zjutczj/article/details/115751191


http://www.ppmy.cn/news/574598.html

相关文章

C8051汇编语言递归,基于C8051F310单片机的LED灯控制器汇编语言程序调试

加 深对51单片机及其接口电路的理解,掌握定时/计数器、中断的应用编程技术及程序的调试方法。 2.实验内容 利用C8051F310单片机设计一个倒计时定时器,功能要求如下: 模式1:基本功能 主要技术指标要求如下: 1. 定时时间为9秒,定时精度为1秒 。 2. 在LED数码管上显示剩余…

【GD32F310开发板试用】使用六位半万用表测试ADC精度

首发极术社区。如对兆易创新GD32F310 MCU感兴趣&#xff0c;欢迎添加微信 aijishu2020 加入GD32技术讨论群。 项目地址 https://github.com/netube99/GD32F310G_START_ADC_TEST 感谢GD32为我提供了这块精致的GD32F310G-START开发板&#xff0c;经过周末两天的学习与开发测试&…

【GD32F310开发板试用】rtthread移植及BSP制作(保姆级)

一、开发环境 桌面操作系统&#xff1a; Win10 开发软件&#xff1a; Keil MDKV5.36 RTOS平台&#xff1a; rt-thread 4.1.0 项目地址&#xff1a;https://gitee.com/lsslny/rt-thread/tree/gitee_master/bsp/gd32 二、任务计划 1、rt-thread 系统移植&#xff1b;&#xff…

GD32F310系列超值型Cortexr-M4 MCU 资料下载

GD32F310是一款基于 Arm Cortex-M4 RISC 内核的32 位通用微控制器&#xff0c;在增强处理能力、降低功耗和外设方面具有最佳性价比。GD32F310系列MCU最高主频可达72MHz并支持DSP指令运算。配备了16KB到64KB的内置Flash及4KB到8KB的SRAM&#xff0c;内核访问闪存高速零等待。为全…

GD32F310G8 -【6】硬件I2C软件I2C驱动0.96OLED

GD32F310-硬件I2C&软件I2C驱动OLED I2C 简介及特点 并行总线至 I2C 总线协议的转换及接口&#xff1b;同一接口既可实现主机功能又可实现从机功能&#xff1b;主从机之间的双向数据传输&#xff1b;支持 7 位和 10 位的地址模式和广播寻址&#xff1b;支持 I2C 多主机模式…

【GD32F310开发板试用】驱动ST7735 SPI屏幕

首发极术社区。如对兆易创新GD32F310 MCU感兴趣&#xff0c;欢迎添加微信 aijishu2020 加入GD32技术讨论群。 代码篇幅比较多&#xff0c;看测试结果请直接拉到最后。 一、硬件介绍 1. 屏幕介绍 屏幕驱动 ST7735 屏幕分辨率 135x240 驱动接口 SPI 2. 开发板连接 对应引脚 /…

GD32F310移植FreeRTOS

【GD32F310开发板试用】GD32F310移植FreeRTOS 项目地址&#xff1a;https://github.com/kings669/GD32F310-FreeRTOS 环境说明 首先我先说明我的环境&#xff1a; 我使用keil5的版本是V5.36&#xff0c;电脑系统是WIN10&#xff0c;使用的固件库版本是从官网下载的最新版2.2…

GD32F310G8开发板试用-USART、TIMER

首发极术社区。如对兆易创新GD32F310 MCU感兴趣&#xff0c;欢迎添加微信 aijishu2020 加入GD32技术讨论群。 PC端:WIN10 开发软件&#xff1a;Keil 5.26 开发板&#xff1a;GD32F310G8 一、搭建环境出现的问题 1、pack包下载和安装。 下载链接:http://www.gd32mcu.com/cn/do…