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
JAVA:https://www.java.com/en/download/
STM32Cube 固件包:Help→Manage embedded software packages→C:\Program Files\STM32CubeMx\Packs→勾选“Manual Check”→NO Auto
-
编译器(装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
-
VSCode安装:https://code.visualstudio.com/docs/?dv=win64
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
EIDE-导入项目-MDK-不存放同一目录→芯片支持包-From Disk→烧录配置:OpenOCD→下拉(烧录配置)-芯片配置:stm32f4x.cfg→项目属性-包含目录-预处理宏定义:STM32F407xx
-
器件支持包:
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:
-
mdk安装:https://www.keil.com/download/product/
-
工程结构介绍
-
寄存器版本
Drivers:底层驱动代码
BSP:自己编写底层驱动代码
CMSIS:ARM 提供 CMSIS 标准的底层代码
SYSTEM:自己编写的系统、延时、串口相关的代码,方便项目使用
Middlewares:中间层/组件/Lib 代码
Output:编译中间文件及输出文件
Projects:工程文件
User:用户编写的代码
-
HAL 库版本
Drivers:
BSP
CMSIS
STM32H7xx_HAL_Driver:ST 提供的 H7xx 系列芯片的 HAL 库驱动代码
SYSTEM
Middlewares:
Output:
Projects:
User:
-
CubeMX版本
Drivers:存放板级驱动,默认包含 HAL 库及 CMSIS
CMSIS
STM32F1xx_HAL_Driver
Inc:存放外设, gpio 初始化,中间件相关头文件
main.h
stm32f1xx_hal_conf.h
stm32f1xx_it.h
MDK-ARM:存放 MDK 相关文件及启动文件
RTE
startup_stm32f103xe.s
template
template.uvoptx
template.uvprojx
Middlewares:存放中间件源码
Src:存放外设, gpio 初始化,中间件相关源码及 main.c
freertos.c
main.c
stm32f1xx_hal_msp.c
stm32f1xx_it.c
system_stm32f1xx.c
-
寄存器版本
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

浙公网安备 33010602011771号