目前共有12篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
113 11
GD32 USART0 printf测试代码(不勾选Use MicroLIB)
一派掌門 二十級
1樓 發表于:2026-3-8 17:16
标准库:GD32F4xx_Firmware_Library_V3.3.3.7z - 7-Zip 压缩文件, 解包大小为 19,224,511 字节
一派掌門 二十級
2樓 發表于:2026-3-8 17:17
 
一派掌門 二十級
3樓 發表于:2026-3-8 17:17
 
一派掌門 二十級
4樓 發表于:2026-3-8 17:17
 
一派掌門 二十級
5樓 發表于:2026-3-8 17:18
 
一派掌門 二十級
6樓 發表于:2026-3-8 17:18
 
一派掌門 二十級
7樓 發表于:2026-3-8 17:18
【main.c】
#include <gd32f4xx.h>
#include <stdio.h>
#include "common.h"

int main(void)
{
  int i = 0;
 
  sys_now_init();
  usart_init(115200);
  printf("GD32F470ZI USART0\n");
  printf("SystemCoreClock=%u\n", SystemCoreClock);
 
  while (1)
  {
    printf("Shujen Chang is a gay. i=%d\n", i);
    i++;
    delay(1000);
  }
}

 
一派掌門 二十級
8樓 發表于:2026-3-8 17:19
【common.c】
#include <gd32f4xx.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

#ifdef __MICROLIB
#warning "Please do NOT use MicroLib"
#endif

#pragma import(__use_no_semihosting) // 禁用半主机模式 (不然调用printf就会进HardFault)

FILE __stdout = {1};
FILE __stderr = {2};
static uint32_t sys_ticks;

/* main函数返回时执行的函数 */
void _sys_exit(int returncode)
{
  printf("Exited! returncode=%d\n", returncode);
  while (1);
}

void _ttywrch(int ch)
{
  if (ch == '\n')
  {
    while (usart_flag_get(USART0, USART_FLAG_TBE) == RESET); // 等待前一字符发送完毕
    usart_data_transmit(USART0, '\r');
  }
  while (usart_flag_get(USART0, USART_FLAG_TBE) == RESET);
  usart_data_transmit(USART0, ch);
}

/* 等待串口发送端空闲 */
// LWIP_ASSERT会调用此函数
int fflush(FILE *stream)
{
  switch (stream->handle)
  {
    case 1:
    case 2:
      while (usart_flag_get(USART0, USART_FLAG_TC) == RESET);
      return 0;
    default:
      return -1;
  }
}

/* printf和perror重定向到串口 */
int fputc(int ch, FILE *fp)
{
  if (fp->handle == 1 || fp->handle == 2)
  {
    _ttywrch(ch);
    return ch;
  }
  return EOF;
}

/* 延时n毫秒 (不精确) */
// 实际延迟的时间t: nms<t<=nms+1
void delay(uint16_t nms)
{
  uint32_t diff, start;
 
  start = sys_now();
  do
  {
    diff = sys_now() - start;
  } while (diff <= nms);
}

/* 显示数据内容 */
void dump_data(const void *data, int len)
{
  const uint8_t *p = data;
 
  while (len--)
    printf("%02X", *p++);
  printf("\n");
}

/* 获取系统时间毫秒数 (lwip协议栈要求实现的函数) */
// 该函数必须保证: 除非定时器溢出, 否则后获取的时间必须大于先获取的时间
uint32_t sys_now(void)
{
  return sys_ticks;
}

/* 初始化系统时间毫秒计数器 */
void sys_now_init(void)
{
  SysTick_Config(SystemCoreClock / 1000);
}

/* 初始化串口 */
void usart_init(int baud_rate)
{
  rcu_periph_clock_enable(RCU_GPIOA);
  rcu_periph_clock_enable(RCU_USART0);
 
  // 串口发送引脚PA9设为复用推挽输出, 串口接收引脚PA10保持默认的浮空输入
  gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);
  gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
  gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
  gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);
  gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
  gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
 
  usart_baudrate_set(USART0, baud_rate);
  usart_stop_bit_set(USART0, USART_STB_1BIT);
  usart_word_length_set(USART0, USART_WL_8BIT);
  usart_parity_config(USART0, USART_PM_NONE);
  usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
  usart_receive_config(USART0, USART_RECEIVE_ENABLE);
  usart_enable(USART0);
}

void HardFault_Handler(void)
{
  printf("Hard Error!\n");
  while (1);
}

void SysTick_Handler(void)
{
  sys_ticks++;
}

【common.h】
#ifndef _COMMON_H
#define _COMMON_H

struct __FILE
{
  int handle;
};

void delay(uint16_t nms);
void dump_data(const void *data, int len);
uint32_t sys_now(void);
void sys_now_init(void);
void usart_init(int baud_rate);

#endif

 
一派掌門 二十級
9樓 發表于:2026-3-8 17:21
程序运行结果:
 
一派掌門 二十級
10樓 發表于:2026-3-8 17:23
 
一派掌門 二十級
11樓 發表于:2026-3-8 17:24
 
一派掌門 二十級
12樓 發表于:2026-3-8 17:29
gd32f470zi_usart1.zip - ZIP 压缩文件, 解包大小为 2,462,062 字节
链接:https://pan.baidu.com/s/1oFty3OFjN0grfLegaAk3tA?pwd=lvdd
提取码:lvdd
--来自百度网盘超级会员V3的分享
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:113 回複數:11
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2026-3-8 17:29
 
©2010-2026 Purasbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。