STM32学习总结
文章目录
前言
记录学习过程中的一些问题
F1与F4的区别是什么?
- F1采用Crotex M3内核,F407采用Crotex M4内核。
- F1最高主频 72MHz, F407最高主频168MHz。
- F407具有单精度浮点运算单元,F1没有浮点运算单元。
- F407的具备增强的DSP指令集。F407的执行16位DSP指令的时间只有F1的30%70%。F407执行32位DSP指令的时间只有F1的25%60%。
- F1内部SRAM最大64K字节, F407 SRAM有192K字节(112K+64K+16K)。
- F407有备份域SRAM(通过Vbat供电保持数据),F1没有备份域SRAM。
- F407从内部SRAM和外部FMC存储器执行程序的速度比F1快很多。F1的指令总线I-Bus只接到Flash上,从SRAM和FMC取指令只能通过S-Bus,速度较慢。F407的I-Bus不但连接到Flash上,而且还连接到SRAM和FMC上,从而加快从SRAM或FMC取指令的速度。
- F1最大封装为144脚,可提供112个GPIO;F407最大封装有176脚,可提供140个GPIO。
- F1的GPIO的内部上下拉电阻配置仅仅针对输入模式有用,输出时无效。而F407的GPIO在设置为输出模式时,上下拉电阻的配置依然有效。即F407可以配置为开漏输出,内部上拉电阻使能,而F1不行。
- F407的GPIO最高翻转速度为90MHz,F1最大翻转速度只有18MHz。
- F1最多可提供5个UART串口,F407最多可以提供6个UART串口。
- F1可提供2个I2C接口,F407可以提供3个I2C接口。
- F1和F407都具有3个12位的独立ADC,F1可提供21个输入通道,F407可以提供24个输入通道。F1的ADC最大采样频率为1Msps,2路交替采样可到2Msps(F1不支持3路交替采样)。F4的ADC最大采样频率为2.4Msps,3路交替采样可到7.2Msps。
- F1只有12个DMA通道,F407有16个DMA通道。F407的每个DMA通道有4*32位FIFO,F1没有FIFO。
- F1的SPI时钟最高速度为 18MHz, F407可以到37.5MHz。
- F1没有独立的32位定时器(32位需要级联实现),F407的TIM2和TIM5具有32位上下计数功能。
- F1和F407都有2个I2S接口,但是F1的I2S只支持半双工(同一时刻要么放音,要么录音),而F407的I2S支持全双工,放音和录音可以同时进行。
从编程的角度来说,M3和M4几乎没有区别。性能上区别可以看此贴。
资料查找
第1步:进入ST官方地址,页面上侧中间编辑框输入STM32F407检索。
第2步:检索后会弹出所有STM32F407的芯片
第3步:比如我们用的是STM32F407IG,点击进入第2步截图中的STM32F407IG选项即可。进入后,所有的相关资源就都在这个页面下了。
数据手册标识:
应用笔记标识:
参考手册标识:
编程手册标识:
勘误手册标识:
STM32F407软件包的下载
第1步:进入ST官方地址www.st.com ,页面上侧中间编辑框输入STM32CubeF4检索。
第2步:检索后会弹出STM32CubeF4的软件包选项。
第3步:进入STM32CubeF4的页面地址后,就在页面的最底端看到这个软件包了(随着时间推移,版本会不断更新)。
第4步:点击按钮“Get Software”后,弹出如下界面
点击ACCEPT进入下面界面:
点击Login/Register
通过上面四步就获取了STM32F407的软件包。软件包的目录结构如下:
HAL库介绍
hal库的架构
HAL库全称Hardware Abstraction Layer,即硬件抽象层,其实就是STM32F407的外设驱动包。代码文件位于路径:\Drivers\STM32F4xx_HAL_Driver。如下是部分截图:
易用性好
CMSIS软件包介绍
OVERVIEW
CMSIS(微控制器软件接口标准,Cortex Microcontroller Software Interface Standard)是ARM官方设计的驱动包,框图如下:
ARM推出CMSIS软件包意在统一各大芯片厂商的外设驱动,DSP数字信号处理,下载器和各个主流RTOS的API统一。
CMSIS软件包可以在三个地方获取:
STM32CubeF4软件包里面。
每个版本的Cube软件包都会携带CMSIS文件夹。
MDK安装目录(下面是5.5.1版本的路径)。
大家安装了新版MDK后,CMSIS软件包会存在于路径:ARM\PACK\ARM\CMSIS\5.5.1\CMSIS。
GitHub。
通过GitHub获取也比较方便,地址:https://github.com/ARM-software/CMSIS_5 。
文件夹介绍
Core
Cortex-M处理器内核和外设的API。 它为Cortex-M0,Cortex-M0 +,Cortex-M3,Cortex-M4,Cortex-M7,Cortex-M23,Cortex-M33,SC000和SC300提供了标准化接口。 还包括用于Cortex-M4,Cortex-M7和Cortex-M33 的SIMD指令。当前这个文件下只有一个示例文件,还用不上。
Core_A
同上,只是用于Cortex-A5/A7/A9。
DAP
这个是ARM官方推出的下载器固件,也就是大家所说的CMSIS-DAP下载器。
Documentation
这个是CMSIS软件包的Help文档,打开后效果如下:
Driver
这个是ARM做好的驱动框架,支持的外设如下:
针对不同厂商,ARM会出一个完整的驱动包,比如STM32F4系列,在MDK安装目录的此路径下(前提是大家安装了STM32F4软件包):ARM\PACK\Keil\STM32F4xx_DFP\2.13.0\CMSIS\Driver。
DSP_Lib
这个是ARM提供的DSP库,此库支持以CM0、CM3、CM4以及CM7为内核的所有MCU,含源码。详细介绍可以看我们的DSP教程:http://www.armbbs.cn/forum.php?mod=viewthread&tid=3886 。
Include
这个文件比较重要,虽然是头文件,但是封装了很多内核方面的API,是工程里面务必包含的路径。
Lib
这个文件是GCC和MDK格式的DSP库文件。
NN
这个是ARM新出的神经网络库,框图如下:
Packs
这个文件没什么用,大家不用管。
RTOS
这个是RTX4以及CMSIS-RTOS V1封装层,含源码,免费,Apache-2.0授权。
RTOS2
这个是RTX5以及CMSIS-RTOS V2封装层,含源码,免费,Apache-2.0授权。
SVD
SVD的全称是System View Description,系统视图描述。对芯片的外设、存储器等进行了详细描述,编译器要用到这个文件,不同系列芯片有不同的SVD文件。以STM32F407为例,在MDK的option选项里面可以看到以svd为后缀的文件被调用。
Utilities
这个文件里面提供了一些实用的小软件或者文件。
工程创建(mdk)
mdk上手手册:参见:G:\STM32\资料\文档\mdk5-getting-started-cn.pdf
1.创建工程文件夹
-
Doc文件夹
用于记录例程的修改记录和例子简介。 -
Libraries文件夹
在第一章详细介绍从官网的下载方法。 -
Project文件夹
这个是本章的重点,在这个文件夹里面再建立两个文件夹,MDK-ARM(uV5)文件夹里面用于存放MDK工程,EWARMv8文件夹用于存放IAR工程,方便以后创建IAR的工程。 -
User文件夹
这个是要用户提供的,开发板已经都提供好,bsp文件夹里面是开发板各个外设的驱动,segger文件夹是硬件异常分析代码。 -
删除目标文件.bat
这个是批处理文件,用于删除MDK和IAR工程编译后生成的obj和list临时文件。
2.创建工程
打开MDK,选择Project ->New uVision Project:
工程名设置为project:
选择器件:STM32F407ZGTx
点击OK后弹出如下界面,点击Cancel取消,当前我们还不使用RTE环境创建。
3.设置工程名和工程分组名
默认新建的工程是下面这样的:
打开Manage Project Items,双击Targer1修改名字为Flash,或者任何其它方便自己管理的名称,设置完毕后点击OK。
可以看到已经修改为Flash:
再次打开Manage Project Items,添加如下分组内容:
可以看到左侧工程列表已经更新:
4.添加工程文件
方法1:
方法2:
-
添加User分组需要的文件
main.c文件位于文件夹User,实现了一个简单的跑马灯效果。 -
添加BSP分组需要的内容
bsp.c 位于路径\User\bsp,主要用于时钟和外设初始化。
bsp.h位于路径\User\bsp,此文件是各种头文件的集中汇总贴,方便管理。
bsp_led.c位于路径\User\bsp\src,用于LED驱动。
bsp_key.c位于路径\User\bsp\src,用于按键驱动。
bsp_timer.c位于路径\User\bsp\src,用于软件定时器组和微妙级单次延迟。
bsp_fmc_io.c位于路径\User\bsp\src,用于IO扩展,这里LED要用到。
bsp_uart_fifo.c位于路径\User\bsp\src,用于8串口FIFO驱动。
stm32f4xx_it.c位于路径User\bsp,用于部分系统中断服务程序。 -
添加MDK-ARM分组需要的内容
startup_stm32f407xx.s 位于路径\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm,主要用于堆和栈空间设置,中断向量表也在这个文件。 -
添加HAL_Driver分组需要的内容
stm32hf4xx_hal_conf.h位于路径\User\bsp,主要用于HAL库的配置。
其它文件路径:\Libraries\STM32F4xx_HAL_Driver\Src,用到什么外设添加什么驱动文件即可,有些外设驱动跟DMA也有关联,直接添加进来即可。 -
添加CMSIS分组需要的内容
system_stm32f4xx.c位于路径\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates,主要用于复位RCC相关寄存器和中断向量表位置设置。 -
添加SEGGER/HardFault分组需要的内容
这两个文件位于路径:\User\segger\HardFaultHandlerMDK,主要用于硬件异常分析。 -
添加Doc分组需要的内容
这两个文件位于Doc文件夹,主要用于说明例程的功能和更新记录。
5.Target Options配置
MDK的配置基本都集中在Target Options对话框里面:
Device选项
Target选项
- 因为我们一般不用软件仿真,这个选项不用管,也不推荐大家用MDK提供的软件仿真,问题比较多。
- 选择编译器,使用默认的AC5即可。当前AC6支持的还不够好,仅MDK自家的软件都支持了,第三方的问题稍多。
- 我们这里使用微库MicroLib,这个库针对嵌入式应用,MicroLIB做了深度优化,比使用C标准库所需的RAM和FLASH空间都大大减小。比如调用:<math.h>,<stdlib.h>,<stdio.h>,<string.h>。更多这方面的信息可以看KEIL官网:http://www.keil.com/arm/microlib.asp 。
- STM32F407支持单精度浮点,所以这里选择Single Precision单精度浮点。
- STM32F407的Flash首地址是0x0800 0000,大小0x100000,即1MB。
- 默认的RAM空间首地址0x2000 0000,大小0x20000,即128KB。
Output选项
- 用于存放MDK编译过程中生成的obj临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Objects,这里无需修改,使用默认即可。
- Debug Information表示调试信息,选上。
- Create HEX File表示是否生成hex文件,选上。
- Browse Information表示是需要go to def的支持,使用HAL库话,推荐先不要选上,因为MDK5使用AC5编译HAL库时间比较长.
Listing选项
- 用于存放MDK编译过程中生成的list临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Listings,这里无需修改,使用默认即可。
- 是否生成*.lst文件,选上。
- 查看MAP文件要用上,全部选上。
User选项
这个选项基本用不上,可以不用管,主要是用来指定编译之前和编译之后执行的用户程序。对于本教程配套的例子来说在这里添加了一个批处理功能,用来实现Objects文件夹里面的hex文件复制到路径Project\MDK-ARM(uV5)里面,方便查找。
C/C++选项
1、预定义宏
USE_HAL_DRIVER 表示使用HAL库。
STM32F407xx 表示使用F407系列。
USE_FULL_LL_DRIVER表示使用LL库。
2、选择0级优化,优化等级低,方便调试。
如何做MDK编译器的代码最小优化和性能最佳优化
MDK之前做的应用笔记:http://www.armbbs.cn/forum.php?mod=viewthread&tid=1794 。
选项One ELF Section per Function用于删除工程中没有用到的冗余函数。
3、使用C99规范,在第9章有介绍。
4、添加路径,把用到的头文件路径包含进来,点击最右侧的小按钮,弹出如下界面进行添加即可:
Asm选项
这个选项用不到,不用管。
Linker选项
这个选项用不到,不用管。
Debug选项
- 软件仿真不推荐大家用,问题比较多。
- 硬件仿真,这里选择的JLINK,大家根据自己用的那种调试器选择相应型号即可。
Utilities选项
这个选项主要用于编程工具选择,大家根据自己用的那种下载器选择相应型号即可。
Update Target before Debugging表示调试前更新芯片的程序。
6.验证是否创建成功
点击全编译:
编译结果:0错误,0警告,编译成功。
7.MDK的字体,多核并行编译,语法提示等设置
这里将MDK经常用到的设置做个说明。
1.Tab Size设置
默认Tab size 为4,
弹出的窗口里面设置Tab size为4:
2.使能多核并行编译
电脑有几个核,都选上,加快编译速度。
3.字体设置
使用微软雅黑,而且可以防止复制粘贴的时候出现乱码问题,字体下载在此贴 。
安装微软雅黑的时候要注意,电脑端默认自带了一个微软雅黑,安装的时候会出现字体是躺着的。
4.语法提示和语法检测功能
MDK的语法提示和语法检测功能还行,可以根据需要开启:
HAL库相关
1.HAL库的配置文件
HAL库有一个专门的配置文件叫stm32f4xx_hal_conf.h
一个很重要的参数,就是HSE_VALUE,板子使用的实际晶振大小一定要与这个数值一致。
比如V6的外置晶振是8MHz,那么这里就务必配置宏定义为:
#define HSE_VALUE ((uint32_t)8000000)
1. /* ########################## Module Selection ############################## */
2. /**
3. * @brief This is the list of modules to be used in the HAL driver
4. */
5. #define HAL_MODULE_ENABLED
6. #define HAL_ADC_MODULE_ENABLED
7. #define HAL_CAN_MODULE_ENABLED