本篇文章来自极术社区与兆易创新组织的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采集噪声数据,传到上位机软件,分析波形的小应用
今天就先写到这里吧
参考资料:
- 郭天祥《GD32F303功能解读合集》
- 记帖 《GD32固件库开发》
- 极术社区GD32F427测评贴