从BSP到DFP和RTOS---专业的嵌入式开发工具Keil备忘
0、新的三个小板不同的芯片 + 一个下载器。

----自下而上依次是:GD32F303RCT6开发板。ST-LINK-v2下载器。STM32103C8T6小板。CH32F103C8T6小板。
----三个小板均为ARM的Cortext-M系列内核的MCU。均没有USB2UART/USB2TTL芯片和电路。
----使用专业的开发工具(之一)Keil。使用专业的下载器(之一)ST-Link-v2。ST-Link-V2本身提供的针脚是10pin,既可以支持JTAG也可以支持SWD。
1、ST-Link-v2和开发板JTAG/SWD信号的连接及驱动。

----ST-Link-v2下载器,是4-pin的SWD接口。STM32和CH32的小板,均为4-pin的SWD接口。按照信号名对应连接即可。
----GD32的小板,是20-pin的JTAG/SWD信号针脚,需要按照上图右边SWD的4个信号名进行对应连接。
----ST-Link-v2作为一个USB Device Class,其驱动在Keil安装以后的软件包目录中就有,可以不用单独找,尤其不要到野的地方下载。从这里也可以看出Keil对ST-Link-v2的良好支持。

----近似地在Keil软件目录(下图中是D:\Keil_v5\ARM)还有其它一些常见的下载器目录,包括。
----JLink,位于SEGGER目录下。这个Segger不仅提供最"高贵"的JLink下载器,还是IAR软件的厂商。IAR和Keil软件几乎可以说是商业嵌入式开发平台的TOP2。
----ULink,Nulink等。
2、Keil的使用从查看ST-Link-v2上挂载的设备开始。

----使用Keil的【Options for Target】配置对话框中,选择Use ST-Link Debugger,并使用Settings按钮进入到次级的对话框中,在次级对话框中Port中可以(建议!)先选JTAG然后再选SW,这样可以看到右上角通过SWD接口协议所发现的设备。
----在打开【Options for Target】配置对话框之前,需要使用Keil新建一个项目或者打开一个项目。如果没有打开项目,那么这个【Options for Target】的菜单项以及对应的工具按钮,均为灰色无效状态。
----三个开发板,需要使用现有的开发包示例中的Keil工程,作为模板,再行修改。
----GD32的官方例程:https://gitcode.com/open-source-toolkit/57a25 下的。
----CH32的官方例程:https://www.wch.cn/downloads/CH32F103EVT_ZIP.html 下的。
----STM32的官方例程:通过某东某宝卖开发小板的店里的讲解看到后照抄即可。此外在安装STM32的必要的Pack以后这些Pack里面也有STM32的例程,在如下目录下:
D:\Keil_v5\Packs\Keil\STM32F1xx_DFP\2.4.1\Boards\Keil\MCBSTM32E\Blinky。
----三颗不同厂商的芯片,需要在Keil下安装各厂商所提供的开发包,这就需要使用到Keil的Pack Installer了!这个Pack Installer和Arduino的Board Management类似,也和Linux的apt/yu类似,或者Python的pip类似,或者NodeJS/Electron的npm类似,都是包管理器!
----这个Pack Installer所安装的包以.pack为文件后缀,包含如下几种代表性的包分类:
----DFP(Device Family Pack, 设备家族包, 芯片家族包)
----BSP(Board Support Package, 板级支持包)。
----RTOS(Real-time OS包)。
----这不是一个严格的分类,而是在嵌入式开发中需要理解的重要概念。TBD。
  
3、STM32的项目:

----来自B站江科大的STM教程。
----要点1:有一个startup_stm32f10x_md.s的汇编代码,是整个嵌入式系统软件运行的总入口。
----要点2:main.c的代码是寄存器风格。
4、CH32的项目:

----基于CH32厂商官网的例程进行的修改。
----要点1:有一个startup_ch32f10x.s的汇编代码,是整个嵌入式系统软件运行的总入口。
----要点2:main.c里的代码是某种高级语言风格。
5、GD32的项目:

----基于GD32厂商例程进行的修改。
----要点1:有一个startup_gd32f30x_hd.s的汇编代码,是整个嵌入式系统软件运行的总入口。
----要点2:main.c里的代码是某种高级语言风格。
----可以看出上面三个示例代码风格,用户代码各不相同,但是startXXX.s的套路却高度一致。
6、Pack Install所安装的DFP(Device Family Pack)和BSP(Board Support Pack)。

