本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:考试结束就睡觉

大纲

  • 开箱问题
  • 环境搭建以及创建第一个project
  • 串口问题
  • 重定向问题
  • 总结

开箱问题

收到开发板,开发板长这样:

开发板是没有焊接排针的,所以想要开始开发,连接一些传感器,摄像头,屏幕等外设,就需要先焊接排针。由于我家中没有电烙铁,也已经毕业了,因此这就成为了遇到的第一个问题。
解决方法;
(1)找嵌入式行业的同学帮忙焊接下
(2)某鱼上直接搜代焊,多问几家,可以找到合适的。焊接排针属于比较简单的活,价格不建议超过10元。

环境搭建及创建第一个project

排针焊接好后,就开始准备开发了,接下来就得搭建环境了。
搭建环境包括以下几点;

(1)Keil安装:

建议安装高版本的,5.3以上的,我用的5.37的。需要安装包的可以加我QQ 984719097

(2)安装芯片pack包

pack包可以从https://aijishu.com/a/1060000000356925下载,选第8个选项 GD32F4xx AddOn中的 GigaDevice.GD32F4xx _DFP.3.0.0.pack ,如下图所示:

下载到本地直接安装即可。

(3)demo程序下载

首先将demo下载下来,然后按此路径打开:\GD32F4xx_Demo_Suites_V2.6.1\GD32427V_START_Demo_Suites\Projects 可以看到F427V_START有6个demo,我们先将第一个demo下载到板子上。
下载前注意事项:
demo中的代码是keil4编写的,因此,想要让demo能下载,建议参考【GD32F427开发板试用】+demo的正确打开方式(一),转换成keil5,再配置下GDlink,就可以点击下载了。

(4)创建project

demo程序下载后,我们验证了开发板的基础功能,接下来就是创建自己的project了。
首先,keil5点创建项目,再选择芯片:

接着引入文件,第一次创建project,我们使用官方的固件库和demo内的文件完成project的搭建:
固件库需要用到的目录有:

接着我们开始创建,参照下图的顺序:

首先点击1所在的图标,然后点击2修改project name,接着点击3按钮,新增代码目录。我们将代码设计成4个目录:
APP(应用目录)
BSP(板级别文件的目录)
FMW_CORE(内核相关文件目录)
FMW_PERI(外设相关文件目录)
创建完代码目录,向每个目录中添加对应的文件。
此项目我们参照固件库中的GPIO的例程,如下所示:

例程中的文件包括了应用文件和板级别文件,应用文件main.c添加到APP目录,其余板级文件添加到BSP。
除了这些文件外,还要去utilities中添加F427的头文件,但此目录下,只有f450的文件,如下所示:

因此,我们可以去demo的utilities中添加F427的文件,如下图所示:

接着添加 FMW_CORE内核相关文件目录,在固件库的Firmware\CMSIS\GD\GD32F4xx\添加内核文件和.s汇编启动文件,在Firmware\GD32F4xx_standard_peripheral添加此project涉及的外设,如uart,gpio,exit等。如下图所示:

创建完project,如下图所示:

接着我们开始编译,报了一些错误,找不到头文件,因此我们需要对project做一些配置:在C/C++处设置头文件路径,如下所示:

将BSP,内核,外设的头文件路径都包含进来。再次编译,依旧报错:

原来是头文件包错了,修改main.c,改为#include “gd32f427v_start.h”,继续编译,还是报了140多个错误。其中有个错误叫:
…/Firmware/CMSIS\core_cm4.h(1473): error: unknown type name ‘inline’
经过百度,这个错误是由于编译器导致的。Keil5目前使用的Compiler6,我们要用编译器5来编译。因此,需要安装编译器5,编译器5的安装文件,可以去嵌入式小学生公众号,回复ARMCC即可获得,下载后直接安装,在project配置中就会出现2个编译器,如图所示:

用编译器5,此project就正常编过了。

串口问题

