STM32的介绍及MDK

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个基本功能层:

  1. 核内外设访问层:ARM公司提供的访问,定义处理器内部寄存器地址以及功能函数。
  2. 中间件访问层:定义访问中间件的通用API。由ARM提供,芯片厂商根据需要更新。
  3. 外设访问层:定义硬件寄存器的地址以及外设的访问函数。 我们所说的固件库基本上是指这部分,主要由芯片生产商提供。
  • 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发送内容)
在这里插入图片描述

新建一个工程

  1. 新建立一个文件夹为 Template
  2. 新建Project。Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹Template 之下,在这个目录下面建立子文件夹 USER。工程文件就都保存到 USER 文件夹下面。工程命名为Template,点击保存。
  • USER 目录除了用来放工程文件外,还用来存放主函数文件 main.c,以及其他包括system_stm32f10x.c 等等。
  1. 选择型号。战舰 STM32F103 所使用的 STM32 型号为 STM32F103ZET6,所以在这里我们选择STMicroelectronics→STM32F1Series→STM32F103→STM32F103ZET6。一定要安装对应的器件pack才会显示这些内容
  • 框架建立完毕
    • 打开USER
    • Template.uvprojx 是工程文件,非常关键,不能轻易删除。
    • Listings 和 Objects文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件。为了跟 MDK5.1之前版本工程兼容,我们把两个文件夹删除,我们会在下一步骤中新建一个 OBJ 文件夹,用来存放编译中间文件。
      在这里插入图片描述
  1. 添加启动代码,以及.c 文件等。在Template文件夹下新建 3 个文件夹 CORE, OBJ 以及STM32F10x_FWLib。
  • CORE 用来存放核心文件和启动文件
  • OBJ 是用来存放编译过程文件以及hex 文
  • STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。
    • 存放的是固件库函数
  1. 将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。
  • 打开官方固件库包,定位到STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver
  • 将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 STM32F10x_FWLib 文件夹下面。
    • src 存放的是固件库的.c 文件
    • inc 存放的是对应的.h 文件,
  1. 将固件库包里面相关的启动文件复制到我们的工程目录 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里面有被调用
  1. 定位到目录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
  1. 修改工程结构。Project Targets一栏,我们将Target名字修改为Template,然后在Groups一栏删掉一个Source Group1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况。

  2. 往 Group 里面添加我们需要的文件。

  • 右键点击点击Tempate,选择选择 Manage Project Itmes,然后选择需要添加文件的 Group,这里第一步我们 选 择 FWLIB , 然 后 点 击 右 边 的 Add Files, 定 位 到 我 们 刚 才 建 立 的 目 录STM32F10x_FWLib/src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add。
  • 注意。如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f10x_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加。
  1. 将 Groups 定位到 CORE , CORE 下面需要添加的文件为 core_cm3.c,startup_stm32f10x_hd.s
  2. 将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 这款芯片
](https://img-blog.csdnimg.cn/0cb95ece4cdd4534a3d16bd66897bdb8.jpeg)
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介绍

在这里插入图片描述

复位

其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。

执行到断点处

该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。

挂起

此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。

执行进去

该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。

执行过去

在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。

执行出去

该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。

执行到光标处

该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。

汇编窗口

通过该按钮,就可以查看汇编代码,这对分析程序很有用。

观看变量/堆栈窗口

该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量值,也是很常用的一个调试窗口。

串口打印窗口

该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。

内存查看窗口

该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口

性能分析窗口

按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用来分析函数的性能是比较有用的。

逻辑分析窗口

按下该按钮会弹出一个逻辑分析窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
点击 Setup,新建两个信号 PORTB.5 和 PORTE.5
在这里插入图片描述
Display Type 选择 bit
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意 Gird 要调节到 0.2s 左右比较合适,可以通过 Zoom 里面的 In 按钮来放大波形,通过 Out 按钮来缩小波形,或者按 All 显示全部波形。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万码无虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值