----如图所示,基本相近的目录结构,Board、Device、Flash、SVD等几个目录。
----以GigaDevice为例打开看一下Device目录!
$ ll GigaDevice/GD32F30x_DFP/2.2.1/Device/
 total 0
 drwxr-xr-x 1 Chipcamp 197609 0 Oct 27 12:42 Firmware/
 drwxr-xr-x 1 Chipcamp 197609 0 Oct 27 12:42 Include/
 drwxr-xr-x 1 Chipcamp 197609 0 Oct 27 12:42 Source/
 drwxr-xr-x 1 Chipcamp 197609 0 Oct 27 12:42 Template/
 drwxr-xr-x 1 Chipcamp 197609 0 Oct 27 12:42 Utilities/
$ ll GigaDevice/GD32F30x_DFP/2.2.1/Device/Include/
 total 32
 -r--r--r-- 1 Chipcamp 197609 27432 Oct 27 12:42 gd32f30x.h
 -r--r--r-- 1 Chipcamp 197609  2428 Oct 27 12:42 system_gd32f30x.h
$ ll GigaDevice/GD32F30x_DFP/2.2.1/Device/Source/
 total 32
 drwxr-xr-x 1 Chipcamp 197609     0 Oct 27 12:42 ARM/
 -r--r--r-- 1 Chipcamp 197609 31206 Oct 27 12:42 system_gd32f30x.c
$ ll GigaDevice/GD32F30x_DFP/2.2.1/Device/Source/ARM/
 total 64
 -r--r--r-- 1 Chipcamp 197609 21345 Oct 27 12:42 startup_gd32f30x_cl.s
 -r--r--r-- 1 Chipcamp 197609 19527 Oct 27 12:42 startup_gd32f30x_hd.s
 -r--r--r-- 1 Chipcamp 197609 19729 Oct 27 12:42 startup_gd32f30x_xd.s
$ ll GigaDevice/GD32F30x_DFP/2.2.1/Device/Firmware/Peripherals/
 total 8
 drwxr-xr-x 1 xjrco 197609 0 Oct 27 12:42 inc/
 drwxr-xr-x 1 xjrco 197609 0 Oct 27 12:42 src/
----可以看出整个嵌入式系统软件运行的总入口start_xxx.s文件。
----基本的头文件gd32f30x.h以及system_gd32f30x.h,以及相应的配套的.c文件。
----外设的inc和src目录,同样也是配套的.h包含文件和.c文件。
----这些文件构成了【嵌入式编程】的所有的基础!换句话说,嵌入式编程可以&必须【通透】地看到所有源代码,从系统软件运行的总入口start_xxx.s文件,到系统可供使用的最底层库函数(包含了硬件资源如内存地址分配,以及外设的内存地址,以及相关的寄存器资源),再到用户(芯片视的软件开发者)的程序。所谓裸机开发大抵就是这个意思了,而嵌入式开发大概就是裸机开发的最好机会,像x86等通用PC/Server上的软件开发,基本上把底层硬件相关的和上层软件开发的区分开来了,能接触最底层硬件交互代码的机会极少。
----所谓嵌入式操作系统,就是基于这些底层库函数(包含了DFP和BSP所提供的硬件资源如内存地址分配,以及外设的内存地址,以及相关的寄存器资源),构建多线程的支持,并将其中的一个线程(比如说线程0)作为系统资源管理的入口----这个资源管理的入口包括CPU资源,内存资源,外存和文件系统,CPU资源又包括线程本身的管理和调度(被thread0所协调和调度),这些是作为嵌入式实时操作系统的运行态行为特征,而嵌入式实时操作系统还会为用户(开发者)的应用开发提供相应的API,不再只是底层DFP和DSP所提供的非常原始的API。
----关于嵌入式系统软件运行的总入口start_xxx.s文件,非常有意思的问题,TBD。
----关于嵌入式系统的DFP以及BSP的概念和实践内涵,非常有意思的问题,TBD。
----关于嵌入式实时操作系统(RTOS)的概念和实践内涵,非常有意思的问题,TBD。
----关于嵌入式开发的其它更多的专业厂商工具及对比(IAR and more),TBD。
<<<<<<<<本文完>>>>>>>>
摘要:本文介绍了三款基于ARM Cortex-M内核的MCU开发板(GD32、STM32、CH32)的开发环境搭建过程。重点讲解了ST-Link-v2下载器的连接方法、Keil开发工具的配置使用以及Pack Installer包管理器的应用。通过分析三个不同厂商芯片的项目结构,揭示了嵌入式开发中设备家族包(DFP)和板级支持包(BSP)的核心作用。文章最后还探讨了嵌入式实时操作系统(RTOS)的构建原理,指出从启动文件(startup.s)到硬件抽象层的完整开发链条是嵌入式编程的重要特征。
