赞
踩
ARM是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而TI,ST这样的公司,他们并不做标准,他们是芯片公司,他们是根据ARM公司提供的芯片内核标准设计自己的芯片。
四被动单元是:
为了能让不同的芯片公司生产的Cortex-M4芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准CMSIS标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。ST官方库就是根据这套标准设计的。
基于CMSIS应用程序基本结构如下图:
CMSIS分为3个基本功能层:
从图中可以看出,CMSIS层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。
CMSIS规范就规定,系统初始化函数名字必须为SystemInit,所以各个芯片公司写自己的库函数的时候就必须用SystemInit对系统进行初始化。
Libraries文件夹下面有CMSIS和STM32F4xx_StdPeriph_Driver两个目录
Libraries文件夹里面的文件在我们建立工程的时候都会使用到。
Project文件夹下面有两个文件夹。
Utilities文件下就是官方评估板的一些对应源码,这个对于本手册学习可以忽略不看。
四个驱动单元是:
四被动单元是:
总线矩阵
ICode总线
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 数据缓冲池
学习之初,首推正点资料
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
B0 B1 启动模式
0 X 主闪存存储器
1 0 系统存储器
1 1 内置SRAM
MDK5向后兼容MDK4和MDK3等,以前的项目同样可以在MDK5上进行开发(但是头文件方面得全部自己添加)
官网下载地址
这里使用KEIL5 的版本是 MDK5.24。
o 在软件资料,1,软件,MDK5
o 无脑安装
• MDK5破解
o File license Mangement 复制CID
o 在keygen破解软件中运行CID 得到秘钥,记得选择32
o 用管理员身份打开MDK5,再次进入license Management 的New ID Code粘贴
点击魔术棒,进入配置菜单,选择 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++选项.然后点击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编译工程,会生成一些中间文件(.o .axf .map等),最终会生成HEX文件,以便下载到MCU上面执行,我们通常使用STM32工程中,output文件夹下面会生成十多种文件类型。
.hex文件和.bin文件的区别是:.bin文件不含地址信息,全部是可执行代码;而hex文件则是包含地址信息的可执行代码。同样的.bin文件也是由.axf文件转换而来的。可理解为带存储地址描述格式的 bin 文件。
在使用ISP软件进行程序下载的时候,一般使用的是.hex文件包含的地址信息来实现程序下载。 而我们在进行BootLoader升级的时候,一般使用的是.bin文件,地址有Bootloader程序指定。
编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。
方法是点击魔术棒,然后选择“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 一般把取值范围的宏定义放在判断有效性语句的上方,这样是为了方便大家查找
这个错误是由于新导入到工程内的文件,未被正确识别而引发的错误。
原因:用户的.c和.h文件往往都是新建txt,然后改的后缀,这样的文件被导入keil后,有可能会被识别成image file。
解决:
选options for File …,查看如下:
将文件修改类型为C Source file即可。
串口下载软件
第 1 个圈,圈出了 flymcu 对一键下载电路的控制过程,其实就是控制 DTR和 RTS 电平的变化,控制 BOOT0 和 RESET,从而实现自动下载。
串口调试助手,直接打开,设置串口即可(程序中要通过对应的usart发送内容)
8 . 定位到目录:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
修改工程结构。Project Targets一栏,我们将Target名字修改为Template,然后在Groups一栏删掉一个Source Group1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况。
往 Group 里面添加我们需要的文件。
1.STM32需要的文件
system_stm32f4xx.h是片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关的函数。
stm32f4xx.h是STM32F4片上外设访问层头文件。这个文件就相当重要了,只要你做STM32F4开发,你几乎时刻都要查看这个文件相关的定义。
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中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。
; 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,是国内芯片公司南京沁恒的产品,稳定性经测试还不错,所以还是多支持下国产。
JTAG与SWD是个接口,JLink指的是仿真器
串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 ST-LINK,JLINK 和ULINK 等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。
详情也可点击
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 1脚(此时的VCC变为Vref),为Jlink提供外部电压参考
Jlink给目标板供电:
跳线连接:Jlink3.3V通过1脚VCC输出
调试原理
串行接口,就是SWD,通信数据线两根
JTAG,通信数据线五根,所以用SWD多
使用SWD的话,只需要SWDIO与SWCLK两个引脚。
使用JTAG的话,五个引脚都要用到。
认这五个引脚复位了之后都是用来仿真的,是不能正常使用的,只有禁止了相应的端口,才能释放IO引脚
STM32 的 SWD 接口与 JTAG 是共用的,只要接上 JTAG,你就可以使用 SWD模式了(其实并不需要 JTAG 这么多线),当然,你的调试器必须支持 SWD 模式,JLINK V7/V8、ULINK2 和 ST LINK 等都支持 SWD 调试。
(在文件stm32f10x_gpio.c中):调用该函数,有三个选项。407没有复用概念。
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
魔法棒-Debug-JLInk
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执行 startup_stm32f10x_hd.s 文件的 Reset_Handler,再跳到main 函数
setting JLink
选择Jlink的时候一般选择10M,JTAG5M就可以了
进入 FLASH 算法设置Flash DownLoad,在setting的右边两个按钮
设置完之后,点击 OK,然后再点击 OK,回到 IDE 界面,编译一下工程。接下来我们就可以通过 J-LINK 下载代码和调试代码。
STM32、Kinetis 等系列控制器芯片内部都具有 FLASH 存储器用于存储程序,安装芯片包后即自带相应的 FLASH 下载算法,在工程里直接选择即可。 而i.MX RT 系列芯片内部不具备 FLASH 存储器,即其程序代码需要存储在外部的存储器中,使用时需要自己提供对应 FLASH 的下载算法给 KEIL 软件。
将这两个文件放置于KEIL的安装目录汇中:
这两个下载算 法 分 别 是 配 套 我 们 的 寄 存 器 和 库 函 数 版 本 的 例 程。
使用时选择寄存器版本的下载算法:iMXRT1052_W25Q256JV_CFG_By_Fire.FLM
对于库函数版本的工程,选择的下载算法是 Embedfire_RT1052_QSPI_R1.FLM。
按图点击 Add 按钮后即可添加寄存器版本的下载算法
只需要点击 LOAD 按钮就可以进行程序下载。
其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。
该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。
在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
通过该按钮,就可以查看汇编代码,这对分析程序很有用。
该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量值,也是很常用的一个调试窗口。
该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。
该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口
按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用来分析函数的性能是比较有用的。
按下该按钮会弹出一个逻辑分析窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
点击 Setup,新建两个信号 PORTB.5 和 PORTE.5
Display Type 选择 bit
注意 Gird 要调节到 0.2s 左右比较合适,可以通过 Zoom 里面的 In 按钮来放大波形,通过 Out 按钮来缩小波形,或者按 All 显示全部波形。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。