• STM32的介绍及MDK


    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 定时器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    端口

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    寄存器相关

    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 程序计数器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    调试相关

    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 调试接口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    系统类

    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 以符号开始的块(未初始化数据段)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总线

    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 专用外设总线
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    杂类

    ALU:Arithmetic Logical Unit 算术逻辑单元
    
    CLZ: count leading zero 前导零计数(指令)
    
    SIMD: single instruction stream multiple data stream 单指令流,多数据流
    
    VFP: vector floating point 矢量浮点运算
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    词汇/词组

    Big Endian 大段存储模式
    
    Little Endian 小段存储模式
    
    context switch 任务切换(上下文切换)(CPU寄存器内容的切换)
    
    task switch 任务切换
    
    literal pool 数据缓冲池
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这段代码的作用是在系统复位之后引导进入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)
    
    • 1

    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 显示全部波形。

  • 相关阅读:
    SQLite Autoincrement特性
    模型预测控制(MPC)中考虑约束中的不确定性(Matlab代码实现)
    基于STM32的OLED多级菜单GUI实现(简化版智能手表)
    Investigating Forgetting in Pre-Trained Representations Through Continual Learning
    机器视觉Halcon中read_image算子探究与学习
    关于在3dsmax中制作的模型导入UE后尺寸大小不对的问题
    为什么低碳水饮食对减肥有效?给你科学的解释
    端口配置错误,导致RabbitMq启动报错
    从零开始手搓一个STM32与机智云的小项目——硬件介绍
    5分钟安装Kubernetes+带你轻松安装istio服务网格指南
  • 原文地址:https://blog.csdn.net/qq_45578181/article/details/126531649