基础知识(一)51与STM32单片机架构(内核和片上外设)的区别 — 汇总 + 拓展
基础知识(二)STM32的时钟系统RCC详细整理
基础知识(三)片内外设和核内外设的区别
(1)片内外设
- 片内和外设是两个概念,片内指做成芯片的集成电路内部,简称片内;外设是外部设备的简称,是指集成电路芯片外部的设备。集成电路芯片与外部设备的连接一般需要专门的接口电路和总线的连接(包括控制总线路、地址总线和数据总线等)。
- 由于大规模集成电路的技术发展得很快,现在许多芯片在制造时已经能够将部分接口电路和总线集成到芯片内部。对于这部分电路与传统的接口电路和总线是有区别的,为了加于区别可以称之为片内外设,其含义是在集成电路芯片内部集成的用于与外部设备连接的接口电路和总线。
因此,简单的说,“片内外设”是芯片内部用于与外部设备连接的接口电路和总线。(2)核内外设
Cortex-M的核内外设是指 NVIC(中断控制器)和Systick的一些寄存器的标准接口,一般在core_cm4.c文件中
固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。对于 STM32 这种级别的MCU,数百个寄存器记起来太难。于是ST(意法半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用。
但是固件库不是万能的,如果想要把 STM32 学透,光读 STM32 固件库是远远不够的,还是要了解一下 STM32 的原理,了解STM32 各个外设的运行机制,了解寄存器大致配置过程。
CMSIS 标准:ARM公司为了能让不同的芯片公司生产的 Cortex-M4 芯片能在软件上基本兼容,和芯片生产商(ST / TI)共同提出了一套标准 CMSIS 标准(Cortex Microcontroller Software InterfaceStandard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。ST 官方固件库就是根据这套标准设计的。
CMSIS 分为 3 个基本功能层:
在使用 STM32 芯片的时候首先要进行系统初始化,CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit,所以各个芯片公司写自己的库函数的时候就必须用 SystemInit 对系统进行初始化。CMSIS 还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。
NVIC是什么意思?
NVIC:提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器:Nested Vectored Interrupt Controller”。NVIC和处理器内核紧密相连,它提供以下特征:
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 系统初始化函数。
头文件 stm32f10x.h 详细分析
MDK(Keil5.0)C/C++全局宏定义:USE_STDPERIPH_DRIVER,STM32F10X_CL
(1)如何切换大中小容量芯片
(2)同程序更换芯片时,需要修改的地方
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
下载,然后进行安装。
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)复制工程模板需要的一些其他头文件和源文件到当前的工程
STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include
将里面的2个头文件 stm32f4xx.h 和 system_stm32f4xx.h
复制到 USER 目录下\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 目录下面。Target名字修改为Template
,然后在Groups一栏删掉SourceGroup1
,建立三个 Groups:USER,CORE,FWLIB
。然后点击 OK7)往 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 到哪些目录下面寻找包含了的头文件。这一步骤非常重要,如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。
全局宏定义: STM32F40_41xxx,USE_STDPERIPH_DRIVER 之间是用逗号,隔开的。
(2)STM32F40_41xxx,USE_STDPERIPH_DRIVER的作用是定义了全局宏定义,外设访问层头文件stmfxx.h中的一些模块就可以编译。
10)选择编译中间文件编译后存放目录
方法是点击魔术棒 ,然后选择“Output”选项下面的“Select folder for objects…”,
然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上:
目的:将生成的中间.o文件,重新指定存放到新建的OBJ目录