STM32的介绍及MDK

2023-11-17

文章目录

STM32介绍

单片机

在这里插入图片描述

STM32命名

在这里插入图片描述

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层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。

  • 如果没有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安装

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
双击安装

添加宏

因为 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。

编译输出

在这里插入图片描述
编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。
方法是点击魔术棒,然后选择“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字段的文件并列出其所在位置:
    在这里插入图片描述

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-JLInk
在这里插入图片描述
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执行 startup_stm32f10x_hd.s 文件的 Reset_Handler,再跳到main 函数

setting JLink
在这里插入图片描述
选择Jlink的时候一般选择10M,JTAG5M就可以了

  • 在 Utilities 选项卡里面设置下载时的目标编程器
    在这里插入图片描述
    进入 FLASH 算法设置Flash DownLoad,在setting的右边两个按钮
    在这里插入图片描述
    设置完之后,点击 OK,然后再点击 OK,回到 IDE 界面,编译一下工程。接下来我们就可以通过 J-LINK 下载代码和调试代码。
    只需要点击 LOAD 按钮就可以进行程序下载。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Debug介绍

在这里插入图片描述

复位

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

执行到断点处

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

挂起

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

执行进去

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

执行过去

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

执行出去

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

执行到光标处

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

汇编窗口

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

观看变量/堆栈窗口

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

串口打印窗口

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

内存查看窗口

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

性能分析窗口

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

逻辑分析窗口

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32的介绍及MDK 的相关文章

  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试

随机推荐

  • Qt第三十三章:阴影QGraphicsDropShadowEffect

    简单阴影 为QLabel QPushButton加阴影 class TestShadow QWidget def init self parent None super TestShadow self init parent self re
  • 关于在资源中的QML文件中访问本地Image文件(Qt的Bug)

    这里要讨论的内容是 将一个 QML 文件放置到 qrc 资源中后 需要访问本地目录的文件 比如图片的时候 遇到的一个在 Windows 和 Linux MeeGo 平台下表现不一致的 Bug 以及处理方法 事件起因 一个在资源文件中的 QM
  • CSS媒体查询@media and screen指令在部分(360、奇安信等)浏览器不生效的解决方案

    一 介绍出现问题的写法 media screen and width lt 1024px flex other display none 可以看到 乍一看没什么问题 而且在chrome edge等浏览器也生效 但是在360浏览器等其它浏览器
  • Weblogic反序列化漏洞(CVE-2018-2628/CVE-2023-21839复现)

    内容目录 Weblogic反序列化漏洞 CVE 2018 2628 CVE 2023 21839 weblogic中间件 CVE 2018 2628 漏洞描述 影响版本 漏洞复现 修复方案 CVE 2023 21839 漏洞描述 影响版本
  • 【SQL】1 SQL 教程

    本系列教程均来自菜鸟教程 SQL 教程 SQL 是用于访问和处理数据库的标准的计算机语言 在本教程中 您将学到如何使用 SQL 访问和处理数据系统中的数据 这类数据库包括 MySQL SQL Server Access Oracle Syb
  • dolphinschedule使用shell任务结束状态研究

    背景 配置的dolphin任务 使用的是shell shell里包含了spark submit 如下截图 dolphin shell 介绍完毕 开始说明现象 有天有人调整了集群的cdp配置 executor cores max 1 我之前这
  • 我的世界java村民繁殖条件,我的世界村民无限繁殖教程 教你村民怎么生孩子

    我的世界村民无限繁殖教程 教你村民怎么生孩子 那在我的世界中想要绿宝石就要有很多的村民才可以 那下面就给大家分享一下村民怎么无限繁殖吧 还有教你村民怎么生孩子哦 游戏园我的世界官方群 325049520或256070479欢迎各路喜爱我的世
  • 初学容器:Docker

    1 环境初始化 1 1 安装git vim curl等常用工具 sudo apt update sudo apt install y git vim curl jq 1 2 ubuntu是不支持远程连接的 需要安装ssh服务 sudo ap
  • 剑指Offer【37】数字在排序数组中出现的次数(JavaScript版本)

    题目描述 统计一个数字在排序数组中出现的次数 function GetNumberOfK data k write code here var start data indexOf k count 0 i start while i lt
  • uni-app原生子窗体(app端)

    在uni app中video是原生组件 层级最高 全屏后普通前端组件无法覆盖 如果想要在视频自行绘制界面 1 app端vue页面可以用 cover view cover image 但是cover view cover image中不支持嵌
  • OPENCV C++ 找到最大内接矩形(正方形)

    OPENCV C 找到最大内接矩形 正方形 这源代码本来是检测最大内接圆形的 本人想要矩形 所以变成了正方形 谨慎使用 不是严格意义上的最大内接矩形 cv Mat map one label cv imread src png cv2 IM
  • 程序员,不止干到35岁

    程序员 不止干到35岁 在中国 程序员不能超过35岁 似乎已经是不争的事实 软件开发工作就是青春饭 顶多靠毕业这十年的时间 超过这个年龄 要不成功跃身成为管理者 要不转行进入其他领域 好像再没有更好的选择 即使偶有继续坚持作开发的 也被看成
  • Mybatis简单的增删改查和mybatis配置文件的详解

    MyBatis 1 什么是Mybatis MyBatis是一款优秀的持久层框架 MyBatis避免了几乎所有的JADBC代码和手动设置参数以及获取结果集 MyBatis可以使用简单的XML或注解来配置和映射原生类型 接口和Java的POJO
  • 使用Jest测试接口时间

    引言 在开发和测试过程中 我们经常需要对接口的性能进行评估和优化 一个重要的指标是接口的执行时间 本文将介绍如何使用Jest来测试接口的执行时间 并提供示例代码 Jest简介 Jest 是一个流行的JavaScript测试框架 广泛应用于前
  • 整理了60个 Python 实战例子,拿来即用

    大家好 最近有一些朋友问我有没有一些 Python 实战小案例 今天我整理排版了一遍 给大家分享一下 喜欢记得点赞 收藏 关注 整理了60个Python小例子 拿来即用 一 数字 1 求绝对值 绝对值或复数的模 公众号 快学Python I
  • python与pyqt5把列表中的数据写入到一个新的excel表中,并选择保存路径

    您可以使用 Python 的 openpyxl 库来实现这个功能 首先 您需要通过在命令行中运行 pip install openpyxl 来安装 openpyxl 库 然后 您可以使用以下代码来将列表中的数据写入新的 Excel 表中 f
  • mysql中drop语法错误,mysql 中drop 库的问题

    最近drop database pai 报错 ERROR 1010 HY000 Error dropping database can t rmdir pai errno 39 我就想把库文件直接删除试试 于是 rm rf usr loca
  • 区块链的基本概念

    区块链是分布式数据存储 点对点传输 共识机制 加密算法等计算机技术的新型应用模式 所谓共识机制是区块链系统中实现不同节点之间建立信任 获取权益的数学算法 区块链技术的内涵可概括为 在缺少可信任的中央节点和可信任的通道的情况下 分布在网络中的
  • All O`one Data Structure

    学习地址 双向链表 key为count数 value为存入的字符串 增加一个字符串 先判断其Node位置 再在双向链表中插入 删除也是 最大最小的字符串数在双向链表的表尾和表头 记录学习一下 class AllOne Node root M
  • STM32的介绍及MDK

    文章目录 STM32介绍 单片机 STM32命名 armV7的三个系列 STM32系统结构 CMSIS标准 STM32F4方包绍官方库包 STM32F103 STM32F103资源 STM32F103总线架构 STM32F103引脚 STM