0.环境搭建
stm32环境搭建
mdk安装:https://www.keil.com/download/product/
C:\soft\MDK\Core
C:\soft\MDK\Pack
STM32cubeMX:https://www.st.com.cn/zh/development-tools/stm32cubemx.html#get-software
C:\soft\STM32CubeMx\Core
C:\soft\STM32CubeMx\Packs
VSCode:
C:\soft\VSCode\Core
器件支持包:
keil:https://www.keil.arm.com/devices/
cubeMX:https://www.st.com.cn/zh/embedded-software/stm32cube-mcu-mpu-packages/products.html
STM32F103C8:https://www.keil.arm.com/devices/stmicroelectronics-stm32f103c8/features/
STLink驱动:https://www.st.com.cn/zh/development-tools/stsw-link009.html
ARM仿真器J-Link:C:\Program Files\SEGGER\JLink_V836\USBDriver\x64
串口调试工具:
sscom:http://www.daxia.com/
xcom:http://www.openedv.com/thread-279749-1-1.html
comtool:https://github.com/Neutree/COMTool/releases
串口终端工具:
mobaxterm:https://mobaxterm.mobatek.net/download.html
minicom:
picocom:
安装 STM32CubeMX:
JAVA:https://www.java.com/en/download/
STM32Cube 固件包:Help->Manage embedded software packages->C:\Program Files\STM32CubeMx\Packs->勾选“Manual Check”->NO Auto
stm32-vscode环境配置
vscode安装路径:C:\soft\VSCode\Core
插件:C/C++ Extension Pack、Cortex Debug、EIDE(安装实用工具->Cppcheck、GNU Arm Emdedded、OpenOCD Programmer、Toolchain->->->)->设置-设置-输入“elf”-勾选“编译完成后将 .axf 转换为 .elf”->拓展-右键EIDE-扩展设置-Armcc v5:C:\soft\MDK\Core\ARM\ARMCC-Armcc v6:C:\soft\MDK\Core\ARM\ARMCLANG->C:\soft\MDK\Core\UV4\UV4.exe
编译器(装32位的不然会报错):https://developer.arm.com/documentation/ka005198/latest
Armcc v5:https://developer.arm.com/downloads/view/ACOMP5
安装路径:C:\soft\MDK\Core\ARM\ARMCC\
Armcc v6:https://developer.arm.com/downloads/view/ACOMPE?revision=r6p23-00rel0&sortBy=availableBy
安装路径:C:\soft\MDK\Core\ARM\ARMCLANG\
配置:品->Folders/Extensions->魔术棒-Target
EIDE-导入项目-MDK-不存放同一目录->芯片支持包-From Disk->烧录配置:OpenOCD->下拉(烧录配置)-芯片配置:stm32f4x.cfg->项目属性-包含目录-预处理宏定义:STM32F407xx->->->
vscode安装路径:C:\soft\VSCode\Core
插件:C/C++ Extension Pack、Cortex Debug、EIDE(安装实用工具->Cppcheck、GNU Arm Emdedded、OpenOCD Programmer、Toolchain->->->)->设置-设置-输入“elf”-勾选“编译完成后将 .axf 转换为 .elf”->拓展-右键EIDE-扩展设置-Armcc v5:C:\soft\MDK\Core\ARM\ARMCC-Armcc v6:C:\soft\MDK\Core\ARM\ARMCLANG->C:\soft\MDK\Core\UV4\UV4.exe
编译器(装32位的不然会报错):https://developer.arm.com/documentation/ka005198/latest
Armcc v5:https://developer.arm.com/downloads/view/ACOMP5
安装路径:C:\soft\MDK\Core\ARM\ARMCC\
Armcc v6:https://developer.arm.com/downloads/view/ACOMPE?revision=r6p23-00rel0&sortBy=availableBy
安装路径:C:\soft\MDK\Core\ARM\ARMCLANG\
配置:品->Folders/Extensions->魔术棒-Target
EIDE-导入项目-MDK-不存放同一目录->芯片支持包-From Disk->烧录配置:OpenOCD->下拉(烧录配置)-芯片配置:stm32f4x.cfg->项目属性-包含目录-预处理宏定义:STM32F407xx->->->
VSCode方法一(推荐):
配置MinGW:https://www.mingw-w64.org/downloads/
高级系统设置->环境变量->双击Path->C:\mingw64\bin->ctrl+r-cmd->gcc -v
插件下载->C/C++ Extension Pack->Keil Assistant->右键Keil Assistant->拓展设置->右键Keil-R->复制路径->->
vscode(插件Embedded IDE)
点击左侧按钮(EIDE)->安装实用工具->代码检查器:Cppcheck->gcc编译器:GUN Arm Embedded->C++
Stm32CubeMX:Updater Settings(勾选"Manual Check","No Auto-Refresh at Application start")->Connection Parameters(Check Connection)->新建工程:Project Manager(勾选"Copy only...","Generate peripheral...")
打开EIDE,新建项目Cortex-M项目->起名:text->存放路径为CubeMX"上一级"文件夹->若没打开工程,双击Code Workspace文件:将启动文件放到core文件夹下
加入代码文件:(项目资源->普通文件夹)->构建配置-CPU类型:Cortex-M3->复制文件STM32....ld文件名填入(构建配置-链接脚本路径)->
打开Makefile:#C define中不要复制-D(项目属性-预处理宏定义)->项目属性-包含目录:core-Inc->
安装实用工具(烧录工具)->OpenOCD->
安装实用工具(调试工具)->Cortex-Debug->构建配置--构建器选项--C++编译器代码优化级别-O0
新建工程:
keil
添加启动文件->添加外设寄存器描述文件->内核寄存器描述文件->库文件->库文件头文件包含关系->库文件中有条件编译要在keil-C++-Define中添加条件
新建5个文件夹:
Drivers:与硬件相关的驱动层文件
BSP:开发板板级支持包驱动代码,如LED、蜂鸣器、按键各种外设驱动
CMSIS: CMSIS 底层代码
Device
\ST\STM32F1xx
Include:stm32f1xx.h、stm32f103xe.h、system_stm32f1xx.h
Source
\Templates:system_stm32f1xx.c
arm:startup_stm32f103xx.s
Include:cmsis_armcc.h、cmsis_armclang.h、cmsis_compiler.h、cmsis_version.h、core_cm4.h、mpu_armv7.h
STM32F1xx_HAL_Driver
Inc:hal库头文件
Src:hal库源文件
SYSTEM:系统级核心驱动代码
sys
delay
usart
Middlewares:中间层组件文件、第三方中间层文件,如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等等。
Output:工程编译输出文件
Projects\MDK-ARM:MDK 工程文件
User:
main.c
stm32f1xx_hal_conf.h
stm32f1xx_it.c
stm32f1xx_it.h
stm32f1xx.h、stm32f103xe.h、system_stm32f1xx.h:.\Drivers\CMSIS\Device\ST\STM32F1xx\Include
system_stm32f1xx.c:.\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates
startup_stm32f103xx.s:./Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm
cmsis_armcc.h、cmsis_armclang.h、cmsis_compiler.h、cmsis_version.h、core_cm4.h、mpu_armv7.h:./\Drivers\CMSIS\Include
stm32f1xx_hal_conf.h、stm32f1xx_it.h :./Project/Inc
stm32f1xx_it.c:./Project/Src
启动文件,对应 FLASH 容量(Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm)
Flash≤32KB:startup_stm32f103x6.s
64KB≤Flash≤128KB:startup_stm32f103xb.s
256KB≤Flash≤512KB:startup_stm32f103xe.s
768KB≤Flash≤1024KB:startup_stm32f103xg.s
头文件也要修改
stm32f1xx.h查看->魔术棒->C/C++->Define
2 处修改:
将 Heap_Size 改成 0
Heap_Size EQU 0x00000000
去掉 SystemInit调用(注释)
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
新建一个工程框架:
打开 MDK 软件->项目->新的->STM32 型号(要安装对应的器件 pack 才会显示这些内容)->
自动创建了 3 个文件夹:
DebugConfig:调试设置信息文件(.dbgconf),不可删除
Listings:编译过程产生的链接列表等文件
Objects:编译过程产生的调试信息、 .hex、预览、 .lib 文件等->
先把 MDK 自动生成的这两个文件夹(Listings 和 Objects)删除
添加文件:
设置工程名和分组名:设置工程名字为: 品->Template->
设置五个分组:
Startup(存放启动文件):Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
User(存放 main.c 等用户代码)、
Drivers/SYSTEM(存放系统级驱动代码):Drivers\SYSTEM中的.c文件
Drivers/STM32F4xx_HAL_Driver(hal库文件)、
Readme(存放工程说明文件)->
添加启动文件:启动文件存放在 STM32CubeF4 软件包的: Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\.s文件->
启动文件主要作用:
1、堆栈(SP)的初始化;
2、初始化程序计数器(PC)
3、设置向量表异常事件的入口地址;
4、调用 main 函数等
->做了2 处修改:将 Heap_Size 改成 0;去掉 SystemInit调用->
Heap_Size EQU 0x00000000
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =0xE000ED88 ;使能浮点运算 CP10,CP11
LDR R1,[R0]
ORR R1,R1,#(0xF << 20)
STR R1,[R0]
;寄存器版本代码,因为没有用到 SystemInit 函数,所以注释掉以下代码为防止报错!
;HAL 库版本代码,建议加上这里(外部必须实现 SystemInit 函数),以初始化
;stm32 时钟等.
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
设置使用 FPU:魔术棒->Target1选项卡->Floating Point Hardware:Double Precision
魔术棒设置:
1,Target 选项卡:外部晶振频率Xtal:看原理图设置时钟频率->ARM Compiler:Use default compiler version 5(即 AC5 编译器)
2,Output 选项卡:Select Folder for Objects(选择Objects输出文件夹)->勾选"Create HEX File"
3,Listing 选项卡:Select Folder for Listing(选择Objects输出文件夹)
4,C/C++ 选项卡:
Define(设置全局宏定义):USE_HAL_DRIVER,STM32F407xx->Optimization:Level 0(-O0)->勾选 C99 Mode->
Include Path:头文件包含路径设置
..\..\User
..\..\Drivers
..\..\Drivers\CMSIS\Device\ST\STM32F4xx\Include
..\..\Drivers\CMSIS\Include
..\..\Drivers\STM32F4xx_HAL_Driver\Inc
..\..\Middlewares
5,Debug 选项卡:Use:CMSIS-DAP Debugger->点击Settings->Debug->Port:SW--Max Clock:10NHz
6,Utilities 选项卡:点击Settings->点击Flash Download->勾选Reset and Run
7,Linker 选项卡(可选):取消勾选"Use ..."->Scatter File:..\..\User\SCRIPT\qspi_code.scf.scf
使用 AC6 编译器,Misc Controls : -Wnoinvalid-source-encoding->
添加main.c->添加到分组->编译会报错修改stm32fxx_it.c添加头文件#include "stm32f4xx_hal.h"
cubeMx:
配置GPIO->配置RCC->时钟选择HSE外部晶振->HCLK(频率):72->调试接口SYS:Serial Wire->右上角GENERTE CODE生产代码
PLL1 分频系数 M 配置。分频系数 M 我们设置为 8。
PLL1 倍频系数 N 配置。倍频系数 N 我们设置为 336。
PLL1 分频系数 P 配置。分频系数 P 我们配置为 2。
系统时钟时钟源选择:PLL,HSI 还是 HSE。我们选择 PLL,选择器选择 PLLCLK 即可。
经过上面配置以后此时 SYSCLK=168MHz。
GPIO 功能引脚配置
Cortex-M4 内核基本配置(限定项):
Pinout&Configuration->Categories->System Core->SYS->Debug:JTAG(4pins)
Project Manager->Project->Name:Template->Application Structure:Basic->Toolchain/IDE:MDK-ARM
Project Manager->Code Generator->勾选:Generate peripheral...->
生成工程源码
烧录设置:
stlink:
固件的升级:https://www.st.com/zh/development-tools/stsw-link007.html/
驱动下载:https://www.st.com/zh/development-tools/stsw-link009.html/
Keil:魔术棒->Debugger->Settings->Flash Download->选择“Erase Sectors”->
烧录->复位键->->
串口:
USB_UART 通过 USB 线连接电脑->电源灯亮起(蓝色)->USART1的 RXD、PA9,TXD 、PA10通过跳线帽连接->BOOT0、GND,BOOT1、GND通过跳线帽连接->按一下复位按键->使用上位机软件下载代码->双击打开 ATK-XISP->波特率推荐设置为 76800->选择 DTR 的低电平复位,RTS 高电平进 BootLoader->下载成功后,会有“共写入 xxxxKB,进度 100%,耗时 xxxx 毫秒”
DAP:
DAP 通过 USB 线连接电脑,通过 20P 灰排线连接开发板->开发板供电->
打开MDK IDE:
魔术棒->Debug->use: CMSIS-DAP Debugger->勾选Run to main->
点击 Settings->Port:SW->Max Clock:8Mhz->
Utilities ->勾选 Use Debug Driver->点击 Settings->选中 Reset and Run->如果没有 flash 算法,点击 Add 按钮自行添加->
F7 ->F8
使用 DAP 仿真调试程序:
Register:寄存器窗口
Disassembly:反汇编窗口,方便从汇编级别查看程序运行状态
Call Stack + Locals:调用关系和局部变量窗口,查看函数调用关系,以及函数的局部变量
->->->->->->->->->
编译结果看:Build Output窗口
数据类型:占用Flash or SRAM:说明
Code:表示代码大小
RO-Data:表示只读数据所占的空间大小,一般是指 const 修饰的数据大小。
RW-Data:初值为非 0的可读可写数据
ZI-Data:初值为0 的可读可写数据
FLASH占用:Code+RO+RW
SRAM占用:RW+ZI
hex文件在Output中

Debug 工具条
关闭Disassembly窗口->添加Watch1窗口->双击 Enter expression,将全局变量: g_fac_us (在 delay.c 里面定义)加入 Watch1 窗口->
在 delay_init 函数处放置一个断点->点击执行到该断点处->执行进去->执行过去(g_fac_us值显示出来)->执行进去
从 Call Stack + Locals 窗口看到函数的调用关系,其原则是: 从下往上看,即下一个函数调用了上一个函数
MDK5 使用技巧:
自定义字体颜色:
设置->Encoding:Chinese GB2312(Simplified)->勾选View White Space(编辑器的空格可见)->勾选Insert spaces for tabs(代码对齐)->Tab size:4->
Colors & Fonts 选项卡->C/C++ Editor Files(设置自己的代码的字体和颜色)->
User Keywords 选项卡,设置用户定义关键字
看看某个变量或数组是在哪个地方定义,快速定位:
魔术棒->Output->勾选 Browse Information->编译->
右键->Go to Definition Of
快速注释/消注释块代码的功能->右键->高级(Advanced)->注释选择(Comment Selection)
快速打开头文件:右键->Open Document