考试结束就睡觉 · 2022年12月05日 · 上海市长宁区

【GD32F427开发板试用】+GD32F427开发以来遇到的问题以及解决方案


大纲

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

开箱问题

收到开发板,开发板长这样:
开箱.jpg
开发板是没有焊接排针的,所以想要开始开发,连接一些传感器,摄像头,屏幕等外设,就需要先焊接排针。由于我家中没有电烙铁,也已经毕业了,因此这就成为了遇到的第一个问题。
解决方法;
(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 ,如下图所示:
image.png
下载到本地直接安装即可。

(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点创建项目,再选择芯片:
image.png

接着引入文件,第一次创建project,我们使用官方的固件库和demo内的文件完成project的搭建:
固件库需要用到的目录有:
image.png
接着我们开始创建,参照下图的顺序:
image.png
首先点击1所在的图标,然后点击2修改project name,接着点击3按钮,新增代码目录。我们将代码设计成4个目录:
APP(应用目录)
BSP(板级别文件的目录)
FMW_CORE(内核相关文件目录)
FMW_PERI(外设相关文件目录)
创建完代码目录,向每个目录中添加对应的文件。
此项目我们参照固件库中的GPIO的例程,如下所示:
image.png
例程中的文件包括了应用文件和板级别文件,应用文件main.c添加到APP目录,其余板级文件添加到BSP。
除了这些文件外,还要去utilities中添加F427的头文件,但此目录下,只有f450的文件,如下所示:
image.png
因此,我们可以去demo的utilities中添加F427的文件,如下图所示:
image.png
接着添加 FMW_CORE内核相关文件目录,在固件库的Firmware\CMSIS\GD\GD32F4xx\添加内核文件和.s汇编启动文件,在Firmware\GD32F4xx_standard_peripheral添加此project涉及的外设,如uart,gpio,exit等。如下图所示:
image.png

创建完project,如下图所示:
image.png
接着我们开始编译,报了一些错误,找不到头文件,因此我们需要对project做一些配置:在C/C++处设置头文件路径,如下所示:
image.png
将BSP,内核,外设的头文件路径都包含进来。再次编译,依旧报错:
image.png
原来是头文件包错了,修改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个编译器,如图所示:
image.png
用编译器5,此project就正常编过了。

串口问题

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

}

验证结果如图所示:
image.png

重定向问题

在验证串口的时候,还发现了一个问题,在使用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,勾选上即可。如下所示:
image.png

总结

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

参考资料:

  1. 郭天祥《GD32F303功能解读合集》
  2. 记帖 《GD32固件库开发》
  3. 极术社区GD32F427测评贴
推荐阅读
关注数
10706
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息