刚拿到板子的时候,看到板载glink,我以为这个glink也集成了USB转串口,因此就照着网上的代码,尝试串口收发数据,但是经过一段时间的验证,一直收不到数据,经过群里大佬的提醒,去看了下原理图,没有USB转串口的模块,这意味着,想要使用串口调试,必须外接一个转串口工具。这就是我遇到的第3个问题,串口。我在网上找了些资料,又在某宝下单了一个CH340,如下图所示:

这个芯片有5个引脚,2个VCC(5V/3.3V),1个GND,1个RXD,1个TXD。
它和F427的接线方法如下:
CH340 F427
VCC3.3 ------> VCC3.3
GND ------> GND
TXD ------> RXD(PB7)
RXD -------> TXD(PB6)
CH340一端接F427,一端通过USB口接电脑,同时F427也通过USB供电。如图所示:

之所以选择PB6和PB7,作为USRT0的收发引脚,是因为PA9和PA10不能使用,串口验证代码如下:

#include "gd32f4xx.h"
#include "gd32f427v_start.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
void USART_INIT()
{
    rcu_periph_clock_enable(RCU_GPIOB);启用外设时钟功能
    rcu_periph_clock_enable(RCU_USART0);
    
    
    gpio_af_set(GPIOB,GPIO_AF_7,GPIO_PIN_6);//端口复用为串口模式
    gpio_af_set(GPIOB,GPIO_AF_7,GPIO_PIN_7);
    
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);//设置GPIO模式
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);//设置GPIO输出类型和速度
    
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    
    
    usart_deinit(USART0);//复位串口0
    usart_baudrate_set(USART0,115200U);//设置串口0的波特率
    
    //usart_word_length_set(USART0,USART_WL_8BIT);//设置传输数据长度
    //usart_parity_config(USART0,USART_PM_NONE);//设置奇偶校验位
    //usart_stop_bit_set(USART0,USART_STB_1BIT);//设置停止位
    
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能串口接收功能
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能串口发送功能
    
    usart_enable(USART0);//使能外设
    
    
}
void USART_TransmitString(char *String)
{
    while(*String)
    {
        usart_data_transmit(USART0,*String++);
        
        while(usart_flag_get(USART0,USART_FLAG_TC)==0);
    }
}
int fputc(int ch, FILE *f)
{    
    usart_data_transmit(USART0,(uint32_t)ch);    
    while(RESET == usart_flag_get(USART0,USART_FLAG_TC));
    return ch;
}
/* retarget the C library printf function to the USART */

int main(void)
{
    uint16_t rx_data = 0;
    USART_INIT();
    while(1){
        
        USART_TransmitString("这是一个串口测试\r\n");
        //数据接收
        while (usart_flag_get(USART0, USART_FLAG_RBNE) == RESET);
        rx_data = usart_data_receive(USART0); //获取字符 
        //发送数据    
        usart_data_transmit(USART0, (uint8_t)rx_data);
        while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
        printf("串口重定向测试\r\n");
    }

}

验证结果如图所示:

重定向问题

在验证串口的时候,还发现了一个问题,在使用pritf重定向时,串口会收发失败,即:

int fputc(int ch, FILE *f)
{    
    usart_data_transmit(USART0,(uint32_t)ch);    
    while(RESET == usart_flag_get(USART0,USART_FLAG_TC));
    return ch;
}
printf("串口重定向测试\r\n");

经过上网查找,最终找到了解决方法:
即配置project设置中target的use microLib,勾选上即可。如下所示:

总结

到目前为止,解决了一些问题,但还有一些问题还在探索中:
(1)兆易创新提供的一个软件GD32 All-In-One Programmer识别不了串口,BOOTLOADER已按照手册配置
(2)串口出现乱码的问题。
接下来的目标是:
(1)解决以上问题
(2)实现一个ADC采集噪声数据,传到上位机软件,分析波形的小应用
今天就先写到这里吧

参考资料:

  1. 郭天祥《GD32F303功能解读合集》
  2. 记帖 《GD32固件库开发》
  3. 极术社区GD32F427测评贴
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