其他分享
首页 > 其他分享> > ST系列工程模板的建立

ST系列工程模板的建立

作者:互联网

工程模板

STM32系列单片机的学习路上,第一道门槛便是开发环境的搭建与工程模板的建立,首先需要有一个完整的开发环境,才能迈出嵌入式的第一步:

Step.0 准备开发环境

基础部分

扩展部分

封装的函数多了,也便成了库

为适应变化的开发环境,ST公司用标准函数封装起繁琐的寄存器配置,并给出了不同层级的库,省去了学习底层的成本和一步步配置的麻烦,常用的API有以下几种:

Step.1 建立工程目录

实际上,工程目录并没有统一的规定,可以说连官方提供的模板都可能因版本而有不同变化。即便如此,我们也能一窥其中的一些共识,通过观察各种路径规划并结合自己的理解,就有了下面的目录模板,我在自建工程的时候,会以此为标准:

STM32_ProjectTemplate
    │  
    ├─CMSIS
    │  ├─CoreSupport
    │  │  ├─Inc
    │  │  └─Src
    │  └─DeviceSupport
    │      ├─Inc
    │      └─Src
    ├─Drivers
    │  ├─HAL_Driver
    │  │  ├─Inc
    │  │  └─Src
    │  ├─LL_Driver
    │  │  ├─Inc
    │  │  └─Src
    │  └─STD_Driver
    │      ├─Inc
    │      └─Src
    ├─MDK-ARM
    └─User
        ├─Include
        └─Source      
  

当然,免不了的还是要强调一下,文件目录中尽量不要有中文!

Step.2 创建寄存器工程

CMSIS标准的建立,为芯片内核和外设实现一致且简单的软件接口,使寄存器从单纯的总线地址变得有名有姓,奠定了快速开发的基础,绝大部分交互和控制的实现都能通过操作和配置寄存器来实现。而我们常说的基于函数库的开发均在此之上,倘若将工程中各种库的外衣剥去,不变就是寄存器工程了。因此,了解和学习寄存器,对开发来说是很有必要的

虽说各系列芯片的工程都是基于CMSIS标准,一种芯片的工程建立方式能很容易应用于其他型号,但随着版本的更新和新型号陆续推出,工程结构仍有异同,因此还是区分讲解为宜

Step.3 扩充函数库

有了寄存器工程,我们就能轻易的进行函数库的扩充,而且在一些性能足够的硬件平台上,除了标准库和用户私有库,也可以挂载实时操作系统RTOS,从而使开发者能够自行在资源利用和开发效率之间找到一个合适的权衡

当然,由于标准库之间关系复杂,官方无法做到全系列全支持,下面便是目前各芯片标准库工程建立方式和情况一览

STD库 LL库 HAL库
F Series 支持 支持 支持
G Series 不支持 不支持 不支持

Step.4 机械降神STM32CubeMX

正所谓道高一尺魔高一丈,为了解决建立工程模板带来的种种困难,也为了新标准库的加入,加速开发流程,ST公司力推工程模板生成器,虽然确实方便使用,但仍需要一定学习和适应的成本

Step.5 小结

到这里,工程模板的建立就算是告一段落了,工程模板一旦建立,往后的开发可以直接沿用,快速投身于项目中,不必再反复创建。虽说过程繁琐,但整体并不算难,而在这过程中是能够明白很多工程文件之间的运作关系的。即便如今有了CubeMX这样的新工具,作为开发人员,是需要拥有自行创建工程模板的能力的


附:常见问题与解决方案
编译错误:error: L6236E: No section matches selector - no section to be FIRST/LAST.

添加Startup*.s文件到项目中

编译警告:

Startup*.s文件中,找到

Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
                 IMPORT  SystemInit
                 IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

并修改为

Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
                 ;IMPORT  SystemInit
                 IMPORT  __main

                 ;LDR     R0, =SystemInit
                 ;BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

因为该汇编启动文件规定程序在进入主函数之前,会先进入函数SystemInit()初始化系统时钟,有的芯片支撑文件中不一定会自带此函数,导致编译错误,只需将调用部分注释掉即可

编译警告:warning: #1-D: last line of file ends without a newline
芯片型号不一致

打开 Options for Target ,在Device选项卡中可以重新选择芯片型号

默认晶振时间不一致

Target选项卡中,Xtal(Mhz)一栏填写正确的时钟频率

不生成HEX格式文件

首先检查程序编译和生成过程中是否产生错误,若没有,则在Output选项卡中勾选Creat HEX File

修改工程输出路径

Output选项卡中,点击Select Folder for Objects按钮,选择中间文件路径

修改中间文件路径

Listing选项卡中,点击Select Folder for Listing按钮,选择中间文件路径

编译不支持内联函数

这是由于工程文件不支持最新的编译版本导致的,可以看到在C/C++ 选项卡中出现了 (AC6) 的字样,Target选项卡中CodeGeneration栏下拉菜单中选择Use Default Compiler version 5

C99 Mode

C/C++ 选项卡中勾选C99 Mode

下载器无法连上

Debug选项卡下,确认勾选Use Debugger而非Use Simulator,下拉选择对应的下载仿真器

点击右侧Settings按钮,在内 Debug 选项卡中配置PortMax Clock

下载程序不执行

检查程序逻辑无误后,通过板载复位键重置

若需要程序下载后立即执行,则在Debug选项卡下点击右侧Setting按钮,在内 Flash Download 选项卡中勾选Reset and Run

标签:选项卡,工程,芯片,ST,R0,寄存器,系列,模板
来源: https://www.cnblogs.com/Ryzon/p/16352159.html