百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

2. GD32F103单片机学习笔记之固件库移植

ztj100 2024-10-27 18:32 63 浏览 0 评论

上一节进行了一个开发板的小小入门仪式,这节就要开始来点“猛料”了。首先,我确定好了要像STM32那样的开发模式,使用官方提供的固件库。既然确定了“路数”,那就要去实施了。GD32单片机的固件库移植过程跟STM32基本一样,所以我就参考之前STM32固件库移植的过程来对GD32F103的固件库进行移植。移植虽然听着“高大上”,其实说白了在这里就是把官方提供给我们的固件库代码文件添加到我们自己创建的工程中,然后进行相应的配置。

进入正题,首先打开Keil:

依次点击左上角菜单栏Project→New uVision Project...开始创建新的GD32F103工程:

在弹出的对话框中选择相应的目录,设置好工程名称,点击保存即可:

随后在选择芯片型号的对话框中依次点开GigaDevice中的分组(需要确认上一节中的GD32F103的芯片支持包安装成功,否则这里没有GigaDevice分组),找到我们需要的GD32F103ZE单片机型号后,点击OK:

在后面出现的软件依赖元件窗口中选择CMSIS分钟中CORE(由于我在测试官方例程时发现使用固件库中的CMSIS时编译出错,所以这里决定使用Keil提供的CMSIS):

点击OK后,左边显示框中出现了我新创建的工程:

工程创建完成了,我们就要“粉饰”一下了,现在还是个“毛坯房”,下面就要就行“装修”了。首先,我们先确定固件库有哪些东西,按照我之前给STM32做的划分,我把移植固件库后的工程目录分成了“startup”、“cmsis”、“fwlib”和“source”四部分,下面是对这四个目录功能的简介:

目录

功能

startup

存放单片机启动代码,也就是对应的汇编文件

cmsis

存放CMSIS相关的文件

fwlib

存放固件库中各个外设的源文件和头文件

source

存放main函数代码文件、系统中断代码文件等等

由于我们在前面已经决定使用Keil提供的CMSIS,所以后面也可以不创建cmsis目录。

下一步就是在工程中创建添加上这些目录了,点击“品”字形状的图标:

在弹出的对话框中双击红框中的内容即可修改。此对话框中有三部分,左边部分为工程一级目录,中间为二级目录,右边为二级目录中加入的源文件:

了解了工程的目录结构,那就要开始修改了,像上面说的双击对应的位置即可,一级目录和二级目录均可采用这种方式进行修改。点击下一行后再点击上面的新建即可创建新的目录:

采用这种方式创建好“startup”、“fwlib”和“source”三个二级目录后点击OK:

这时左边的工程显示框中已经有了我们刚才创建的目录:

接下来我们就要进行移植中的“移”了,将固件库中需要的代码文件复制到工程目录中,在此之前呢,也要在工程所在的目录下创建相同的“startup”、“fwlib”和“source”三个目录:

依次进行以下复制操作:

GD32F10x_Demo_Suites_V2.1.0\GD32F10x_Firmware_Library\CMSIS\GD\GD32F10x\Source\ARM

中的startup_gd32f10x_hd.s复制到工程所在目录下的“startup”中;

STM32芯片Flash在256K-512K之间属于大容量芯片,启动文件要选择hd的,GD32单片机也是一样的,这里开发板上的芯片是GD32F103ZET6,Flash为512K,所以启动文件也要选择hd的。

GD32F10x_Demo_Suites_V2.1.0\GD32F10x_Firmware_Library\GD32F10x_standard_peripheral

中的“Include”和“Source”两个目录及里面的所有文件复制到工程目录下的“fwlib”中;

GD32F10x_Demo_Suites_V2.1.0\GD32F10x_Firmware_Library\CMSIS\GD\GD32F10x\Include

中的gd32f10x.h和system_gd32f10x.h复制到工程所在目录下的“source”中;

GD32F10x_Demo_Suites_V2.1.0\GD32F10x_Firmware_Library\CMSIS\GD\GD32F10x\Source

中的system_gd32f10x.c复制到工程所在目录下的“source”中;

GD32F10x_Demo_Suites_V2.1.0\GD32F10x_Firmware_Library\CMSIS\GD\GD32F10x\Source

中的system_gd32f10x.c复制到工程所在目录下的“source”中;

GD32F10x_Demo_Suites_V2.1.0\GD32103E_EVAL_Demo_Suites\Projects\01_GPIO_Runing_Led

中的gd32f10x_it.c、gd32f10x_it.h、gd32f10x_libopt.h、main.c、systick.c和systick.h复制到工程所在目录下的“source”中;

这里使用开发板小灯闪烁例程中的gd32f10x_it.c、gd32f10x_it.h、gd32f10x_libopt.h、main.c、systick.c和systick.h这些文件来使用,就不用再单独创建了,后续我们只需要修改里面的相关代码即可。

复制完成后需要将复制过来的源文件添加到工程中,此前我们已经在工程中也创建了相应的目录,因此我们在对应的目录中添加相关源文件即可,再次打开“品”字图标,依次点击相应按钮添加源文件:

注意:在选择文件的对话框中需将文件类型改成All Files,否则看不到.s的启动文件。

使用相同的方法,依次将工程所在目录下的“fwlib”下的“Source”里面的所有.c文件都添加到二级目录“fwlib”下,以及将工程所在目录下的“source”中的所有.c的文件都添加到二级目录“source”中:

以上操作完成后,点击OK后,会发现左侧工程显示框中二级目录下出现了我们刚刚添加的文件:

该“移”的东西移完了,还需对工程进行配置,包括声明宏定义、声明头文件目录等等。

