(一)固件库 stm32f10x.h 详细分析、同程序更换芯片时需要修改的地方;创建MDK5工程模板

本文深入解析STM32固件库功能,包括固件库、CMSIS标准、STM32F4官方库包等内容,详细介绍MDK5.0使用方法,涵盖工程模板创建、编译优化、C99语法支持、调试技巧及自动运行配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文章是学习正点原子探索者开发板时所做的知识总结:stm32f407

基础知识(一)51与STM32单片机架构(内核和片上外设)的区别 — 汇总 + 拓展

基础知识(二)STM32的时钟系统RCC详细整理

基础知识(三)片内外设和核内外设的区别
(1)片内外设

  • 片内和外设是两个概念,片内指做成芯片的集成电路内部,简称片内;外设是外部设备的简称,是指集成电路芯片外部的设备。集成电路芯片与外部设备的连接一般需要专门的接口电路和总线的连接(包括控制总线路、地址总线和数据总线等)。
  • 由于大规模集成电路的技术发展得很快,现在许多芯片在制造时已经能够将部分接口电路和总线集成到芯片内部。对于这部分电路与传统的接口电路和总线是有区别的,为了加于区别可以称之为片内外设,其含义是在集成电路芯片内部集成的用于与外部设备连接的接口电路和总线。
    因此,简单的说,“片内外设”是芯片内部用于与外部设备连接的接口电路和总线

(2)核内外设
Cortex-M的核内外设是指 NVIC(中断控制器)和Systick的一些寄存器的标准接口,一般在core_cm4.c文件中

(一)固件库

固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。对于 STM32 这种级别的MCU,数百个寄存器记起来太难。于是ST(意法半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用。

(二)CMSIS 标准

CMSIS 标准:ARM公司为了能让不同的芯片公司生产的 Cortex-M4 芯片能在软件上基本兼容,和芯片生产商(ST / TI)共同提出了一套标准 CMSIS 标准(Cortex Microcontroller Software InterfaceStandard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。ST 官方固件库就是根据这套标准设计的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CMSIS 分为 3 个基本功能层

  1. 核内外设访问层:ARM 公司提供的访问,定义处理器内部寄存器地址以及功能函数。
  2. 中间件访问层:定义访问中间件的通用 API。由 ARM 提供,芯片厂商根据需要更新。
  3. 外设访问层:定义硬件寄存器的地址以及外设的访问函数。

在使用 STM32 芯片的时候首先要进行系统初始化,CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit,所以各个芯片公司写自己的库函数的时候就必须用 SystemInit 对系统进行初始化。CMSIS 还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。

NVIC是什么意思?

NVIC:提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器:Nested Vectored Interrupt
Controller”

。NVIC和处理器内核紧密相连,它提供以下特征:

  • 支持嵌套和向量中断
  • 自动保存和恢复处理器状态
  • 动态改变优先级
  • 简化的和确定的中断时间

(一)HAL库中,文件分析
(1)core内核编译兼容相关文件
在这里插入图片描述
1、cmsis开头的cmsis_armcc.h、cmsis_armclang.h、cmsis_compiler.h、cmsis_iccarm.h和cmsis_gcc.h五个文件,这五个文件用于兼容不同的编译器,并为core_cm7.h文件提供一些编译符号和汇编级的内核接口

2、不同编译文件的接口相同,但底部实现方式有差别.

(2)内核访问层头文件
core_cmxxx.h文件,它对Cortex-Mx的内核硬件进行了简单的封装,并向上级文件提供了一些简单的接口

(3)设备硬件
Cortex-M7内核之上的是STM32H7xx的设备硬件,对应于文件stm32h7xx.h,并在stm32h7xx.h中细分,STM32H743ZIT6对应于stm32h743xx.h。stm32h743xx.h的内容大致类似于标准外设库的stm32fxxx.h,是对STM32外设的定义


(三)STM32F4 官方库包介绍

1)目录介绍
在这里插入图片描述
在这里插入图片描述
2)关键文件介绍
在这里插入图片描述
注:
(1)实际工程开发一个完整的 STM32F4 工程还需要非常关键的启动文件,对于不同型号的 STM32F4 系列对应的启动文件也是不一样的。
STM32F407 系列启动文件:startup_stm32f40_41xxx.s
STM32F4 启动文件存放在目录:Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm

(2)启动文件的作用:进行堆、栈的初始化,构建中断异常向量表及中断处理函数的定义,引导进入
main主函数等。
eg:Reset_Handler 中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死
循环。 Reset_handler 在我们系统启动的时候会调用,下面让我们看看 Reset_handler 这段代码:

Reset handler//复位异常处理
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]//复位异常处理函数出口
IMPORT SystemInit//系统初始化入口
IMPORT __main//主函数入口
LDR R0, =SystemInit//系统初始化入口地址放进寄存器R0
BLX R0//执行系统初始化
LDR R0, =__main//main入口地址放进寄存器R0
BX R0//跳进main.c执行主函数
ENDP

这段代码的作用是在系统复位之后引导进入 main 函数,同时在进入 main 函数之前,首先要调
用 SystemInit 系统初始化函数。

(1)头文件 stm32f10x.h 详细分析

头文件 stm32f10x.h 详细分析

(2)同程序更换芯片时,需要修改的地方

MDK(Keil5.0)C/C++全局宏定义:USE_STDPERIPH_DRIVER,STM32F10X_CL
(1)如何切换大中小容量芯片
(2)同程序更换芯片时,需要修改的地方

(四)MDK Keil5.0简介

