STM32学习笔记(一)

STM32学习总结



前言

记录学习过程中的一些问题


F1与F4的区别是什么?

  1. F1采用Crotex M3内核,F407采用Crotex M4内核。
  2. F1最高主频 72MHz, F407最高主频168MHz。
  3. F407具有单精度浮点运算单元,F1没有浮点运算单元。
  4. F407的具备增强的DSP指令集。F407的执行16位DSP指令的时间只有F1的30%70%。F407执行32位DSP指令的时间只有F1的25%60%。
  5. F1内部SRAM最大64K字节, F407 SRAM有192K字节(112K+64K+16K)。
  6. F407有备份域SRAM(通过Vbat供电保持数据),F1没有备份域SRAM。
  7. F407从内部SRAM和外部FMC存储器执行程序的速度比F1快很多。F1的指令总线I-Bus只接到Flash上,从SRAM和FMC取指令只能通过S-Bus,速度较慢。F407的I-Bus不但连接到Flash上,而且还连接到SRAM和FMC上,从而加快从SRAM或FMC取指令的速度。
  8. F1最大封装为144脚,可提供112个GPIO;F407最大封装有176脚,可提供140个GPIO。
  9. F1的GPIO的内部上下拉电阻配置仅仅针对输入模式有用,输出时无效。而F407的GPIO在设置为输出模式时,上下拉电阻的配置依然有效。即F407可以配置为开漏输出,内部上拉电阻使能,而F1不行。
  10. F407的GPIO最高翻转速度为90MHz,F1最大翻转速度只有18MHz。
  11. F1最多可提供5个UART串口,F407最多可以提供6个UART串口。
  12. F1可提供2个I2C接口,F407可以提供3个I2C接口。
  13. F1和F407都具有3个12位的独立ADC,F1可提供21个输入通道,F407可以提供24个输入通道。F1的ADC最大采样频率为1Msps,2路交替采样可到2Msps(F1不支持3路交替采样)。F4的ADC最大采样频率为2.4Msps,3路交替采样可到7.2Msps。
  14. F1只有12个DMA通道,F407有16个DMA通道。F407的每个DMA通道有4*32位FIFO,F1没有FIFO。
  15. F1的SPI时钟最高速度为 18MHz, F407可以到37.5MHz。
  16. F1没有独立的32位定时器(32位需要级联实现),F407的TIM2和TIM5具有32位上下计数功能。
  17. 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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值