徐松亮STM32教学-嵌入式工程师培训资料(重磅资料)
版权声明:本文为博主徐松亮的原创作品,未经允许不得转载,多谢支持!QQ:5387603
推荐点击此链接:欢迎进入徐松亮博客一站式导航搜索(随时更新)
之所以所这篇资料是重磅资料,是因为基于STM32开发产品,我拥有近10年的开发经验,属于饭碗级的看家本领,这篇是我工作中给新入职工程师培训用的文档之一,可供参考价值本人认为还是很高的,工程源码链接后续会上传。
目录
IDE(Integrated Development Environment)介绍与安装
15,推荐软件---Source Insight(资料过时,安装SI4x版)
1,ARM简介
-
ARM公司介绍
- 1978年英国剑桥创办CPU公司
- 1979年CPU公司改名为Acorn计算机公司
- 1985年设计第一代32位6Mhz处理器,简称ARM(Acorn RISC Machine)
- 1990年Acorn公司改名为ARM公司。苹果出150万英镑,芯片厂商VLSI出25万英镑,Acorn本身150万英镑和12名工程师入股。办公地点非常简陋,就是一个谷仓。
- 20世纪90年代推广到世界范围,占据低功耗,低成本和嵌入式应用领域。ARM公司不生产芯片,只出售芯片技术授权。
-
IP核发展
-
-
ARM授权厂商(大于175个)
-
-
Cortex-M内核介绍
- M3内核是Cortex系列第一内核,2005年发布
-
- M4内核2010年发布
- M4特有指令集:浮点指令,SIMD指令(单指令多数据),快速MAC指令(乘累加)
- Cortex-M内核的优势及应用
- 被认为是RISC(简单指令),但是有大量指令和混合指令,使其更具备CISC(复杂指令)性能。
- 低功耗,高性能,代码密度小,快速中断响应,功能强劲的调试组件
- 超低价:最便宜不足0.5美元(STM32F030)。
- M3内核是Cortex系列第一内核,2005年发布
-
ARM资源获取
- ARM官网:
- ST官网:
- FreeScale:
- Atmel:
- NXP:
- TI:
- KEIL:
- IAR:
2,ST意法半导体介绍
-
7.3.1 发展史
- 1987年由意大利的SGS微电子公司与法国Thomson半导体公司合并而成
- 1994年成为上市公司
- 1998年5月改名为意法半导体有限公司
- 公司总部在瑞士日内瓦,11500研发人员,48000员工总数,销售全球
- 世界最大的半导体公司之一,多重电子领域。
-
7.3.2 MCU生态系统
-
-
7.3.3 STM32之选型
- 手册链接:
- Cortex-M0(Cortex-M0+) 低功耗小尺寸
- Cortex-M3 高性能丰富的外设
- Cortex-M4 DSP与浮点运算
-
- Cortex-M7 更高的数字信号处理性能
- 可以在手机端安装APP st器件查找.apk
- 产品型号说明
-
-
- 选型注意事项:更多关注市场主流型号,供货周期短,且性价比更高。
3,STM32之开发环境
-
硬件开发工具:
- ST-LINK ST厂家开发
- J-LINK Segger开发(V8(基于Atmel-ARM7开发) V9(基于STM32开发))
- ULINK MDK厂家开发
-
软件开发工具:
- 免费解决方案:CooCox,emIDE。。。
- 商业解决方案:IAR EWARM,KEIL MDK。。。。
-
CMSIS
-
Cortex Microcontroller Software Interface Standard
-
-
-
嵌入式软件
- 底层驱动
- 固件库
- ST DSP库
- ST的板级支持包(BSP)
- 固件协议栈
- RTOS
- 免费的FreeRTOS
- 商业的uCOS ,embOS
- USB
- 免费的ST USB
- 商业的emUSB,uC/USB
- TCP/IP
- 免费的UIP,Lwip
- 商业的embOS/IP,uC/TCPIP
- File systems
- 免费的FatFS
- 商业的uC/FS,emFile
- Graph
- 免费的STemWin
- 商业的TouchGFX
- RTOS
- 底层驱动
4,STM32资源获取
- 官网
- www.st.com
- STM32/STM8社区
- STM32固件库源码下载地址
- DSP和标准外设库
- 资源编号:STSW-STM32065
- 资源名称:STM32F4 DSP and standard peripherals library
- 下载地址:
- USB库
- 资源编号:STSW-STM32046
- 资源名称:STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device
- 下载地址:
- ETH以太网库
- 资源编号:STSW-STM32046
- 资源名称:LwIPTCP/IP stack demonstration for STM32F4x7 microcontrollers
- 下载地址:
- DSP和标准外设库
- STM32的几个重要文档
- 参考手册(Reference Manual)
- 对芯片每个模块的具体描述和功能介绍,比如我们要查 USAR相关寄存器和功能的介绍就可以使用这个手册。
- 数据手册(Data Sheet)
- 芯片引脚定义、电气特性、机械封装、料号定义。在我们要画PCB 的时候用到这个手册的时候比较多,这个手册上面有关于这个系列芯片的引脚定义,和封装等信息。
- 勘误手册(Errata Sheet)
- 描述了芯片某些功能的局限性,并给出问题的时候,就需要查找一下了,看看是否给出出解决办法。这个手册也比较重要,有时候我们觉得有些地方调试老是了解决方案。
- 闪存编程手册(Flash Programming Manual)
- 对芯片片上闪存的操作指南、读写保护设置,选项字节信息。
- 内核编程手册(Cortex-M Programming Manual)
- 对内核的系统控制块寄存器的描述。这个手册有的时候也要用到,比如我们需要了解 NVIC 和SysTick 相关的寄存器,就需要使用这个手册,这个手册可以在 ARM 官方网站下载,也可以到ST 官网下载,区别就是 ARM 方法的是通用的,ST 发的是针对自己的芯片做的,有时候在参考手册上面找丌到相关寄存器的信息时,就需要这个手册。
- 应用文档(Application Note)
- 针对不同应用主题的描述性文档;常常有不其搭配的固件例程。应用文档的重要性不言而喻,很多时候官方对于一些用于做出了一些解决方案,都会在应用文档里面进行说明
- 用户手册(User Manual)
- 一般是对某个软件库的说明文档
- Cortex-M3/M4权威指南
- 这也是非常重要的参考资料,对于有兴趣了解 M3/M4 内核的同学,这个资料相当重要,了解了内核才能更好的利用 M3/M4。
- 参考手册(Reference Manual)
5,STM32之开发环境搭建
-
IDE(Integrated Development Environment)介绍与安装
- IDE的组成
- C compiler C编译器 将C文件编译成obj文件
- Assembler 汇编器 将汇编文件编译成obj文件
- Linker 链接器 将多个obj文件连接为一个可执行文件
- Flash Programmer 将可执行文件下载到MCU的Flash内
- Debugger 调试器 硬件在线调试,程序执行和系统状态监测
- Simulator 模拟器 软件模拟MCU执行程序
- Other utilities 其他工具 如生成bin文件等
- MDK和IAR工作流程
-
- MDK的安装和注册
- 官方下载地址: https://www.keil.com/download/product/
- MDK5以上的版本需要另外安装器件库。
- IDE的组成
-
JLINK安装
-
串口打印
- SecureCRT是最好的串口工具,但需要**安装
- sscom42.exe是最方便的串口工具
6,STM32之内存映射
-
CPU内部Flash
- 0x08000000 ~ 0x080FFFFF 容量1MB
-
CPU内部SRAM1
- 0x20000000 ~ 0x2001FFFF 容量128KB
-
CPU内部SRAM2
- 0x10000000 ~ 0x1000FFFF 容量64KB
-
内存映射表
7,STM32之MDK工程配置
- 7.8.1 Options for Target---Device
-
- 7.8.2 Options for Target---Target
-
- 关于微库:做了深度优化,比使用标准库所需的RAM和FLASH空间都大大减少,比如<math.h><stdlib.h><stdio.h><string.h>,但只有库无源文件。
-
- 7.8.3 Options for Target---Output
- 7.8.4 Options for Target---User
-
- 7.8.5 Options for Target---C/C++
-
- 7.8.6 Options for Target---Debug
-
- 7.8.7 Options for Target---Utilities
-
- 7.8.8 Options for Group…(Options for File…)
-
- 7.8.9 Manage Project Items---Project Items
-
- 7.8.10 Manage Project Items---Folders/Extensions
-
- 7.8.11 Pack Installer
-
- 7.8.12 Target Driver Setup
8,STM32之工程架构
-
目录结构与MDK工程结构
-
新项目步骤
- 将当前项目设为Base-STM32F4项目,这个项目为STM32F4的基本项目,这个项目只保留了OS,RTC与USB-Debug功能,无任何其他功能。
-
- 进入项目管理,点击新建项目目标,如下图
-
- 比如建立了一个名字为TEST的工程
-
- 因为之前已经把当前项目设为了Base-STM32F4项目,所以新建的TEST项目是完全继承与Base-STM32F4项目,所有配置与之完全相同。
-
- 设置编译后生成的生产文件名称。
-
- 测试基本工程软件与硬件是否能成功运行。
- 下载Boot程序
- 下载本工程
- 连接USB到电脑
- 电脑端打开串口调试助手,点击ESC,应有调试信息输出。
-
- 在工程配置中给项目命名
-
- 这个步骤就是相当于在编译之前宏定义一个项目名称,用来区分不同的项目,因为这个工程是一个超级工程,它支撑了所有产品代码,不同的产品硬件接口与功能是不一样的,但是我们为了今后维护的方便,所以给每个项目宏定义了一个唯一的名称标识。
- 比如看Bsp_Tim.h文件,用以下与编译语句即可实现支持所有产品,表述了每个产品要放在定时器处理的函数,要着重关注红框的结构:
-
-
- 开启(使能)相关驱动文件
- 在编译器中使能文件编译
- 参考上图,在驱动中加入自己项目的需求。
- 用Debug来测试每个驱动文件的正确性。
- 根据需求建立不同任务并分配优先级与堆栈。
- 将当前项目设为Base-STM32F4项目,这个项目为STM32F4的基本项目,这个项目只保留了OS,RTC与USB-Debug功能,无任何其他功能。
9,STM32之Map与Htm文件
-
什么是Map文件
- 文件与文件之间的关联;
- 函数与变量所在的绝对地址
- 全部工程与每部分代码所占用的空间信息。
- 编译通过后,鼠标在MDK的Project页面双击项目名称,就可以显示出Map文件。
-
名词解释
- Code 程序代码
- Inc.data 内联数据(如文字池和短字符串)
- RO Data 常量
- RW Data 已初始化的变量
- ZI Data 零初始化的变量
- Debug 调试代码(与实际关系不大)
- 另:
- .text 与RO-code同义
- .constdata 与RO-data同义
- .bss 与ZI-data同义
- .data 与RW-data同义
-
目的
- 优化缩减代码。
- 查看函数与变量的绝对地址
- 文件函数间的调用关系
-
- 红框内语句表示main.c中的App_TaskStart函数调用了Bsp_rtc.C中的BspRtc_Init函数
-
- 优化缩减代码。
-
MDK需要配置的选项
-
htm文件
- 目的:统计函数的栈使用情况(不考虑中断嵌套)。
- 示例贴图如下:
10,STM32的三种启动方式
- 从Flash启动 : 正常运行时选择这种模式
- 从系统存储器启动 : ISP(In-System Programming 在系统可编程)下载使用
- 从内嵌SRAM启动 : 调试用,目前很少使用
11,数据类型,变量与堆栈
-
ANSI C和ISO C历史
- 1983年,美国国家标准协会(ANSI)组成了一个委员会来创立C语言的标准。因为这个标准是1989年发布的,所以一般简称C89标准,也有人称ANSI C。
- 1990年,ANSI C89标准被国际标准化组织(ISO)和国际电工委员会(IEC)采纳为国际标准,名叫ISO/IEC9899:1990-Programming languages C,简称C90标准,与C89为同一标准。
- 2000年3月,国际标准化组织(ISO)和国际电工委员会(IEC)采纳了第二个C语言标准,名叫ISO/IEC9899:1999-Programming languages C,简称C99标准。
- 2011年12月,国际标准化组织(ISO)和国际电工委员会(IEC)采纳了第三个C语言标准,名叫ISO/IEC9899:2011-Programming languages C,简称C11标准。
-
ARM架构数据类型
-
推荐头文件stdint.h对数据类型的定义
- stdint.h是c99中引进的一个标准C库的头文件,目前大部分单片机C编译器均支持,IAR和MDK都支持。下面是部分内容:
- /* exact-width signed integer types */
- typedef signed char int8_t;
- typedef signed short int int16_t;
- typedef signed int int32_t;
- typedef signed __INT64 int64_t;
- /* exact-width unsigned integer types */
- typedef unsigned char uint8_t;
- typedef unsigned short int uint16_t;
- typedef unsigned int uint32_t;
- typedef unsigned __INT64 uint64_t;
- 常用的定义方式如下:
- u8 err; 不推荐
- U8 err; 不推荐
- INT8U err; 不推荐
- UINT8 err; 不推荐
- uint8 err; 不推荐
- uint8_t err; 重点推荐,因为符合C99规范。
- stdint.h是c99中引进的一个标准C库的头文件,目前大部分单片机C编译器均支持,IAR和MDK都支持。下面是部分内容:
-
7.12.4 局部变量与全局变量
- 能用局部变量,绝不要定义到全局,有以下缺点:
- 合作开发容易重名
- 全局变量是开放给别人用的变量,增加数量会使合作者烟花缭乱
- 会使程序结构差,形成一张蜘蛛网。
- 占用绝对空间
- 移植代码还要移植全局变量,将会使人头痛。
- 如果单函数调用,但函数退出不能清0,那就用static,也好过全局。
- 命名要符合公司命名标准。
- 要善于使用内存申请与释放的方式。(避免用malloc 和free系统函数,而是用自己编写的申请与释放函数)。
- 变量函数要分类,必要时用结构体分类,尤其是开放给别人用的全局变量。
- 能用局部变量,绝不要定义到全局,有以下缺点:
-
7.12.5 堆栈
- 栈(stack)空间:后进先出结构,用于局部变量,函数调用时现场保护和返回地址,函数形参等。
- 堆(heap)空间:先进先出结构,用于malloc,calloc,realloc等函数分配的变量空间。
- 设定堆栈空间的大小:
-
- 如果是无系统工程,要根据函数的局部变量与调用深度来决定栈空间大小,实际上很少人去计算,通常也是默认值即可,但是要严格控制局部变量。
- 如果是用uCOSIII系统,因为每个任务都有独立的栈空间,所以这个设定只用于系统任务启动前,所以可以设为很小。
- 因为我们不建议使用malloc等系统自带的内存管理函数,所以堆空间也可以设为非常小。
- 实例:
12,STM32之存储器分配与IAP
- 相关文件
- Bootloader.c Boot代码
- Bsp_CpuFlash.c 读写芯片内部Flash的底层代码。
- IAP.c 应用层升级代码。
- 读写操作(代码详见Bsp_CpuFlash.c):
- 读:指定地址任意读
- 写:先擦后写,但是擦的最小单位就是扇区
- 由上可知,如果要修改一个字节,流程为把整个扇区备份到另一个扇区,将备份区回写到要写入的扇区,在此过程中修改要修改的数据。然后再删除备份扇区。
- 为什么不在内存中修改数据?因为如果没有备份扇区,将数据读到内存后,就要擦除扇区,如果此时断电,所有数据将全部丢失。
- 怎么保证掉电丢失?上电查看备份扇区,如果有有效数据,则把数据恢复到参数扇区。
- STM32F1与STM32F4的FLASH目前分配(Bsp_CpuFlash.h):
- STM32F1:2KB为一个扇区,固定单位。
- STM32F4:
- 0x08000000~0x08003FFF 16KB 扇区0 Boot区
- 0x08004000~0x08007FFF 16KB 扇区1 参数存储
- 0x08008000~0x0800BFFF 16KB 扇区2 参数备份
- 0x0800C000~0x0800FFFF 16KB 扇区3 APP区
- 0x08010000~0x0801FFFF 64KB 扇区4 APP区
- 0x08020000~0x0803FFFF 128KB 扇区5 APP区
- 0x08040000~0x0805FFFF 128KB 扇区6 APP区
- 0x08060000~0x0807FFFF 128KB 扇区7 APP区
- 0x08080000~0x0809FFFF 128KB 扇区8 G才有此区
- 0x080A0000~0x080BFFFF 128KB 扇区9 G才有此区
- 0x080C0000~0x080DFFFF 128KB 扇区10 G才有此区
- 0x080E0000~0x080FFFFF 128KB 扇区11 G才有此区
- APP程序相对普通程序的三个修改点:
- 主函数中断向量偏移设置(main函数):
- 目标配置
-
- Jlink目标地址配置:
- 主函数中断向量偏移设置(main函数):
13,STM32之USB-Debug调试
-
目的
- 每个项目的按键小灯接口不同,也不一定会有LCD,即使是串口,也很难接口统一,唯有USB从机,一般来说我们目前的项目对其无任何应用,即使有也可以通过技术手段与调试并存,而且硬件成本极低,只需要一个几毛钱的USB接头即可与PC建立通讯。所以我选择了USB从机接口作为与PC机的终端接口,将USB开发为VCP模式(USB虚拟串口),自主研发了类似于DOS界面的嵌入式软件代码,PC端只需要串口调试助手即可与设备进行数据通讯。
-
-
条件
- 板子上带有USB接口
- PC安装厂商驱动软件STM32 USB转串口驱动 Virtual COM Port Driver(V1.3.1)
- PC端有串口工具,如sscom42.exe
-
指令
- “Esc” 显示指令列表并等待指令 或 退出当前测试模式
- “指令”+“Enter” 等待指令时,依次按两个按键,可运行相应测试项
- 10秒无按键操作,则退出等待指令模式,需按“Esc”重新进入
-
编写调试代码
- 接口文件 uctsk_Debug.h
- 功能结构体(uctsk_Debug.h---Debug_S_Menu)
-
- 实例
-
- 步骤
- 在uctsk_Debug.h中加入头文件
-
-
- 在uctsk_Debug.h中Debug_MenuTab表加入实体代码
-
- 在uctsk_Debug.h中加入头文件
- 注意
- 编写入口与回调函数 参数和返回值结构固定为下图红框函数
-
- 具体函数实现参照源码实例即可,在此不再详述。
- 编写入口与回调函数 参数和返回值结构固定为下图红框函数
14,公司编程简易标准
-
名称标准
- 数据结构宏定义
- 使用stdint.h的标准库描述通用类型,如uint8_t等,不准再使用char int等表达,因为不同的芯片及不同的开发环境int表达的长度不同.
- 文件名称
- 任务层应用用uctsk_Xxx来表达
- 模块层用Module_Xxx来表达
- 驱动层用Bsp_Xxx来表达
- 名称不准与标准c语言库文件名相同,如time.h,stdio.h…
- 宏定义名称
- 全大写,格式:文件名_描述类别_描述内容,常数带括号,按需加L
- 例如: #define UCTSK_RFMS_UART_BPS (19200)
- 常量名称
- 全大写:格式:文件名_描述类别_描述内容
- 例如: const uint8_t MAIN_STR_TEST[]="123";
- 结构体名称
- 格式:文件名_S_描述: MODULE_MEMORY_S_FILEINFO
- 函数名称
- 首字母大写,格式:文件名_含义
- 例如: void Module_Memory_Init(void);
- 枚举名称
- 全大写,格式:文件名_E_描述类别
- 例如: MODULE_MEMORY_E_SLEEPLEVEL
- 数据结构宏定义
-
善于应用C语言指针
- 指针提高运行时间
- 指针减少内存占用空间
- 函数返回数据
- uint8_t ReadRealTime(uint8_t *time,tm *CurrentTime_tm);
- 结构体的强制转换
- //编译器地址对齐问题
- uint32_t MemberTestBuf[256/4];
- //定义结构体指针
- S_MEMORY_VER *p_Ver;
- //指向缓存
- p_Ver=(S_MEMORY_VER*) MemberTestBuf;
- //缓存清空
- memset((INT8U*)p_Ver,0,sizeof(S_MEMORY_VER));
- //赋值
- p_Ver-> Type=1;
- //访问
- I= p_Ver-> Type;
- //编译器地址对齐问题
- 注意:一定认真弄懂什么时候用 * & . ->
-
关于.h文件
- 描述接口硬件宏定义
- 描述接口数据结构
- 描述接口变量
- 描述接口函数
- 在.h文件中只表述与外界相关的接口与配置宏定义,接口的函数和变量,对内使用的变量及宏在.c中表达,不要开放到.h中,详见Bsp_Led.h
-
关于.c文件(理念:函数数量越少越好)
- 驱动层
- 初始化
- 周期性处理函数(例如:用于温度非阻塞式读取)
- 功能性处理函数(例如:用于温度阻塞式读取)
- Debug测试函数(符合uctsk_Debug.h使用标准)
- 模块层
- 详见Count.c(.h)
- 任务层:
- 任务创建函数
- 任务实体函数
- 接口函数
- Debug测试函数(符合uctsk_Debug.h使用标准)
- 驱动层
-
程序模块的独立可移植性
- 终极理念: 每个.c/.h文件都可以独立移植应用(最好做到只改变.h文件即可)。详见Bsp_Led.c.h,
15,推荐软件---Source Insight(资料过时,安装SI4x版)
-
目的
- 相对于直接在编译器环境编程,可以大幅度提高编程效率。
- 利用AStyle插件来自动化的格式化文件格式,使多人合作项目的相关程序文件做到格式绝对的统一.这样也有利于后期用程序对比软件的识别.
-
安装步骤
- 安装Si35Setup.exe,安装后,记得注册Sn.txt中三个***之一
-
启动配置
- 打开Base项目(Project---Project Name---Base),将配置文件夹中的Chnchar.em,codeReview.em,quicker.em加入到此项目中(鼠标拖动即可)
-
-
- Options---Load Configuration---Load 载入配置文件XSL.CF3
- 打开Base项目(Project---Project Name---Base),将配置文件夹中的Chnchar.em,codeReview.em,quicker.em加入到此项目中(鼠标拖动即可)
-
加载AStyle插件
- SourceInsigned---Options---Custom Commands---Add,在弹出对话框中写入命令名Astyle,在Run中写入下面内容(格式化当前文件指令):
- "C:\lb\AStyle\bin\Astyle.exe" --style=ansi -s4 -S -N -L -m0 -M40 --convert-tabs --suffix=.pre %f
- 路径相关的内容按实际安装路径和项目路径改动,之后点击RUN。
-
- SourceInsignedOptionsCustom CommandsAdd,在弹出对话框中写入命令名Astyle,在Run中写入下面内容(格式化当前文件指令):
- "D:\lb\AStyle\bin\Astyle.exe" Z:\LocalProject /*.c Z:\LocalProject /*.h --style=ansi -s4 -S -N -L -m0 -M40 --recursive --convert-tabs --suffix=.pre %f
- 路径相关的内容按实际安装路径和项目路径改动,之后点击RUN。
-
- 定义格式化快捷键: SourceInsignedOptionsCustom CommandsKeys…
-
- 点击”Assign New Key…” 之后按想设置的快捷键:
- 建议: Astyle 为 Ctrl+Alt+F
- 建议: Astyle All为Ctrl+Alt+G
- SourceInsigned---Options---Custom Commands---Add,在弹出对话框中写入命令名Astyle,在Run中写入下面内容(格式化当前文件指令):
-
常用快捷键
- Alt+X: 上次光标定位
- Alt+C: 下次光标定位
- Alt+E: 进入函数实体/变量定义处
- Alt+A: 程序那些地方调用或函数
- Ctrl+?: 搜索
- Shift+F8: 高亮
- ……
- 查看/设定所有快捷键:OptionCustom CommandsKeysList,会输出快捷键链表文件。
16,推荐软件---BCompare
-
目的
- 多人合写项目程序,必定要涉及程序的整合.
- 原来程序正常,现程序异常,潜在问题追溯。
-
安装步骤
- 安装BCompare-zh-3.3.5.15075,安装后,记得注册Key.txt中***
-
装载配置
- BCSettings.bcpkg
-
常用方法:
- 安装后,重启电脑,会在鼠标右键中”选择左侧文件夹比较”,”和XXX”比较,选择两个文件或文件夹后会软件会自动启动.
- 软件打开后,建议先选择所有文件,然后执行一遍比较内容(Alt+W),系统会把完全一样的文件屏蔽掉.
- 因为软件是中文的,更多的功能同事还要自己探索.
-
**方法:
- 有key可以输入即可,但是有时会被远程无效,解决方法:找到“C:\Users\Administrator\AppData\Roaming\Scooter Software\Beyond Compare 3”目录,然后将这个目录下的所有文件都删除掉,重新打开“Beyond Compare”工具,然后重新输入****一下就可以重新正常使用了。