
4.1 初学者重要提示2 c# e! E$ X5 ^' q KEIL官方有一个专门的MDK上手文档mdk5-getting-started,在MDK的安装目录里面。 MDK5的工程创建过程还是比较重要的,务必实际上手操作一遍。 1 r8 D1 n. }" g' y$ W 4.2 第1步,创建工程文件夹$ Z% B* ?3 }7 D6 y+ J 创建一个文件夹,里面包含如下文件(直接将跑马灯例子的Project文件里面内容全部删除,然后整个工程复制进来即可)。 ![]() Doc文件夹 用于记录例程的修改记录和例子简介。- T+ S4 C6 R3 A& r+ f Libraries文件夹 在第一章详细介绍从官网的下载方法。 0 c9 E! U6 j8 r7 L Project文件夹9 ^2 i; I# l+ m 这个是本章的重点,在这个文件夹里面再建立两个文件夹,MDK-ARM(uV5)文件夹里面用于存放MDK工程,EWARMv8文件夹用于存放IAR工程,方便以后创建IAR的工程。 User文件夹$ l8 q' L+ o$ M/ S1 A 这个是要用户提供的,开发板已经都提供好,bsp文件夹里面是开发板各个外设的驱动,segger文件夹是硬件异常分析代码。: q }9 p% J2 D8 }/ A 删除目标文件.bat 这个是批处理文件,用于删除MDK和IAR工程编译后生成的obj和list临时文件。 - X* v6 }5 t6 I4 Z/ V, A" D 4.3 第2步,创建新工程 打开MDK,选择Project ->New uVision Project:! {4 X2 z, D( ~3 V. v9 v " _* z8 Z' X# _ ![]() 工程名设置为project:% `1 H) X2 P" y ![]() 选择器件:STM32H743XIHx0 P5 m- M; N$ x" l2 ~ ![]() - D& T1 L$ U4 J2 H+ Z4 u$ v 点击OK后弹出如下界面,点击Cancel取消,当前我们还不使用RTE环境创建, & z7 ]. x8 O; ] ![]() 9 J2 J5 R' h: \5 p( Z5 p 4.4 第3步,设置工程名和工程分组名( A* K+ z9 |* M8 J" `3 |# M 默认新建的工程是下面这样的:6 H) y U& u, d# R ) x; T0 @" f: m+ f ![]() 打开Manage Project Items,双击Targer1修改名字为Flash,或者任何其它方便自己管理的名称,设置完毕后点击OK。 # e6 D+ W' ~' b. X ![]() ! X& K, o3 W8 M0 f& t2 w; S9 q 可以看到已经修改为Flash:/ V6 ?) {" O( `; R4 W- }7 a ![]() f; |: c9 E3 q; D. K/ Z 再次打开Manage Project Items,添加如下分组内容: # }$ Z$ s# Q6 j8 Q! W: D1 o ![]() 可以看到左侧工程列表已经更新:7 r! [2 S2 f4 e3 a; A & P- Z( }% x! G- c7 Q, C, Y5 ] ![]() 4.5 第4步,添加工程文件* b; q9 Z Y) y+ c, c2 b5 m 添加方法跟第2步,第3步一样,可以通过Manage Project Items添加: ![]() 也可以直接双击工程列表里面的分组添加(注意文件类型里面推荐设置为ALL files所有文件):7 I" E7 O) t) F$ a 1 B. R% h2 g z3 @ ![]() " E) v6 ?! d. X" h) O3 K 添加User分组需要的文件 ![]() main.c文件位于文件夹User,实现了一个简单的跑马灯效果。6 v3 S* _8 d7 u- [6 i" G8 } l6 O ( j) r" @+ o8 ?, F 添加BSP分组需要的内容' h! w: t" P$ U; C$ ` ![]() ! M' K' p5 N( J' s! G. L( s* }5 E4 W bsp.c 位于路径\User\bsp,主要用于MPU、Cache、时钟和外设初始化。 bsp.h位于路径\User\bsp,此文件是各种头文件的集中汇总贴,方便管理。 bsp_led.c位于路径\User\bsp\src,用于LED驱动。8 K6 ^1 z6 ~- K bsp_key.c位于路径\User\bsp\src,用于按键驱动。- E5 w0 Y$ n5 g # i2 { P8 C1 D) C$ f3 A bsp_timer.c位于路径\User\bsp\src,用于软件定时器组和微妙级单次延迟。 bsp_fmc_io.c位于路径\User\bsp\src,用于IO扩展,这里LED要用到。& p X) g. s# p bsp_uart_fifo.c位于路径\User\bsp\src,用于8串口FIFO驱动。 . S) H7 ]7 D3 `+ w- C3 a4 `# V8 M stm32h7xx_it.c位于路径User\bsp,用于部分系统中断服务程序。7 r6 {' J. J0 ^+ A) O% w # m9 j+ X/ _+ }- }: a% v 添加MDK-ARM分组需要的内容 ![]() startup_stm32h743xx.s 位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm,主要用于堆和栈空间设置,中断向量表也在这个文件。 添加HAL_Driver分组需要的内容/ h( S5 x3 g) @, O & q) @& B- X. h ![]() stm32h7xx_hal_conf.h位于路径\User\bsp,主要用于HAL库的配置。 6 c# D* c" F6 i0 u; M1 O! B- n 其它文件路径:\Libraries\STM32H7xx_HAL_Driver\Src,用到什么外设添加什么驱动文件即可,有些外设驱动跟DMA也有关联,直接添加进来即可。. ?( x% R# H- e* I! y 添加CMSIS分组需要的内容 : W8 _1 A/ V! Z2 y7 I( c9 d+ I# e ![]() ) D6 L5 `6 ]( [: U# _+ [$ D system_stm32h7xx.c位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates,主要用于复位RCC相关寄存器和中断向量表位置设置。2 T. d! u9 ]* F1 {! }1 o 0 h0 C2 U* \2 C& i, G3 i1 A 添加SEGGER/HardFault分组需要的内容3 x; f7 B9 {8 b$ R! k . @5 G% P7 j2 u3 M. q z ![]() 这两个文件位于路径:\User\segger\HardFaultHandlerMDK,主要用于硬件异常分析。 添加Doc分组需要的内容6 H) G9 z9 ]5 \/ q 0 {# z8 V! J* y) _5 K$ D$ b ![]() 这两个文件位于Doc文件夹,主要用于说明例程的功能和更新记录。 4.6 第5步,Target Options配置. o5 x( N) h& _, [! x! |/ n& K3 O/ v# v MDK的配置基本都集中在Target Options对话框里面:; y- N" M, K* f# E; a) S" ? ![]() / s& M. |+ }: s' B1 \ 4.6.1 Device选项 这个选项不用管,因为我们在创建的时候已经选择了STM32H743XIHx/ l- G |9 }; b$ e0 T ![]() 4.6.2 Target选项3 G$ i# d* m% _) l9 G0 ?( f 2 f% b; w7 E. q+ d ![]() 因为我们一般不用软件仿真,这个选项不用管,也不推荐大家用MDK提供的软件仿真,问题比较多。 选择编译器,使用默认的AC5即可。当前AC6支持的还不够好,仅MDK自家的软件都支持了,第三方的问题稍多。" J$ T+ Z) \! R- P9 ?* O E 我们这里使用微库MicroLib,这个库针对嵌入式应用,MicroLIB做了深度优化,比使用C标准库所需的RAM和FLASH空间都大大减小。比如调用:<math.h>,<stdlib.h>,<stdio.h>,<string.h>。 ![]() STM32H7支持双精度浮点,所以这里选择Double Precision双精度浮点。 STM32H743XIH的Flash首地址是0x0800 0000,大小0x200000,即2MB。 默认的RAM空间选择DTCM,首地址0x2000 0000,大小0x20000,即128KB。! M6 l) x9 m7 \0 n4 d9 a 地址0x2400 0000,大小0x80000,即512KB是AXI SRAM的空间。 4.6.3 Output选项 1 N5 u1 ~. D7 T. B+ V ![]() * i" b$ r* G* i" [% \ 用于存放MDK编译过程中生成的obj临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Objects,这里无需修改,使用默认即可。 Debug Information表示调试信息,选上。* y' {7 q* L" s# H Create HEX File表示是否生成hex文件,选上。$ J8 z! |4 `2 J Browse Information表示是需要go to def的支持,使用HAL库话,推荐先不要选上,因为MDK5使用AC5编译HAL库时间比较长.) S+ x1 M% G- N( z3 }" ^ 5 K1 q) ]* v5 y+ _6 K) x ![]() 4.6.4 Listing选项 ![]() 用于存放MDK编译过程中生成的list临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Listings,这里无需修改,使用默认即可。1 \$ W* n7 a7 X$ C t 是否生成*.lst文件,选上。 查看MAP文件要用上,全部选上。 4.6.5 User选项 ![]() + C2 C( t, v; Z 这个选项基本用不上,可以不用管,主要是用来指定编译之前和编译之后执行的用户程序。对于本教程配套的例子来说在这里添加了一个批处理功能,用来实现Objects文件夹里面的hex文件复制到路径Project\MDK-ARM(uV5)里面,方便查找。 - y. ~/ g+ d: A M& n | ![]() 4.6.6 C/C++选项' j2 C; z5 x5 G+ `: [4 X' g ![]() 5 j" e0 ?2 ~* {% { 预定义宏 USE_HAL_DRIVER 表示使用HAL库。* u0 i3 H2 K8 z3 U3 F STM32H743xx 表示使用H743系列。8 ]* ?6 d3 C! t/ \2 d$ k0 c& g; Q0 V 2 o0 h3 R1 }6 w' n/ @ 选择0级优化,优化等级低,方便调试。& q! m1 S! z1 |3 R0 O, H, I 如何做MDK编译器的代码最小优化和性能最佳优化( V! V% z6 {7 y8 u 选项One ELF Section per Function用于删除工程中没有用到的冗余函数。3 x1 F" n9 F$ [ 使用C99规范,在第9章有介绍。 添加路径,把用到的头文件路径包含进来,点击最右侧的小按钮,弹出如下界面进行添加即可:. P5 ^/ X) \4 M& x4 p * \9 s [4 H$ d+ Y& |" I ![]() 4.6.7 Asm选项1 z$ Z3 i9 k( W! B) m ![]() ; X2 V2 W% L& ? o( d9 \ u 这个选项用不到,不用管。 6 B, h& f z( [& u1 R 4.6.8 Linker选项5 ^, ?' W. r7 r* a D 3 ?: s6 R; b0 d ![]() h. ^/ K- c0 c# [. ^ 这个选项用不到,不用管。 # N- i6 @+ J- a5 n+ Z" v0 q1 g$ ] 4.6.9 Debug选项! b1 @/ ]8 T) D+ H4 u9 l0 m* b7 U, u ![]() 8 o& o6 r- @3 M' U& p+ s 软件仿真不推荐大家用,问题比较多。 硬件仿真,这里选择的STLINK,大家根据自己用的那种调试器选择相应型号即可。& B5 x; ^+ p N; K8 [ @+ |) ? ![]() $ F# P8 j1 d! u3 h- `+ h 具体的调试设置在下一章有详细说明,本章主要是保证创建的工程能够正常编译。7 ?6 F4 L' \- c- [2 ]/ U 4.6.10 Utilities选项 T$ b' S$ i1 o) g# ~ ![]() 这个选项主要用于编程工具选择,大家根据自己用的那种下载器选择相应型号即可。 + B$ n* Q* o4 O) r. m+ ]& K) i Update Target before Debugging表示调试前更新芯片的程序。 4.7 第6步,最后一步验证是否创建成功 点击全编译:" C6 o1 G% ?4 A; x - z5 D! Y2 X. m0 n; I- q ![]() % [# R1 ]$ m; U7 ?% m! B 编译结果:0错误,0警告,编译成功。 . t' q! p( ^8 D0 u. r# z ![]() 4.8 MDK的字体,多核并行编译,语法提示等设置 这里将MDK经常用到的设置做个说明。2 z* ]; F0 \- m, @ 4.8.1 Tab Size设置& A( F- x) B- _ 教程配套例子的Tab size要设置为4,否则代码显示不整齐: 选择此图标: ![]() % j4 B" O3 K+ X+ R( L 弹出的窗口里面设置Tab size为4:2 F6 B+ E! C% Y* d. R0 D5 } & P0 \ b5 r \8 B) L ![]() : Y9 G9 ~6 R2 S `% O 4.8.2 使能多核并行编译9 E s5 T5 |, @6 | 电脑有几个核,都选上,加快编译速度。 7 i8 J; [% N, r X! }( G u+ U 选择此图标:2 o% w1 b& y0 y 3 w3 i, V! F' |( p3 o4 O ![]() 1 m, s3 _$ y8 y8 a 我这里是四核: & x: n1 v# i2 Q. G9 w6 d! w ![]() 4.8.3 字体设置/ ]1 Z- S7 F. m$ C! |7 {0 B$ q 推荐大家用下微软雅黑,而且可以防止复制粘贴的时候出现乱码问题。& L9 A3 W x4 e* r* S" a/ Q U 安装微软雅黑的时候要注意,电脑端默认自带了一个微软雅黑,安装的时候会出现字体是躺着的。: s5 ]1 @9 m& O- F6 m" ~% e 0 T, o6 a; e0 `4 G. v2 o1 S" U 选择此图标:3 ^7 }' H5 d: s7 y # j3 `* s0 E+ ]4 W3 X ![]() ( b% G( Q9 Z7 ]/ g 选择中文简体: ![]() 选择安装微软雅黑字体: ![]() . M, `: I1 j- ~9 X% h* \7 X4 _ 效果如下:$ h8 B6 Z% [. F+ X7 c0 E( r % ^( Q( I) e( c( |$ P2 { ![]() 4.8.4 语法提示和语法检测功能& N% w# r- `. @* K- ~) r5 H! h 选择此图标:8 E7 I- H6 p; R: ? J7 d- n1 t5 F% w! U6 s* w) v! N ![]() MDK的语法提示和语法检测功能还行,大家可以根据需要开启:! X' q# p3 r! w& c 2 |$ _8 g' H5 x7 C2 z) |( D' R ![]() / c7 m! C1 m. I* v1 ^, b* ]0 [ 4.9 总结 对于初学者来说,务必要实际动手操作一遍,以后移植其它程序代码大有裨益。 ! \! r. m3 G. Z5 y $ b v; D8 q0 e. W3 o/ M 2 x# L6 x$ e6 V+ C, M |
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明
实战经验 | 关于STM32H745的MC SDK电机控制工程问题的解决办法
【H745I GUI】1.GreenHouse 灯光控制
【Wio Lite AI视觉开发套件】+移植TensorFlow Lite