STM32介绍
单片机
STM32命名
STM32 VS 51
armV7的三个系列
A:针对操作系统
R:针对实时系统
M:针对微控制器
STM32系统结构
ARM是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而TI,ST这样的公司,他们并不做标准,他们是芯片公司,他们是根据ARM公司提供的芯片内核标准设计自己的芯片。
- STM32F103~7使用了cortex-M3内核,简称1系列
- STM32F4xx使用cortex-M4内核
- 不同公司设计的Cortex-M4芯片他们的端口数量,串口数量,控制方法这些都是有区别的
四个驱动单元是: - 内核 DCode 总线;
- 系统总线;
- 通用 DMA1;
- 通用 DMA2;
四被动单元是:
- AHB 到 APB 的桥:连接所有的 APB 设备;
- 内部 FlASH 闪存;
- 内部 SRAM;
- FSMC;
CMSIS标准
为了能让不同的芯片公司生产的Cortex-M4芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准CMSIS标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。ST官方库就是根据这套标准设计的。
基于CMSIS应用程序基本结构如下图:
CMSIS分为3个基本功能层:
- 核内外设访问层:ARM公司提供的访问,定义处理器内部寄存器地址以及功能函数。
- 中间件访问层:定义访问中间件的通用API。由ARM提供,芯片厂商根据需要更新。
- 外设访问层:定义硬件寄存器的地址以及外设的访问函数。 我们所说的固件库基本上是指这部分,主要由芯片生产商提供。
- CMSIS-DSP 层:包含各种 DSP 处理的运算库函数,主要由 ARM 公司提供。
- CMSIS 实时系统 API 层:包含了一些系统接口,主要由系统软件厂商定制。
从图中可以看出,CMSIS层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。
- 如果没有CMSIS标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而CMSIS标准就是要强制规定,芯片生产公司设计的库函数必须按照CMSIS这套规范来设计。
- CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。
CMSIS规范就规定,系统初始化函数名字必须为SystemInit,所以各个芯片公司写自己的库函数的时候就必须用SystemInit对系统进行初始化。
- CMSIS还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。
STM32F4方包绍官方库包
Libraries文件夹下面有CMSIS和STM32F4xx_StdPeriph_Driver两个目录
- CMSIS文件夹存放的是符合CMSIS规范的一些文件。包括STM32F4核内外设访问层代码,DSP软件库,RTOS API,以及STM32F4片上外设访问层代码等。
- STM32F4xx_StdPeriph_Driver放的是STM32F4标准外设固件库源码文件和对应的头文件。
- inc目录存放的是stm32f4xx_ppp.h头文件,无需改动。
- src目录下面放的是stm32f4xx_ppp.c格式的固件库源码文件。
Libraries文件夹里面的文件在我们建立工程的时候都会使用到。
Project文件夹下面有两个文件夹。
- STM32F4xx_StdPeriph_Examples文件夹下面存放的的ST官方提供的固件实例源码,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都参考了官方提供的例程源码,这些源码对以后的学习非常重要。
- STM32F4xx_StdPeriph_Template文件夹下面存放的是工程模板。
Utilities文件下就是官方评估板的一些对应源码,这个对于本手册学习可以忽略不看。
STM32F103
STM32F103资源
- 64KB SRAM
- 512KB FLASH
- 2 个基本定时器、4 个通用定时器、2 个高级定时器
- 2 个 DMA 控制器(共 12 个通道)
- 3 个 SPI
- 2 个 IIC
- 5 个串口
- 1 个 USB
- 1 个 CAN
- 3 个 12 位 ADC、1 个 12 位 DAC
- 1 个 SDIO 接口、1 个 FSMC 接口
- 112 个通用 IO 口
- 84个中断,16个可编程优先级,任意脚中断
- 带有外部总线(FSMC)可以用来外扩 SRAM 和连接 LCD 等
STM32F103总线架构
四个驱动单元是:
- 内核 DCode 总线;
- 该总线将 M3 内核的 DCode 总线与闪存存储器的数据接口相连接,常量加载和调试访问在该总线上面完成。
- 系统总线;
- 系统总线:该总线连接 M3 内核的系统总线到总线矩阵,总线矩阵协调内核和 DMA 间访
- 通用 DMA1;
- 通用 DMA2;
- DMA总线将 DMA 的 AHB 主控接口与总线矩阵相连,总线矩阵协调 CPU 的DCode 和 DMA 到 SRAM,闪存和外设的访问。
四被动单元是:
- AHB 到 APB 的桥:连接所有的 APB 设备;
- AHB/APB 桥:这两个桥在 AHB 和 2 个 APB 总线间提供同步连接,APB1 操作速度限于36MHz,APB2 操作速度全速。
- 内部 FlASH 闪存;
- 内部 SRAM;
- FSMC;
总线矩阵
- 总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利用轮换算法。
ICode总线
- 该总线将 M3 内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。
STM32F103引脚
STM32名词解释
英文缩写
ARM:Advanced RISC Machine
AAPCS:ARM Architecture Process call standard ARM体系结构过程调用标准
RISC: Reduced Instruction Set Computer 精简指令集计算机
RTOS:Real Time Operating System 实时操作系统
DMA:Direct Memory Access 存储器直接访问
EXTI: External Interrupts 外部中断
FSMC: Flexible static memory controller 可变静态存储控制器
FPB:flash patch and breakpoint FLASH 转换及断电单元
HSE:Hign speed external 高速内部时钟
HSI: High speed internal 高速外部时钟
LSE: Low Speed external 低速外部时钟
LSI: Low Speed Internal 低速内部时钟
LSU: load store unit 存取单元
PFU: prefetch unit 预取单元
ISR:Interrupt Service Routines 中断服务程序
NMI: Nonmaskable Interrupt 不可屏蔽中断
NVIC: Nested Vectored Interrupt Controller
MCU:Microcontroller Unit 微控制单元又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。
MPU: Memory Protection Unit
MIPS:million instructions per second 每秒能执行的百万条指令的条数
RCC:Reset and clock control 复位和时钟控制
RTC: Real-Time Clock 实时时钟
IWDG: independent watchdog
WWDG:Window watchdog
TIM:timer 定时器
端口
AFIO:alternate function IO 复用IO端口
GPIO:general purpose input/output 通用IO端口
IOP(A-G):IO port A - IO port G (例如:IOPA:IO port A)
CAN:Controller area network
FLITF:The Flash memory interface 闪存存储器接口
I2C: Inter-integrated circuit 内置集成电路
IIS: integrate interface of sound 集成音频接口
JTAG:joint test action group 联合测试行动小组
SPI:Serial Peripheral Interface
SDIO: SD I/O
UART: Universal Synchr./Asynch. Receiver Transmitter
USB: Universal Serial Bus
寄存器相关
CPSP: Current Program Status Register 当前程序状态寄存器
SPSP: saved program status register 程序状态备份寄存器
CSR:clock control/status register 时钟控制状态寄存器
LR: link register 链接寄存器
SP: stack pointer 堆栈指针
MSP: main stack pointer 主堆栈指针
PSP:process stack pointer 进程堆栈指针
PC: program counter 程序计数器
调试相关
ICE:in circuit emulator 在线仿真
ICE Breaker 嵌入式在线仿真单元
DBG:debug 调试
IDE:integrated development environment 集成开发环境
DWT: data watchpoint and trace 数据观测与跟踪单元
ITM: instrumentation trace macrocell 测量跟踪单元
ETM: embedded trace macrocell 嵌入式追踪宏单元
TPIU:trace port interface unit 跟踪端口接口单元
TAP: test access port 测试访问端口
DAP: debug access prot 调试访问端口
TP: trace port 跟踪端口
DP:debug port 调试端口
SWJ-DP: serial wire JTAG debug port 串行-JTAG 调试接口
SW-DP: serial wire debug port 串行 调试接口
JTAG-DP:JTAG debug port JTAG 调试接口
系统类
IRQ: interrupt request 中断请求
FIQ: fast interrupt request 快速中断请求
SW:software 软件
SWI: software interrupt 软中断
RO:read only 只读(部分)
RW:read write 读写(部分)
ZI:zero initial 零初始化(部分)
BSS:Block Started by Symbol 以符号开始的块(未初始化数据段)
总线
Bus Matrix 总线矩阵
Bus Splitter 总线分割
AHB:advanced High-preformance Bus 高级高性能总线 AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内部的高速RAM、NAND FLASH、DMA、Bridge的连接。
APB:advanced peripheral bus 外围总线 APB用于连接外部设备,对性能要求不高,而考虑低功耗问题。
APB1: low speed APB 低速外围总线
APB2: high speed APB 高速外围总线
ASB :Advanced System Bus 系统总线 ASB是AHB的一种替代方案。
PPB: Private Peripheral Bus 专用外设总线
杂类
ALU:Arithmetic Logical Unit 算术逻辑单元
CLZ: count leading zero 前导零计数(指令)
SIMD: single instruction stream multiple data stream 单指令流,多数据流
VFP: vector floating point 矢量浮点运算
词汇/词组
Big Endian 大段存储模式
Little Endian 小段存储模式
context switch 任务切换(上下文切换)(CPU寄存器内容的切换)
task switch 任务切换
literal pool 数据缓冲池
STM32开发
学习之初,首推正点资料
固件库概念
FWlib叫固件库,FW的单词是Firmware.即固件的意思。STM32的固件库包含C文件和H文件,主要用于存放STM32的一些寄存器的定义及一些底层驱动函数
容量
对于 103 系列,主要是用其中 3 个启动文件
• startup_stm32f10x_ld.s: 适用于小容量 产品,小容量:FLASH≤32K
• startup_stm32f10x_md.s : 适用于中等容量产品,中容量:64K≤FLASH≤128K
• startup_stm32f10x_hd.s: 适用于大容量产品,大容量:256K≤FLASH
STM32启动模式
B0 B1 启动模式
0 X 主闪存存储器
1 0 系统存储器
1 1 内置SRAM
STM32软件
MDK介绍
- MDK是keil公司开发的,为基于Cortex、arm7、arm9等处理器设备提供的一个完整开发环境。
- MDK(Microcontroller Development Kit,字面的意思就是“微控制器开发套装”)。
- MDK(Microcontroller Development Kit,字面的意思就是“微控制器开发套装”)是keil公司开发的,为基于Cortex、arm7、arm9等处理器设备提供的一个完整开发环境。
- MDK源自德国的KEIL公司,是RealView MDK的简称。在全球MDK被超过10万的嵌入式开发工程师使用。
MDK5
MDK5向后兼容MDK4和MDK3等,以前的项目同样可以在MDK5上进行开发(但是头文件方面得全部自己添加)
- MDK5同时加强了针对Cortex-M微控制器开发的支持,并且对传统的开发模式和界面进行升级
- MDK5由两个部分组成:MDK Core和Software Packs。其中,Software Packs可以独立于工具链进行新芯片支持和中间库的升级。
- MDK Core又分成四个部分:uVision IDE with Editor(编辑器),ARM C/C++ Compiler(编译器),Pack Installer(包安装器),uVision Debugger with Trace(调试跟踪器)。
- Software Packs(包安装器)又分为:Device(芯片支持),CMSIS(ARM Cortex微控制器软件接口标准)和 Mdidleware(中间库)三个小部分
- 点击MDK5的Build Toolbar的最后一个图标调出Pack Installer,来进行各种组件的安装
MDK下载
官网下载地址
这里使用KEIL5 的版本是 MDK5.24。
MDK安装
o 在软件资料,1,软件,MDK5
o 无脑安装
• MDK5破解
o File license Mangement 复制CID
o 在keygen破解软件中运行CID 得到秘钥,记得选择32
o 用管理员身份打开MDK5,再次进入license Management 的New ID Code粘贴
生成HEX文件
点击魔术棒,进入配置菜单,选择 Output。然后勾上下三个选项。 其中 Create HEX file 是编译生成 hex 文件,Browser Information 是可以查看变量和函数定义。
支持包安装
要让MDK5支持STM32F407的开发,还要安装STM32F4的器件支持包:Keil.STM32F4xx_DFP .1.0.8.pack
包的下载地址是www.keil.com/dd2/pack 点击Install将会来此下载
可以下载软件,Keil.STM32F1xx_DFP.1.0.5.pack
双击安装
也可以进入之后
点击File-import
添加宏
因为 3.5 版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。
- c/c++界面,然后填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面
- 如果你用的是中容量那么STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。
添加头文件路径
对于任何一个工程,我们都需要把工程中引用到的所有头文件的路径都包含到进来 。
点击魔术棒 ,出来一个菜单,然后点击 c/c++选项.然后点击Include Paths 右边的按钮。
弹出一个添加 path 的对话框,然后我们将图上面的 3 个目录添加进去。
记住,keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得 path一定要定位到最后一级子目录。然后点击 OK.
库函数选择外设
3.5 版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。
c/c++界面,然后填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面
如果你用的是中容量那么STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。
MDK编译文件
MDK编译工程,会生成一些中间文件(.o .axf .map等),最终会生成HEX文件,以便下载到MCU上面执行,我们通常使用STM32工程中,output文件夹下面会生成十多种文件类型。
- .o文件:它是由编译器编译.c/.s文件时所产生的可重定向对象文件。
- 【注:①可重定向是指该文件包涵数据、代码,但是没有指定地址,他的地址可以由后续链接的时候进行指定,②不可重定向是指这种文件所包含的数据/代码都已经指定地址了,不能再改变】
- .axf文件:它是由armlink链接器,将整个工程参与编译的.o文件链接成一个可执行对象文件。它是不可重定向的。
- 【注】各类仿真器,在进行下载调试的时候都是用的,axf文件
- .hex文件:它是由.axf转换而来的一个可执行对象文件。
-
.hex文件和.bin文件的区别是:.bin文件不含地址信息,全部是可执行代码;而hex文件则是包含地址信息的可执行代码。同样的.bin文件也是由.axf文件转换而来的。可理解为带存储地址描述格式的 bin 文件。
-
在使用ISP软件进行程序下载的时候,一般使用的是.hex文件包含的地址信息来实现程序下载。 而我们在进行BootLoader升级的时候,一般使用的是.bin文件,地址有Bootloader程序指定。
-
- .htm文件:它是编译器在编译代码的时候生成的一个列表文件,包含了整个工程的静态调用图,最大用处就是可以查看栈深度(最小深度),方便设置栈的大小。.htm文件可以直接由浏览器打开。
- .map文件.map文件时编译器链接时生成的一个文件,它主要包含了交叉链接信息。通过.map文件,我们可以知道整个工程的函数调用关系、FLASH和RAM 占用情况及其详细的汇总信息。能具体到单个源文件(.c/.s)的占用情况,根据这些信息,我们可对代码进行优化。
编译输出
编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。
方法是点击魔术棒,然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面新建的 OBJ 目录。
这里大家注意,如果我们不设置 Output 路径,那么默认的编译中间文件存放目录就是 MDK 自动生成的 Objects 目录和 Listings 目录
第二个图标是全部重新编译按钮(工程大的时候,编译耗时较久,建议少用)
编译成功
从编译信息可以看出,我们的代码占用 FLASH 大小为:
1892 字节(1556+336),所用的 SRAM 大小为:1864 个字节(32+1832)。
Code:表示程序所占用 FLASH 的大小(FLASH)。
RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。
RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM)
ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM)
跳转
-
Go to Definition Of‘STM32_Clock_Init’ 这个地方,然后单击左键就可以快速跳到STM32_Clock_Init函数的定义处(注意要先在Options for Target的Output选项卡里面勾选Browse Information选项,再编译,再定位,否则无法定位。
-
Go to Reference To‘STM32_Clock_Init’ ,这个是快速跳到该函数被声明的地方
-
跨文件查找功能,先双击你要找的函数/变量名(这里我们还是以系统时钟初始化函数:Stm32_Clock_Init为例),然后再点击IDE上面的!
点击Find All,MDK就会帮你找出所有含有Stm32_Clock_Init字段的文件并列出其所在位置:
注意:MDK 一般把取值范围的宏定义放在判断有效性语句的上方,这样是为了方便大家查找
Keil问题与解决
FCARM - Output Name not specified, please check ‘Options for Target - Utilities’
这个错误是由于新导入到工程内的文件,未被正确识别而引发的错误。
原因:用户的.c和.h文件往往都是新建txt,然后改的后缀,这样的文件被导入keil后,有可能会被识别成image file。
解决:
选options for File …,查看如下:
将文件修改类型为C Source file即可。
flymcu使用
串口下载软件
- flymcu,该软件是mcuisp的升级版本(flymcu新增对STM32F4的支持),由ALIENTEK提供部分赞助,mcuisp 作者开发,该软件可以在 www.mcuisp.com 免费下载
- 特别提醒:不要选择使用 RamIsp,否则,可能没法正常下载。
- DTR 的低电平复位,RTS 高电平进 BootLoader
- 选中这个选择项选,flymcu就会通过 DTR 和 RTS 信号来控制板载的一键下载功能电路,以实现一键下载功能。这个是必要的选项(在 BOOT0 接 GND 的条件下)。
第 1 个圈,圈出了 flymcu 对一键下载电路的控制过程,其实就是控制 DTR和 RTS 电平的变化,控制 BOOT0 和 RESET,从而实现自动下载。
XCOM使用
串口调试助手,直接打开,设置串口即可(程序中要通过对应的usart发送内容)
新建一个工程
- 新建立一个文件夹为 Template
- 新建Project。Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹Template 之下,在这个目录下面建立子文件夹 USER。工程文件就都保存到 USER 文件夹下面。工程命名为Template,点击保存。
- USER 目录除了用来放工程文件外,还用来存放主函数文件 main.c,以及其他包括system_stm32f10x.c 等等。
- 选择型号。战舰 STM32F103 所使用的 STM32 型号为 STM32F103ZET6,所以在这里我们选择STMicroelectronics→STM32F1Series→STM32F103→STM32F103ZET6。一定要安装对应的器件pack才会显示这些内容
- 框架建立完毕
- 打开USER
- Template.uvprojx 是工程文件,非常关键,不能轻易删除。
- Listings 和 Objects文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件。为了跟 MDK5.1之前版本工程兼容,我们把两个文件夹删除,我们会在下一步骤中新建一个 OBJ 文件夹,用来存放编译中间文件。
- 添加启动代码,以及.c 文件等。在Template文件夹下新建 3 个文件夹 CORE, OBJ 以及STM32F10x_FWLib。
- CORE 用来存放核心文件和启动文件
- OBJ 是用来存放编译过程文件以及hex 文
- STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。
- 存放的是固件库函数
- 将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。
- 打开官方固件库包,定位到STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver
- 将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 STM32F10x_FWLib 文件夹下面。
- src 存放的是固件库的.c 文件
- inc 存放的是对应的.h 文件,
- 将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下
- 打开官方固件库包,定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
- 将文件 core_cm3.c和 文 件 core_cm3.h 复 制 到 CORE 下 面
- Core_cm3是cm3底层的一些文件
○ 定 位 到 目 录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm- 将里面 startup_stm32f10x_hd.s 文件复制到 CORE 下面
8 . 定位到目录:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
- 将里面的三个文件 stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们的 USER目录之下
- system_stm32f10x.c,比较重要,定义了系统初始化,在startup里面有被调用
- 定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
- 将 4 个文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h 复制到 USER 目录下面。
将固件库相关文件添加到工程中去。
- 右击Target1,选择Manage Project Items
-
修改工程结构。Project Targets一栏,我们将Target名字修改为Template,然后在Groups一栏删掉一个Source Group1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况。
-
往 Group 里面添加我们需要的文件。
- 右键点击点击Tempate,选择选择 Manage Project Itmes,然后选择需要添加文件的 Group,这里第一步我们 选 择 FWLIB , 然 后 点 击 右 边 的 Add Files, 定 位 到 我 们 刚 才 建 立 的 目 录STM32F10x_FWLib/src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add。
- 注意。如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f10x_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加。
- 将 Groups 定位到 CORE , CORE 下面需要添加的文件为 core_cm3.c,startup_stm32f10x_hd.s
- 将Groups定位到User,USER 目录下面需要添加的文件为 main.c,stm32f10x_it.c,system_stm32f10x.c.
运行main.c。 main.c 文件, 复制已有的 main.c覆盖已有代码,然后进行编译。
- . 正点原子提供的实验中,每个实验都有一个 SYSTEM 文件夹,下面有 3 个子目录分别为 sys,usart,delay,存放的是我们每个实验都要使用到的共用代码。
- 找到我们实验光盘, 打开任何一个固件库的实验,可以看到下面有一个 SYSTEM 文件夹。
- 在工程中新建一个组,命名为 SYSTEM,然后加入这三个文件夹下面的.c 文件分别为 sys.c,delay.c,usart.c.
- 接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件
关键 文件
F407新建工程注意点
1.STM32需要的文件
system_stm32f4xx.h是片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关的函数。
- 这个里面有一个非常重要的SystemInit()函数申明,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。
stm32f4xx.h是STM32F4片上外设访问层头文件。这个文件就相当重要了,只要你做STM32F4开发,你几乎时刻都要查看这个文件相关的定义。
- 这个文件打开可以看到,里面非常多的结构体以及宏定义。这个文件里面主要是系统寄存器定义申明以及包装内存操作。
- 同时该文件还包含了一些时钟相关的定义,FPU和MPU单元开启定义,中断相关定义等等
stm32f4xx_it.c和stm32f4xx_it.h里面是用来编写中断服务函数,中断服务函数也可以随意编写在工程里面的任意一个文件里面,个人觉得这个文件没太大意义。
stm32f4xx_conf.h是外设驱动配置文件。文件打开可以看到一堆的#include,这里建立工程的时候,可以注释掉一些你不用的外设头文件。
\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates
和STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include
2.M4内核需要的文件
core_cm4.h文件是CMSIS核心文件,提供进入M4内核接口,这是ARM公司提供,对所有CM4内核的芯片都一样。你永远都不需要修改这个文件。
\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Includ
3.外设驱动文件
misc.c和misc.h是定义中断优先级分组以及Systick定时器相关的函数。
stm32f3xx_rcc.c和stm32f4xx_rcc.h是与RCC相关的一些操作函数,作用主要是一些时钟的配置和使能。在任何一个STM32工程RCC相关的源文件和头文件是必须添加的。
对于文件stm32f4xx_ppp.c和stm32f4xx_ppp.h,这就是stm32F4标准外设固件库对应的源文件和头文件。包括一些常用外设GPIO,ADC,USART等
\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver
4.启动文件
启动文件主要是进行堆栈之类的初始化,中断向量表以及中断函数定义。启动文件要引导进入main函数。Reset_Handler中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。
- startup_stm32f40_41xxx.s
- Reset_handler在我们系统启动的时候会调用,下面让我们看看Reset_handler这段代码
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
这段代码的作用是在系统复位之后引导进入main函数,同时在进入main函数之前,首先要调用SystemInit系统初始化函数。
\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
5.对于STM32F40系列的工程,还需要添加一个全局宏定义标识符
STM32F40_41xxx,USE_STDPERIPH_DRIVER
至关重要,一个符号都不要错,最后面是空的
程序下载电路
USB 转串口,CH340G,是国内芯片公司南京沁恒的产品,稳定性经测试还不错,所以还是多支持下国产。
- 首先,mcuisp 控制 DTR 输出低电平,则 DTR_N 输出高,
- 然后 RTS 置高,则 RTS_N 输出低,这样 Q4 导通了,BOOT0 被拉高,即实现设置 BOOT0 为 1
- 同时 Q3 也会导通,STM32F4 的复位脚被拉低,实现复位。
- 然后,延时 100ms 后,mcuisp 控制DTR为高电平,则DTR_N输出低电平,RTS维持高电平,则RTS_N继续为低电平
- 此时STM32F4的复位引脚,由于 Q3 不再导通,变为高电平,STM32F4 结束复位
- 但是 BOOT0 还是维持为1,从而进入 ISP 模式,接着 mcuisp 就可以开始连接 STM32F4,下载代码了,从而实现一键下载。
STM32调试
JLink
JTAG与SWD是个接口,JLink指的是仿真器
串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 ST-LINK,JLINK 和ULINK 等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。
修复Jlink丢失固件问题
详情也可点击
1、查看Jlink的芯片型号,比如我打开盖子后是ATML AT91SAM7S64 这款芯片
2 使用短路帽短路ERASE端口
3.插入usb数据线
4.静止等待1分钟,什么都不要操作
5.断开usb数据线
6.断开ERASE短路
7.将短路帽放在TST端口,短路TST端口
8.插入usb数据线。上电,静置3分钟。这里比较关键,网上说有30秒的,有120秒的,我之前测试几次基本2分钟以上最保险,我就放3分钟不同他。
9.断电,拔下usb数据线。
10.断开TST短路帽。
11.插入数据线。
12.安装驱动,win7需要手动安装驱动。(在这之前要安装sam-ba_2.12.exe这个软件)
选择板子类型大部分都是at91sam7s64,这个可以在jlink芯片上看到
Jlink给目标板供电
外部电源给目标板供电:
跳线断开:外部电源输入到Jlink 1脚(此时的VCC变为Vref),为Jlink提供外部电压参考
Jlink给目标板供电:
跳线连接:Jlink3.3V通过1脚VCC输出
JTAG/SWD
调试原理
串行接口,就是SWD,通信数据线两根
JTAG,通信数据线五根,所以用SWD多
使用SWD的话,只需要SWDIO与SWCLK两个引脚。
使用JTAG的话,五个引脚都要用到。
SWD与JTAG的端口映射
默认的五个口不能作为IO口输出
认这五个引脚复位了之后都是用来仿真的,是不能正常使用的,只有禁止了相应的端口,才能释放IO引脚
JTAG/SWD硬件
STM32 的 SWD 接口与 JTAG 是共用的,只要接上 JTAG,你就可以使用 SWD模式了(其实并不需要 JTAG 这么多线),当然,你的调试器必须支持 SWD 模式,JLINK V7/V8、ULINK2 和 ST LINK 等都支持 SWD 调试。
设置禁止JTAG
(在文件stm32f10x_gpio.c中):调用该函数,有三个选项。407没有复用概念。
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
JLink配置
DeBug配置
魔法棒-Debug-JLInk
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执行 startup_stm32f10x_hd.s 文件的 Reset_Handler,再跳到main 函数
setting JLink
选择Jlink的时候一般选择10M,JTAG5M就可以了
- 在 Utilities 选项卡里面设置下载时的目标编程器
选择下载算法
STM32
进入 FLASH 算法设置Flash DownLoad,在setting的右边两个按钮
设置完之后,点击 OK,然后再点击 OK,回到 IDE 界面,编译一下工程。接下来我们就可以通过 J-LINK 下载代码和调试代码。
RT1052
STM32、Kinetis 等系列控制器芯片内部都具有 FLASH 存储器用于存储程序,安装芯片包后即自带相应的 FLASH 下载算法,在工程里直接选择即可。 而i.MX RT 系列芯片内部不具备 FLASH 存储器,即其程序代码需要存储在外部的存储器中,使用时需要自己提供对应 FLASH 的下载算法给 KEIL 软件。
- 开发板资料开发环境下载算法\ iMXRT1052_W25Q256JV_CFG_By_Fire.FLM
- 开发板资料开发环境下载算法 Embedfire_RT1052_QSPI_R1.FLM
将这两个文件放置于KEIL的安装目录汇中:
这两个下载算 法 分 别 是 配 套 我 们 的 寄 存 器 和 库 函 数 版 本 的 例 程。
使用时选择寄存器版本的下载算法:iMXRT1052_W25Q256JV_CFG_By_Fire.FLM
对于库函数版本的工程,选择的下载算法是 Embedfire_RT1052_QSPI_R1.FLM。
按图点击 Add 按钮后即可添加寄存器版本的下载算法
设置算法空间
- 把 Reset and Run 也勾选上,这样程序下载完之后就会自动运行,否则需要手动复位。
- 擦除的 FLASH 大小选择 Sectors 即可,不要选择Full Chip,不然下载会比较慢
下载
只需要点击 LOAD 按钮就可以进行程序下载。
Debug介绍
复位
其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
执行到断点处
该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
挂起
此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。
执行进去
该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。
执行过去
在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
执行出去
该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
执行到光标处
该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
汇编窗口
通过该按钮,就可以查看汇编代码,这对分析程序很有用。
观看变量/堆栈窗口
该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量值,也是很常用的一个调试窗口。
串口打印窗口
该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。
内存查看窗口
该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口
性能分析窗口
按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用来分析函数的性能是比较有用的。文章来源:https://www.toymoban.com/news/detail-454865.html
逻辑分析窗口
按下该按钮会弹出一个逻辑分析窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
点击 Setup,新建两个信号 PORTB.5 和 PORTE.5
Display Type 选择 bit
注意 Gird 要调节到 0.2s 左右比较合适,可以通过 Zoom 里面的 In 按钮来放大波形,通过 Out 按钮来缩小波形,或者按 All 显示全部波形。文章来源地址https://www.toymoban.com/news/detail-454865.html
到了这里,关于STM32的介绍及MDK的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!