STMCU小助手
发布时间:2023-3-10 11:53
|
前言 该文档主要讲解内容有:6 o. ?* X5 u7 s& E! T 在Keil环境下新建工程——基于寄存器版本 程序下载方法1——ISP串口下载$ J" k+ i8 x% G" k3 | 程序下载方法2——JLINK程序下载% o; {& B e" B/ M, d JLINK在线调试+软件调试方法0 q! K; N6 z* T% X+ J) p 一、新建工程 建立存放工程的文件夹:包含三部分7 l. |! `+ I& J( y8 x# }, K
! U! j _& L" g! u* _- n0 G 打开keil软件(MDK5),点击新建工程:
保存新建工程 找到刚才建立的工程文件种的USER文件,选中并保存:& T1 _4 x! T8 `
选择芯片型号: z+ W- C7 P+ y) r 这里本人使用的信号型号为:STM32F407ZGT6,找到点击ok选择即可。 7 [* {3 j! J3 s/ K8 l
添加功能组件 这里会提示你是否添加功能组件,由于这里是建立工程,先不需要添加直接关闭即可。 5 I7 P$ m& q; o9 w9 p; r' q
3 S$ V" @6 Z3 }. M6 u 建立好的工程目录8 |. c, `( k7 M , b0 l# }" A5 ]8 [) p4 d# Y
+ s l1 T3 D/ }1 m5 Q1 }9 A6 m . i) ~6 _& ` w( W0 N; s5 H8 v 启动文件设置 启动代码是一段和硬件相关的汇编代码,主要作用:1、堆栈(SP)初始化;2、初始化程序计数器(PC);3、设置向量表异常事件的入口地址;4、调用函数main函数。 ST公司对于STM32F40X和STM32F41X系列统一使用:startup_stm32f40_41xxx.s启动文件。2 x/ _; d! T7 v' T5 P$ R" N Q 5 _" g! S* W! ^ 由于使用STM32F407ZGT6开发板因此上述启动文件正常使用,但是需要对启动文件做一下修改,这里将寄存器版本代码用不到的代码屏蔽掉,主要是Reset_Handler函数修改。4 ^! a6 y# ? Z, F: D6 z9 J& [
上述代码: 1、开启了STM32F4硬件FPU的代码,以使能浮点运算单元。其中0xE000ED88就是协处理器控制寄存器(CPACR),该寄存器第20~23位用来控制是否支持浮点运算,这里全部设置为1。6 y- L, {8 r. s$ d 2、由于使用的是寄存器版本的代码,这里屏蔽了SystemInit函数。 9 v- Z! B* }. W: U$ \ 由于使能了FPU,在MDK里也需要对FPU进行设置,否则代码无法运行,设置方式:打开Options for Target,如图进行设置2 ~4 G* D v6 t) R+ t Z 由于开发板上晶振为8MHz所以这里将其改为8 1 U/ V) g; R% }- n
添加启动文件 将启动文件startup_stm32f40_41xxx.s启动文件拷贝到刚刚新建立的USER文件里面。 " Z- G$ i( m" T) X& a
编译启动代码( D1 C/ r: `5 q) \, C# s7 [ 1、目标编译,只编译打开的文件;2、全部编译,编译整个工程文件(事件较长)
1 l9 S4 b- }6 z% C/ a$ j6 z
添加系统代码 在USER文件种MDK5会自动生成2个文件,用来存放MDK编译过程中产生的文件,在正点原子中会建立OBJ 文件夹单独存放,这里我们不对其进行调整,仅给出调整方式。
, T1 i0 R& Q8 v% K3 j [: r2 ?
- {5 p" H* N% o) w' g
将系统代码(即 SYSTEM 文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到,不过不要拷贝错了!不要把库函数代码的系统文件夹拷贝到寄存器代码里面用,反之亦然!这些代码在任何 STM32F40x/STM32F41x 的芯片上都是通用的,可以用于快速构建自己的工程,后面会有详细介绍) % J% k( C1 I" i
MDK中添加相关文件) V7 G0 g5 ^8 \/ e' C! g / X5 j" F& t# ^4 w# ~, N
5 c6 Q2 Q4 M- `, B0 ?$ C 还需要再USER目录下添加main函数文件,test.c文件。
' S+ f$ k% |5 \ 建立完成后双击1,可以添加建立的test.c文件。 % V2 Q1 H2 |. T
再编写test.c文件后会发现有错误,这是由于还没有添加.c的头文件.h文件 F4 }+ C/ z5 g: U4 e* n 4 B9 ]" r: J6 ]! ~2 ]
添加.h文件 图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比 如 MDK4/MDK3 等)才添加的, MDK5 在你选择器件的时候,就会内部定义这个宏,因此在 MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加进来。. o% e4 y$ P, q& t% f8 e, ] 图中 2 处是编译器优化选项,有 -O0~-O3 四种选择( default 则是 -O2),值越大,优化效果越强,但是仿真调试效果越差。这里我们选择 -O0 优化,以得到最好的调试效果,方便开发代码,在代码调试结束后,大家可以选择 -O2 之类的优化,得到更好的性能和更少的代码占用量。; [1 U- ?3 ^6 S2 [5 J& u 图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。 然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后面会经常用到)# x# r+ Y6 S) o$ p8 P, {3 ?3 V
4 d7 l f# o+ O h: |8 k 添加完成后重新进行代码编译,如果代码编译出现错误提示:..\SYSTEM\usart\usart.c(38): error: #260-D: explicit type is missing ("int" assumed)+ E$ {- O, X2 {# H% ]: Z& F* } . o; {- u3 `; x$ g0 d$ ~ 双击打开定位到38行,这里由于形参为int,且没有返回值,所以添加一个void即可。7 j* L" c- J" S- |+ Y- ^, s
- e* D- `3 n$ a9 { 二、ISP串口程序下载 再使用串口下载之前需要再电脑上安装串口驱动:CH340G,链接后任务管理可进行查看。) G3 @! z! R8 ?3 C0 m$ k8 ?9 n
在安装好USB串口驱动后,打开串口下载软件FlyMcu,该软件是 mcuisp 的升级版本(flymcu 新增对 STM32F4 的支持),由 ALIENTEK提供部分赞助,mcuisp 作者开发,该软件可以在 www.mcuisp.com 免费下载。0 E; ~& b4 Y+ p/ t; U 1 g* x8 z& {( ^3 Z4 N0 a# y$ b4 m
串口的一建下载功能( s7 c* R6 @9 y* a F 由于使用传统串口方式下载需要调整BOOT[1:0]的状态,比较繁琐。所以采用了一键下载电路。) f* P8 s& C/ H, O0 R% l' v 0 l: L' c8 M* @) V- V: z% V3 R Y2 r 一键下载电路利用了串口的DTR和RTS信号,分别控制STM32的复位和B0,配合串口上位机软件FlyMcu,设置:DTR的低电平复位,RTS高电平进入BootLoader,这样,B0和STM32的复位,完全可以由下载软件自动控制,从而实现一键下载。 设置在编译前设置输出.hex文件
重新编译后在Objects文件中就会生成机器二进制代码文件.hex) A! z1 }7 H2 t7 t- {5 ?* n. [
! G8 p' u7 p# `0 _: `% L 在串口助手中添加工程的.hex文件,和设置窗口下载0 u. ]4 w* Z3 S/ Y7 w4 u 7 ^* Y% c7 x8 Q
3 e+ R; {( L* Z' X! o 设置编程后执行,否则需要按一下复位键才能重新执行代码。 编程前重装文件,该选项也比较有用,当选中该选项之后, flymcu 会在每次编程之前,将4 H/ O: ]! r+ C. {% o- u! C& D: A) j hex 文件重新装载一遍,这对于代码调试的时候是比较有用的。 特别提醒: 不要选择使用 RamIsp ,否则,可能没法正常下载。 点击开始编程# ~1 x) @. }. B, f1 L' O 2 k1 c7 P# @; F. H
打开串口助手发现移植接受到数据 说明程序已经下载到板卡内,且正常运行. S4 w5 _) m& L' z" ?% P" u : N1 w. }( M% _6 w5 F W
- n ^+ n: x* _+ N5 \& Q 三、LINK程序下载与在线调试4 S* X( _8 o! ?2 g( z1 B: G. \% A Y4 u 3.1 JTAG/SWD调试原理简析
% f4 E5 d8 V8 [# n' Z7 u6 ]% Z
6 I7 Z& z& Y! x! G8 m7 | 复位后JTAG对应的IO引脚默认为JTAG模式,有时候配置相应的引脚无法使用GPIO功能,PB3/4! l9 g3 F7 f/ }6 U" R; z) R
% f3 R3 r! m* o$ M: X. |9 z3 u 3.2 硬件连接 * u* u4 _" F/ [# {; e$ K V, l4 O
6 r; Z" u' F: z" L" N! c6 X0 z$ Y w
3.3 JTAG/SWD模式配置5 b$ D% a. k: \& D, K7 a# T8 I2 W 当用到PB3/4的GPIO功能是需要对其模式进行重新设置,在文件stm32f4xx_gpio.c中,void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF); 9 Q+ p3 }7 [6 `( @$ S 默认复位状态,这些引脚都是JTAG/SWD调试功能开启。 如果需要关闭,只需要相应的IO口设置为相应模式。
; {) N6 g# o Y! z# r 3.4 程序下载 由于串口只能实现下载程序功能,而不能实现跟踪调试,而调试工具,JLINK/ULINK/STLNK等实现程序的跟踪。SWD下载调试仅需要占用两条IO口; Z' s& D( l/ `$ n& D2 H1 P" z 本人使用的是STLINK进行在线调试。 调整Options for Target中的Debug选项卡
: x6 J: a) h5 w" M. M& I& `# T 上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执行 startup_stm32f40_41xxx.s 文件的 Reset_Handler,再跳到main 函数。 3 @* K0 c, d7 r2 R8 f6 M 点击Setting设置 - f4 r8 z0 e' b0 n; d" a; [* @' Y
使用SWD接口方式,右边已经显示检查到SWDIO接口6 x8 D3 C- w$ N- A+ x6 c 下载设置( \- z8 \4 g. } % G4 p7 X$ R: S0 M; k
代码程序的下载 重新编译后直接点击下载按钮就可以了; Z" l% X5 q$ p, Q1 o _/ M/ c 6 C) } \# B, P( V/ E4 v0 s
O& L7 B" d8 O5 r- o6 D 下载完成 2 |/ v6 g ^0 A) u7 ?6 y0 H/ k
3.2 在线调试. e8 n- t" E4 ?: m: V& Q MCU内部已经被下入程序,接下来可以点击(开始/暂停仿真按钮)进行在线仿真。,点击 后出现仿真界面,其中上面由调试的工具条: $ x4 j; G1 {* H O( K1 n1 D
6 }3 s* A6 o4 D' S+ E! x$ s 复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。 执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。 停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。! `' W, z2 j* `& J" a 执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。$ Z1 r, G2 G8 b5 A% J 执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。 执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。 执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。 汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。+ N9 h4 R9 m5 q1 o6 }) H& c9 p 堆栈局部变量窗口:通过该按钮,显示 Call Stack+Locals 窗口,显示当前函数的局部变量及其值,方便查看。 观察窗口:MDK5 提供 2 个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。$ o2 w/ Y% P1 S1 {1 S 内存查看窗口:MDK5 提供 4 个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口. o% L6 a1 j) l3 t 串口打印窗口:MDK5 提供 4 个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。 逻辑分析窗口:该图标下面有 3 个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(Logic Analyzer),点击即可调出该窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。 系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。: J6 D1 k2 o0 F. l9 h7 X: U9 z ) a: d" c7 u9 _ z0 ~: v 现在先不忙着往下执行,点击菜单栏的 Peripherals System Viewer USART USART1 。 可以看到,有很多外设可以查看,这里我们查看的是串口 1 的情况。如图 4.2.9 所示:/ D A. E/ n# f( I. x, f. ~1 ~ 7 j# B4 Z5 n+ O0 A
这里先点击复位按钮,然后打一个断点,且点击将程序执行到该断点处。就会发现相关的区域就会出现相应的变化。: ] o/ V7 c3 }7 N/ T6 z
0 t& m9 C( |) Q: _, N2 l2 _4 j 该文档到这里就结束了主要讲了如何建立工程、下载程序和程序的在线调试) p% J1 Q. ] X: l4 t" q ———————————————— 版权声明:追逐者-桥- k9 i0 A9 h& \$ a; c" g 如有侵权请联系删除 1 I4 j6 T2 L6 s) Z6 B7 [1 Y% j 1 |1 Q7 { s w( Q $ M: ~' \: B, _( i |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版