GD32f103介绍第一章

本文介绍了使用GD32F103的原因,如成本优势,并提供了获取资源的途径,包括固件库和例程。接着,作者分享了创建自定义例程的步骤,以及如何实现日志输出和串口通信。文中强调了串口序号从0开始,并展示了相关代码片段。最后,预告了系列教程的后续章节。
摘要由CSDN通过智能技术生成

用GD32的理由

GD32和STM32差别不大,如果非要说差别,那大概就是成本了,兆易创新GD32 价格相对于STM32是很便宜的了,而且随着这些年缺芯的影响,再叠加国产化潮流,各类公司都在逐步的替代STM32。接下来我就大概介绍一下我从头开始学习和使用GD32103的过程,如有不足,本人正在学习中。

1. 获取资源

大部分资源都可以从兆易创新官网(http://gd32mcu.com/cn/download)获取,包括固件库、例程以及各类文档:
1.GD32F10x_Demo_Suites_V2.1.0:该文件包含了keil和IAR的固件库、库文件和例程;
2.GD32F10x_Firmware_Library_V2.2.1:该文件包含库文件和例程。

2. 创建自己的例程

直接以官方最基础的打印例程为基础,在此之上进行修改。

3. 日志输出

保留原打印输出函数;增加部分函数 代码如下.

/*!
    \brief      printf the char and the hex
    \param[in]  p_title: the char
	\param[in]  p_mem: the hex
	\param[in]  size: the size of the hex
    \param[out] none
    \retval     none
*/
void mem_printf(const char* p_title, const char* p_mem, int size)
{
   
    int i = 0;

    if (!size) {
   
        return;
    }

    if ((int)p_mem < 0x20000000) {
   
        ERROR_LOG("0x%x is not memory addr.\n", (uint32_t)p_mem);
        return;
    }

    if (p_title) {
   
        printf("%s", p_title);
    }

    for (; i < size; i++) {
   
        printf("%02x ", p_mem[i]);
    }

    printf("\n");
}

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

在.h文件中加入日志错误位置输出函数:

#define ERROR_LOG(fmt, args...)    \
    do {
       \
        printf("func %s line %d err: ",__func__, __LINE__);      \
        printf(fmt, ##args);    \
    } while (0)

4. 串口

GD的串口序号是总0开始的,在本例程中,日志打印占用的串口是USART0。为了便于移植和调用,本文尽可能的进行了API封装,新建了drv_usart.cdrv_usart.h的文件。
1.drv_usart.c内容:

/*!
    \file    drv_usart.c
    \brief   firmware functions to manage usart ports
	\author  Kangkang
	
	\version 2021-12-15, V1.0.0
*/

#include <stdio.h>
#include "gd32f10x_eval.h"
#include "common_conf.h"
#include "drv_usart.h"

/* USART0 parameter definitions */
uint8_t txbufferusart0[] = "\n\rUSART interrupt test\n\r";
uint8_t rxbufferusart0[USART_BUFFER_MAXSIZE] = {
   0};
uint16_t tx_sizeusart0 = TRANSMIT_SIZE;
uint16_t rx_sizeusart0 = USART_BUFFER_MAXSIZE;
__IO uint16_t txcountusart0 = 0; 
__IO uint16_t rxcountusart0 = 0; 
uint8_t usart0_receive_flag = 0;
/* USART1 parameter definitions */
uint8_t txbufferusart1[] = "\n\rUSART interrupt test\n\r";
uint8_t rxbufferusart1[USART_BUFFER_MAXSIZE] = {
   0};
uint16_t tx_sizeusart1 = TRANSMIT_SIZE;
uint16_t rx_sizeusart1 = USART_BUFFER_MAXSIZE;
__IO uint16_t txcountusart1 = 0;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值