MDK( “RealView MDK” 的简称):源自德国的 KEIL 公司。
MDK5 由两个部分组成:MDK Core 和 Software Packs。
在这里插入图片描述
MDK Core 分成四个部分:
uVision IDE with Editor(编辑器)
ARMC/C++ Compiler(编译器)
Pack Installer(包安装器)
uVision Debugger with Trace(调试跟踪器)

其中,Software Packs 可以独立于工具链进行新芯片支持和中间库的升级。
Software Packs(包安装器)又分为:Device(芯片支持),CMSIS(ARM Cortex 微控制器软件接口标准)和 Mdidleware(中间库)三个小部分。通过包安装器,我们可以安装最新的组件,从而支持新的器件、提供新的设备驱动库以及最新例程等,加速产品开发进度。

MDK5 安装包可以在:http://www.keil.com/demo/eval/arm.htm 下载到。
而器件支持、设备驱动、CMSIS 等组件,则可以点击 MDK5 的 Build Toolbar 的最后一个图标调出 Pack Installer,来进行各种组件的安装。也可以在 http://www.keil.com/dd2/pack 下载,然后进行安装。

(五)基于固件库创建MDK5工程模板

1)工程 project 下新建5个子文件夹:CORE,FWLIB,OBJ,SYSTEM,USER
在这里插入图片描述
2)创建工程到USER目录下
在这里插入图片描述
在这里插入图片描述
Listings 和 Objects 这里把两个文件夹删除,在下一步骤中新建一个 OBJ 文件夹,用来存放编译中间文件。当然,我们也可以不删除这两个文件夹也是没有关系的,只是我们不用它而已。

3)将官方固件库里的源码文件复制到当前工程目录文件夹下
固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0
路径:Libraries\STM32F4xx_StdPeriph_Driver的 inc和src
将目录下面的 src/ inc 文件夹拷贝到新建的 FWLib 固件库文件夹下:
在这里插入图片描述
src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。

4)将固件库中相关的启动文件复制到工程目录 CORE 下

\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 

目录下,将启动文件 startup_stm32f40_41xxx.s 复制到 CORE 目录下。
然后再将目录\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Includ 里面的四个头文件:
core_cm4.h 、core_cm4_simd.h 、core_cmFunc.h 、 core_cmInstr.h 同样复制到 CORE 目录下面
在这里插入图片描述
5)复制工程模板需要的一些其他头文件和源文件到当前的工程

  1. 到目录STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 将里面的2个头文件 stm32f4xx.h 和 system_stm32f4xx.h 复制到 USER 目录下
  2. 到目录 \STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates ,将模板下面5个文件: main.c、stm32f4xx_conf.h、stm32f4xx_it.c、stm32f4xx_it.h、system_stm32f4xx.c 也复制到 USER 目录下面。
    在这里插入图片描述
    6)将 拷贝到当前工程的固件库相关文件加载到当前工程中去
    右键点击 Target1,选择 Manage Project Items:管理工程项目文件。
    Project Targets一栏,将Target名字修改为Template,然后在Groups一栏删掉SourceGroup1建立三个 Groups:USER,CORE,FWLIB。然后点击 OK
    在这里插入图片描述
    改为:
    在这里插入图片描述
    在这里插入图片描述

7)往 Group 里面添加我们需要的文件
按照步骤 9 的方法, 右键点击点击Tempate,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件:
在这里插入图片描述
注:
(1)如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。

(2)这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,
所以我们这里要把它删掉(注意是:stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。
在这里插入图片描述
8)与7步骤同样的方法,加载USER和CORE目录下文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
9)在 MDK 里设置头文件存放路径
即告诉 MDK 到哪些目录下面寻找包含了的头文件。这一步骤非常重要,如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200426155450222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2MTcwNDMz,size_16,color_FFFFFF,t_70
在这里插入图片描述
在这里插入图片描述

注意:
(1)全局宏定义STM32F40_41xxx,USE_STDPERIPH_DRIVER 之间是用逗号,隔开的。
(2)STM32F40_41xxx,USE_STDPERIPH_DRIVER的作用是定义了全局宏定义,外设访问层头文件stmfxx.h中的一些模块就可以编译。

10)选择编译中间文件编译后存放目录
方法是点击魔术棒 ,然后选择“Output”选项下面的“Select folder for objects…”,
然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上:
在这里插入图片描述
目的:将生成的中间.o文件,重新指定存放到新建的OBJ目录

(六)编译时,设置相关优化等级

在这里插入图片描述

代码的优化与此相关,volatile一般经常和优化有关

(七)新C99语法的编译支持

在这里插入图片描述

struct cyttsp4_cydata {
	u8 ttpidh;
	u8 ttpidl;
	u8 fw_ver_major;
	u8 fw_ver_minor;
	u8 revctrl[CY_NUM_REVCTRL];
	u8 blver_major;
	u8 blver_minor;
	u8 jtag_si_id3;
	u8 jtag_si_id2;
	u8 jtag_si_id1;
	u8 jtag_si_id0;
	u8 mfgid_sz;
	u8 cyito_idh;
	u8 cyito_idl;
	u8 cyito_verh;
	u8 cyito_verl;
	u8 ttsp_ver_major;
	u8 ttsp_ver_minor;
	u8 device_info;
	u8 mfg_id[0];//fixme
} __packed;

空数组的定义:MDK编译时,需要勾选这两个

(八)调试时直接跳过启动文件,直接运行到main()在这里插入图片描述

(九)烧录后自动运行需要勾选

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值