点击“魔法棒”按钮,在点击“C/C++”,在Define选项中添加“USE_STDPERIPH_DRIVER”和“GD32F10X_HD”两个宏定义。我们使用固件库就需要声明“USE_STDPERIPH_DRIVER”,而且我们使用的启动文件是hd的,所以要声明“GD32F10X_HD”。注意,两个宏定义之间要用半角的逗号隔开,否则编译时会报错

然后在点击窗口中Include Paths后面的...按钮,进行头文件的目录的声明,在打开的窗口中先选择空白行,再点击新建:

此时所选行后面出现...按钮,点击此按钮,在弹出的对话框中找到头文件包含在的目录,比如gd32f103_test\fwlib\Include,然后点击选择即可:

使用相同的方法将头文件所在的其他两个目录gd32f103_test\source和gd32f103_test\startup也添加上,添加完后是这么个样子:

然后依次点击两个OK即可。

此时对工程进行编译会发现有错误提示:

这是因为我们的main.c是直接复制的小灯闪烁例程中的main.c,里面有部分内容不适合我们现在的工程,我们可以把他们删掉,双击打开左侧工程显示框中的main.c,将下面红框中的内容删掉:

再次编译,将不再出现错误提示:

此时完成了一个带有延时函数的空白工程的创建,并移植好了固件库。那么怎么来验证我们移植了固件库的工程有没有问题呢,那我们就得写个小小的测试程序了,同样,我们还是使用小灯闪烁的程序来验证。

在main.c中的main函数的while之前添加如下代码:

rcu_periph_clock_enable(RCU_GPIOF);
gpio_init(GPIOF, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
gpio_bit_reset(GPIOF, GPIO_PIN_0);

在while循环中添加如下代码:

gpio_bit_set(GPIOF, GPIO_PIN_0);
delay_1ms(500);
gpio_bit_reset(GPIOF, GPIO_PIN_0);
delay_1ms(500);

最终添加代码后的main.c文件是这么个样子:

添加的这两段代码是实现了开发板上的LED2半秒闪烁一次的功能,代码具体的工作原理我们会在后续的章节中学习到相应内容的时候进行讲解。

编译后没有错误,按照上一节中对烧录器进行配置的方法设置完后即可烧录到开发板中进行验证,烧录后开发板上的LED2将进行亮灭交替闪烁:

如果开开发板上的小灯开始闪烁了,那就说明我们的工程创建完成了,固件库移植成功了,此处散花。

OK,今天就到这里吧。

相关推荐

Python 操作excel的坑__真实的行和列

大佬给的建议__如何快速处理excelopenpyxl库操作excel的时候,单个表的数据量大一些处理速度还能接受,如果涉及多个表甚至多个excel文件的时候速度会很慢,还是建议用pandas来处理,...

Python os.path模块使用指南:轻松处理文件路径

前言在Python编程中,文件和目录的操作是非常重要的一部分。为了方便用户进行文件和目录的操作,Python标准库提供了os模块。其中,os.path子模块提供了一些处理文件路径的函数和方法。本文主要...

Python常用内置模块介绍——文件与系统操作详解

Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互...

Python Flask 建站框架实操教程(flask框架网页)

下面我将带您从零开始构建一个完整的Flask网站,包含用户认证、数据库操作和前端模板等核心功能。##第一部分:基础项目搭建###1.创建项目环境```bash...

为你的python程序上锁:软件序列号生成器

序列号很多同学可能开发了非常多的程序了,并且进行了...

PO设计模式全攻略,在 UI 自动化中的实践总结(以企业微信为例)

一、什么是PO设计模式?PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类,即一个py文件,并以页面为单位来写测试用例,实现页面对象和测试用例的...

这种小工具居然也能在某鱼卖钱?我用Python一天能写...

前两天在某鱼闲逛,本来想找个二手机械键盘,结果刷着刷着突然看到有人在卖——Word批量转PDF小工具...

python打包成exe,程序有图标,但是任务栏和窗口都没有显示图标

代码中指定图标信息#设置应用ID,确保任务栏图标正确显示ifsys.platform=="win32":importctypesapp_id=...

使用Python构建电影推荐系统(用python做推荐系统)

在日常数据挖掘工作中,除了会涉及到使用Python处理分类或预测任务,有时候还会涉及推荐系统相关任务。...

python爬取并分析淘宝商品信息(python爬取淘宝商品数据)

python爬取并分析淘宝商品信息背景介绍一、模拟登陆二、爬取商品信息1.定义相关参数2.分析并定义正则3.数据爬取三、简单数据分析1.导入库2.中文显示3.读取数据4.分析价格分布5.分析销售...

OpenCV入门学习基础教程(从小白变大神)

Opencv是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等,下面这篇文章主要给大家介绍了关于openCV入门学习基础教程的相关资料,需要的朋友可以...

python图像处理-一行代码实现灰度图抠图

抠图是ps的最基本技能,利用python可以实现用一行代码实现灰度图抠图。基础算法是...

从头开始学python:如何用Matplotlib绘图表

Matplotlib是一个用于绘制图表的库。如果你有用过python处理数据,那Matplotlib可以更直观的帮你把数据展示出来。直接上代码看例子:importmatplotlib.pyplot...

Python爬取爱奇艺腾讯视频 250,000 条数据分析为什么李诞不值得了

在《Python爬取爱奇艺52432条数据分析谁才是《奇葩说》的焦点人物?》这篇文章中,我们从爱奇艺爬取了5万多条评论数据,并对一些关键数据进行了分析,由此总结出了一些明面上看不到的数据,并...

Python Matplotlib 库使用基本指南

简介Matplotlib是一个广泛使用的Python数据可视化库,它可以创建各种类型的图表、图形和可视化效果。无论是简单的折线图还是复杂的热力图,Matplotlib提供了丰富的功能来满足我们...

取消回复欢迎 发表评论: