学习目标

  1. 了解标准库来源
  2. 熟悉模板搭建流程
  3. 掌握在已有模板基础下进行开发

    学习内容

    Keil开发环境配置

    方式一:离线安装(推荐)

    通常,我们可以在Arm为Keil准备的官方网站搜索所需的所有ARM相关开发包。

  4. 搜索:STM32F407https://www.keil.arm.com/devices/?q=STM32F407。点开STM32F407ZGTx

image.png

  1. 选择:CMSISPack 下的 STM32F4xx_DFP会发现STM32F4xx用的都是同一个开发包

image.png

  1. 继续点击下载即可:Download Recommended Pack

image.png
如果下载慢(文件大小280M左右),建议在链接上按鼠标右键,复制链接地址https://www.keil.com/pack/Keil.STM32F4xx_DFP.2.17.1.pack到迅雷下载,会比较快。

  1. 双击下载到的文件,按照默认路径进行安装

image.png

  1. 不能也不用输入目标文件夹,直接点Next >>

image.png

  1. 安装完成,Finish关闭即可

image.png

方式二:在线安装

image.png

标准外设库获取

标准外设库获取我们可以从官网进行下载。
下载链接:https://www.st.com/zh/embedded-software/stsw-stm32065.html#get-software
157.png

下载完成后,进行解压,解压后目录如图
158.png

标准外设库目录介绍

打开下载的 STM32F4xx 标准固件库,里面的目录如图

  • Project:此文件夹包含的是官方编写的示例代码,涉及芯片的大部分功能。还包含了模板代码。
  • Libraries:此文件夹里面有 2个文件夹,包含 CMSIS和固件库,方便用户开发使用。
  • Utilities:此文件夹包含一些第三方组件和 STM32 配套的开发板文件。

    Libraries

    159.png

  • CMSIS:微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是Cortex-M 处理器系列的与供应商无关的硬件抽象层。规定了处理器内核与外设的接口,统一了内核访问外设寄存器的方法

    POSIX(Portable Operating System Interface of UNIX),可移植操作系统接口,它定义了操作系统应该为应用程序提供的接口

  • STM32F4xx_StdPeriph_Driver: 从名称也可以看出,这个是 STM32F4 系列的标准外设库,存放一些封装了寄存器的库函数,我们后面编程也是依赖于这个库进行开发。

    Libraries/CMSIS

    160.png
    161.png
    内部主要是汇编代码,这个是直接和芯片进行交互的,每种不同的芯片需要配套不同的cmsis接口实现。

    Libraries/STM32F4xx_StdPeriph_Driver

    162.png
    这个里面都是一些外设库文件,包含 STM32F4 芯片的绝大部分功能,包含 ADC,CAN,SDIO,SPI 等。
    这个库是嫁接在cmsis的基础上的,F4系列不同的芯片可用公用这一套实现。

项目模板搭建

前期准备

  • 已经安装好 Keil 软件
  • 已经安装好 STM32F4xx 的 Pack 包
  • [x] 已经下载好 STM32F4xx 标准固件库

    工程文件目录创建

  • Project:放工程文件,编译文件等。

  • Firmware:放 ARM 内核文件,标准外设库文件等。
  • Hardware:放开发板的硬件驱动文件。
  • User:放 main 函数,stm32f4xx_it 文件,systick 文件。
  • Doc: 放 readme.txt 文件,工程说明文件。

140.png

固件库移植

找到我们的固件库的下载目录,将STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries 文件夹下的内容全部拷贝到新建目录的Firmware 下
159.png

程序入口移植

找到我们的固件库的下载目录,将STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Project/STM32F4xx_StdPeriph_Templates中的如下文件进行拷贝:
163.png
将文件拷贝到工程目录的User目录中
164.png

Keil工程创建

打开 keil,点击最上面的 Project 选项卡,选择 New uVision Project 选项新建一个工程
186.png
选择保存路径为我们刚才创建的文件夹下的 Project,文件名为 STM32Template,然后点击保存
187.png

设备选择

点击保存之后,弹出工程配置窗口,选择所需芯片,这里依次选择GigaDevice->GD32F4xx Series->GD32F470->GD32F470ZG,然后点击 ok
image.png
确定所需芯片之后,弹出 RTE 的环境配置对话框,选择工程所需的组件,不用配置,点击取消
189.png

keil分组创建

我们的工程已经创建完成,但是可以看到工程里面还没有文件,我们可以创建一些分组和添加一些文件。
我们打开管理工程项去创建分组和添加文件
190.png
首先我们新建分组:

  • User
  • CMSIS
  • Firmware
  • Hardware
  • Doc

142.png

CMSIS分组添加

165.png
来到Firmware\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm目录下,选择如下:
166.png

Firmware分组添加

来到Firmware\STM32F4xx_StdPeriph_Driver\src目录下,选择如下:
167.png

  • stm32f4xx_rcc.c
  • stm32f4xx_gpio.c
  • misc.c

    程序代码修改

    打开 main.c 文件,删除一些不必要的代码,剩余部分如图:
    149.png
    打开 gd32f4xx_it.c 文件,拉到最后面,然后删掉 Systick_Handler 下面的代码,剩余部分如图:
    150.png

    增加延时函数

    在User中增加systick.hsystick.c ```c /*! \file systick.h \brief the header file of systick

    \version 2016-08-15, V1.0.0, firmware for GD32F4xx \version 2018-12-12, V2.0.0, firmware for GD32F4xx \version 2020-09-30, V2.1.0, firmware for GD32F4xx \version 2022-03-09, V3.0.0, firmware for GD32F4xx */

/* Copyright (c) 2022, GigaDevice Semiconductor Inc.

  1. Redistribution and use in source and binary forms, with or without modification,

are permitted provided that the following conditions are met:

  1. 1. Redistributions of source code must retain the above copyright notice, this
  2. list of conditions and the following disclaimer.
  3. 2. Redistributions in binary form must reproduce the above copyright notice,
  4. this list of conditions and the following disclaimer in the documentation
  5. and/or other materials provided with the distribution.
  6. 3. Neither the name of the copyright holder nor the names of its contributors
  7. may be used to endorse or promote products derived from this software without
  8. specific prior written permission.
  9. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */

ifndef SYS_TICK_H

define SYS_TICK_H

include

/ configure systick / void systick_config(void); / delay a time in milliseconds / void delay_1ms(uint32_t count); / delay decrement / void delay_decrement(void);

void delay_1us(uint32_t count);

endif / SYS_TICK_H /

  1. ```c
  2. /*!
  3. \file systick.c
  4. \brief the systick configuration file
  5. \version 2016-08-15, V1.0.0, firmware for GD32F4xx
  6. \version 2018-12-12, V2.0.0, firmware for GD32F4xx
  7. \version 2020-09-30, V2.1.0, firmware for GD32F4xx
  8. \version 2022-03-09, V3.0.0, firmware for GD32F4xx
  9. */
  10. /*
  11. Copyright (c) 2022, GigaDevice Semiconductor Inc.
  12. Redistribution and use in source and binary forms, with or without modification,
  13. are permitted provided that the following conditions are met:
  14. 1. Redistributions of source code must retain the above copyright notice, this
  15. list of conditions and the following disclaimer.
  16. 2. Redistributions in binary form must reproduce the above copyright notice,
  17. this list of conditions and the following disclaimer in the documentation
  18. and/or other materials provided with the distribution.
  19. 3. Neither the name of the copyright holder nor the names of its contributors
  20. may be used to endorse or promote products derived from this software without
  21. specific prior written permission.
  22. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  23. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  24. WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  25. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  26. INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  27. NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  28. PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  29. WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  30. ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  31. OF SUCH DAMAGE.
  32. */
  33. #include "gd32f4xx.h"
  34. #include "systick.h"
  35. volatile static uint32_t delay;
  36. /*!
  37. \brief configure systick
  38. \param[in] none
  39. \param[out] none
  40. \retval none
  41. */
  42. void systick_config(void)
  43. {
  44. /* setup systick timer for 1000000Hz interrupts */
  45. if(SysTick_Config(SystemCoreClock / 1000000U)) {
  46. /* capture error */
  47. while(1) {
  48. }
  49. }
  50. /* configure the systick handler priority */
  51. NVIC_SetPriority(SysTick_IRQn, 0x00U);
  52. }
  53. /*!
  54. \brief delay a time in milliseconds
  55. \param[in] count: count in milliseconds
  56. \param[out] none
  57. \retval none
  58. */
  59. void delay_1ms(uint32_t count)
  60. {
  61. delay = count * 1000;
  62. while(0U != delay) {
  63. }
  64. }
  65. /*!
  66. \brief delay decrement
  67. \param[in] none
  68. \param[out] none
  69. \retval none
  70. */
  71. void delay_decrement(void)
  72. {
  73. if(0U != delay) {
  74. delay--;
  75. }
  76. }
  77. void delay_1us(uint32_t count)
  78. {
  79. delay = count;
  80. while(0U != delay) {
  81. }
  82. }

工程配置

  1. Target配置

152.png
点击魔法棒,进入配置中的Target,选择ARM compiler 为V6
勾选Use MicroLIB

  1. Output配置

153.png
选择创建hex文件

  1. C/C++配置

168.png

  • Define配置为:USE_STDPERIPH_DRIVER,STM32F40_41xxx
  • Warings选择AC5-like warnings
  • 选择c99和c++03
  • Optimization选择-O1
    1. Include配置

169.png
170.png
添加如下几个目录:

  • User
  • Firmware\CMSIS\Device\ST\STM32F4xx\Include
  • Firmware\CMSIS\Include
  • Firmware\STM32F4xx_StdPeriph_Driver\inc

    编译错误

    通常在编译过程中会报错,是由于当前CMSIS接口定义不符合AC6的编译环境,我们需要覆盖掉CMISIS的编译头文件。
    首先,删除Firmware\CMSIS\Include中所有的头文件。
    然后,找到你的Pack安装目录,查找方式如下:
    171.png
    来到这个目录中的Packs\ARM\CMSIS\5.9.0\CMSIS\Core\Include中:
    172.png
    拷贝这个目录中所有的.h文件,拷贝到你的项目目录的Firmware/CMSIS/Include目录中

    练习题

  1. 按照流程搭建项目模板