
4.1 初学者重要提示 KEIL官方有一个专门的MDK上手文档mdk5-getting-started,在MDK的安装目录里面。. `3 Z7 ]$ E) s4 y( n0 n MDK5的工程创建过程还是比较重要的,务必实际上手操作一遍。/ d1 Q) c/ s; x8 b( G # N1 p$ u v/ s0 V5 I& e8 _* U 4.2 第1步,创建工程文件夹 创建一个文件夹,里面包含如下文件(直接将跑马灯例子的Project文件里面内容全部删除,然后整个工程复制进来即可)。 X M! f% v2 c) t. W4 g, _ 2 Q9 T2 p1 Q8 u7 Q" f3 Y9 S: M6 Z ![]() Doc文件夹, p# \/ r$ J( u1 V( k" m3 c+ f. Z6 l 用于记录例程的修改记录和例子简介。 * N1 m" p6 F2 J6 ]4 s! O4 ^6 t Libraries文件夹3 U9 x7 |1 B% U3 n 在第一章详细介绍从官网的下载方法。3 r2 @ d' }9 N4 l G3 w' F* |. m5 Y. F; f' G8 E Project文件夹+ g. @ T) H) g 这个是本章的重点,在这个文件夹里面再建立两个文件夹,MDK-ARM(uV5)文件夹里面用于存放MDK工程,EWARMv8文件夹用于存放IAR工程,方便以后创建IAR的工程。2 ~; |, U" v/ A1 ~! ]7 ?1 I 0 {. T7 t% m w9 L User文件夹 s( a: w" \6 z 这个是要用户提供的,开发板已经都提供好,bsp文件夹里面是开发板各个外设的驱动,segger文件夹是硬件异常分析代码。' [; G- y/ `7 u* ~# _, [ 删除目标文件.bat h; a2 B. B" | 这个是批处理文件,用于删除MDK和IAR工程编译后生成的obj和list临时文件。 , O8 K* w' B/ V8 f8 e6 s7 V, J 4.3 第2步,创建新工程, G6 H2 P. `; |9 T6 m1 ] 打开MDK,选择Project ->New uVision Project: ![]() 工程名设置为project:. a8 o( G( c( G' E 9 z9 j1 ~9 e( ?% \ ![]() I Y$ [! \* P. H! W" [1 | 选择器件:STM32H743XIHx ![]() / i+ x6 ?2 `" F) d" g7 t5 ~' `: Y; r) b 点击OK后弹出如下界面,点击Cancel取消,当前我们还不使用RTE环境创建, ![]() : ~0 I/ Q2 `. ~" g 4.4 第3步,设置工程名和工程分组名 默认新建的工程是下面这样的:; ~2 }# ]0 t) z D " K1 u( n/ L; g4 [0 @+ h6 Z4 { ![]() 打开Manage Project Items,双击Targer1修改名字为Flash,或者任何其它方便自己管理的名称,设置完毕后点击OK。 ) G' Y3 M& c' K/ @! [9 ^ ![]() 5 f& C6 S: I3 j I! Q 可以看到已经修改为Flash: ; v* ~! Q, L2 H! [; W ![]() & I5 M2 ^% m4 f b2 q 再次打开Manage Project Items,添加如下分组内容: ![]() ) g) L2 ?, r8 ?! ~ 可以看到左侧工程列表已经更新: " ?, C- G& b6 l9 m, O1 z9 Z) d ![]() 4.5 第4步,添加工程文件 添加方法跟第2步,第3步一样,可以通过Manage Project Items添加: ) O7 H2 E: N" U/ C' [- o% N) D ![]() 也可以直接双击工程列表里面的分组添加(注意文件类型里面推荐设置为ALL files所有文件): ![]() 7 d2 g5 |1 x6 z* T8 L: k 添加User分组需要的文件1 @ _& W0 C. i6 S( ]# h6 K ![]() ) V1 m* w2 u& j, L main.c文件位于文件夹User,实现了一个简单的跑马灯效果。$ W2 {1 P; {: c1 B7 X 添加BSP分组需要的内容 ( O4 O* A4 b$ b, j ![]() bsp.c 位于路径\User\bsp,主要用于MPU、Cache、时钟和外设初始化。& h% {2 Z8 `9 C/ d: T - W7 y3 N$ R( o+ D) @. B bsp.h位于路径\User\bsp,此文件是各种头文件的集中汇总贴,方便管理。 bsp_led.c位于路径\User\bsp\src,用于LED驱动。 bsp_key.c位于路径\User\bsp\src,用于按键驱动。, B% i7 t& [2 d3 Z; I8 ]' b, E bsp_timer.c位于路径\User\bsp\src,用于软件定时器组和微妙级单次延迟。: z+ B% C% |1 |. Q bsp_fmc_io.c位于路径\User\bsp\src,用于IO扩展,这里LED要用到。 1 m& _) i, V, U! k/ @, | bsp_uart_fifo.c位于路径\User\bsp\src,用于8串口FIFO驱动。 & m1 Q" a7 f* M& q, t stm32h7xx_it.c位于路径User\bsp,用于部分系统中断服务程序。 - B" w" Y* ]+ Q: |( Q- M. \ 添加MDK-ARM分组需要的内容 3 x. e# v8 I* Z& `2 j! n& u6 _ ![]() startup_stm32h743xx.s 位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm,主要用于堆和栈空间设置,中断向量表也在这个文件。 5 t1 f! N* w) L1 F$ L 添加HAL_Driver分组需要的内容* x! @- K4 X: v2 I: j; z6 d/ Z5 W ![]() stm32h7xx_hal_conf.h位于路径\User\bsp,主要用于HAL库的配置。0 [9 @( g* y0 t: x& |& h4 b* U & U& h" f# a: [8 o' z 其它文件路径:\Libraries\STM32H7xx_HAL_Driver\Src,用到什么外设添加什么驱动文件即可,有些外设驱动跟DMA也有关联,直接添加进来即可。7 Q0 \) {2 e7 a( e8 P } 添加CMSIS分组需要的内容 ![]() system_stm32h7xx.c位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates,主要用于复位RCC相关寄存器和中断向量表位置设置。 ; J5 I/ _, Q$ b+ a& j 添加SEGGER/HardFault分组需要的内容 ![]() 这两个文件位于路径:\User\segger\HardFaultHandlerMDK,主要用于硬件异常分析。; A+ r( q) t, v. q 8 g) n: ^7 E9 \. `5 Q" t/ t9 K. d 添加Doc分组需要的内容 ! U [2 l! k3 L8 `" B% Q ![]() 3 u) E0 K3 F$ B. D! u6 D$ l1 g. n/ } 这两个文件位于Doc文件夹,主要用于说明例程的功能和更新记录。 4.6 第5步,Target Options配置) K/ `* ]5 J1 c/ a8 B% R MDK的配置基本都集中在Target Options对话框里面: ![]() 1 m# H) K$ p6 Q b8 Q 4.6.1 Device选项 这个选项不用管,因为我们在创建的时候已经选择了STM32H743XIHx, c! c8 z$ z& o$ r% r7 t & d" a/ U: G r% X P ![]() 4.6.2 Target选项 4 l3 V, @4 j. y ![]() ' x0 Z5 W7 u2 ] 因为我们一般不用软件仿真,这个选项不用管,也不推荐大家用MDK提供的软件仿真,问题比较多。# i) g, |2 t. t 选择编译器,使用默认的AC5即可。当前AC6支持的还不够好,仅MDK自家的软件都支持了,第三方的问题稍多。 我们这里使用微库MicroLib,这个库针对嵌入式应用,MicroLIB做了深度优化,比使用C标准库所需的RAM和FLASH空间都大大减小。比如调用:<math.h>,<stdlib.h>,<stdio.h>,<string.h>。 , o/ Q7 _. i1 j% n8 T" d/ t ![]() 5 K1 e% U; o E STM32H7支持双精度浮点,所以这里选择Double Precision双精度浮点。 x7 e! o& h/ W( l STM32H743XIH的Flash首地址是0x0800 0000,大小0x200000,即2MB。$ P$ o* P q4 a$ l5 v 默认的RAM空间选择DTCM,首地址0x2000 0000,大小0x20000,即128KB。 地址0x2400 0000,大小0x80000,即512KB是AXI SRAM的空间。 4.6.3 Output选项 ![]() 用于存放MDK编译过程中生成的obj临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Objects,这里无需修改,使用默认即可。 Debug Information表示调试信息,选上。6 F2 E# J2 u j& |- n Create HEX File表示是否生成hex文件,选上。 Browse Information表示是需要go to def的支持,使用HAL库话,推荐先不要选上,因为MDK5使用AC5编译HAL库时间比较长. 8 h7 J4 k+ {/ i/ F9 h( j ![]() 6 c$ G5 @( P7 \+ x8 g. z) p/ Q 4.6.4 Listing选项, G1 Z2 D1 p& o4 M# g: ~! j& m ![]() 用于存放MDK编译过程中生成的list临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Listings,这里无需修改,使用默认即可。. H$ i; G; N* G" V 是否生成*.lst文件,选上。8 a/ c: k) j9 V& w: v 查看MAP文件要用上,全部选上。 4.6.5 User选项# s7 s `9 m0 c- i7 K3 q) w( Q. @ % _/ W6 v" P7 H, g: ]" L) q9 g( y ![]() 这个选项基本用不上,可以不用管,主要是用来指定编译之前和编译之后执行的用户程序。对于本教程配套的例子来说在这里添加了一个批处理功能,用来实现Objects文件夹里面的hex文件复制到路径Project\MDK-ARM(uV5)里面,方便查找。 ![]() & \7 F( L; _* O$ _4 r 4.6.6 C/C++选项; a' T9 ^. C. X4 k- e/ p , ?) g- ^7 W) ?& H9 R8 i6 x ![]() & h1 R* d% Q4 x" i! @ 预定义宏 USE_HAL_DRIVER 表示使用HAL库。 STM32H743xx 表示使用H743系列。. H" ?( v. [% ^, A5 H+ ^ ; {* D+ ^; n0 r7 ^# }, U 选择0级优化,优化等级低,方便调试。5 ~4 L1 N1 q$ S$ g( u# e 如何做MDK编译器的代码最小优化和性能最佳优化3 j" d& S9 g, Y. Y 选项One ELF Section per Function用于删除工程中没有用到的冗余函数。 使用C99规范,在第9章有介绍。0 f4 o7 v; S+ \ 添加路径,把用到的头文件路径包含进来,点击最右侧的小按钮,弹出如下界面进行添加即可: ![]() 4.6.7 Asm选项 u0 t2 Q O( d2 D4 i/ L: d6 H1 } 5 r8 S" t& y8 q ![]() 这个选项用不到,不用管。! k! Z' G( P( n0 d+ a 2 H, x* t& E6 \2 c 4.6.8 Linker选项 3 K1 }7 e* V* s# b ![]() 3 [( u* r' f# g" [* p2 o6 c2 R 这个选项用不到,不用管。 ) Z0 y4 p. y7 S4 P8 M! |1 Q3 a 4.6.9 Debug选项 ![]() 8 T) i* I1 {& B, A5 M, Y+ Z 软件仿真不推荐大家用,问题比较多。1 U$ p4 ?7 `$ O 硬件仿真,这里选择的STLINK,大家根据自己用的那种调试器选择相应型号即可。 ![]() + S' u2 k/ L: t 具体的调试设置在下一章有详细说明,本章主要是保证创建的工程能够正常编译。, O2 |0 A9 {# p9 `6 {( p( h5 B- l ( r( X" p0 N+ j+ T 4.6.10 Utilities选项! W. ?/ L9 _: I ![]() 这个选项主要用于编程工具选择,大家根据自己用的那种下载器选择相应型号即可。 5 @; H9 r3 d ?% q7 I t4 u Update Target before Debugging表示调试前更新芯片的程序。! T3 Z! P" G1 W6 O$ s 4.7 第6步,最后一步验证是否创建成功+ _' A+ P h- _0 ?! y: K 点击全编译: ![]() ( Q# `1 S: Z7 v$ q# G; A 编译结果:0错误,0警告,编译成功。 A6 E8 @$ Z: Y+ @% j- g( ?8 f ![]() 4.8 MDK的字体,多核并行编译,语法提示等设置) {% U' m s: A* Y3 S' N 这里将MDK经常用到的设置做个说明。 ( }) _& }7 m: f: _. b 4.8.1 Tab Size设置# S; Q& q& d/ t7 W 教程配套例子的Tab size要设置为4,否则代码显示不整齐: 选择此图标:; N) n) Q5 n( [! s3 D% V ![]() 弹出的窗口里面设置Tab size为4: + I6 O( U. {" q- ^' d, O9 b ![]() 6 J* A' i$ q3 K( p0 b9 S7 b 4.8.2 使能多核并行编译 电脑有几个核,都选上,加快编译速度。, n H9 t, n6 B c+ O) e 选择此图标: / t$ Y) y6 x- e+ d! x+ E# r0 s; A2 s ![]() 我这里是四核: ! t+ k) F9 [& S$ W ![]() 4.8.3 字体设置, N0 j8 k7 a- H9 R 推荐大家用下微软雅黑,而且可以防止复制粘贴的时候出现乱码问题。 安装微软雅黑的时候要注意,电脑端默认自带了一个微软雅黑,安装的时候会出现字体是躺着的。3 Z, ~5 g& z3 ` l, s7 F 选择此图标: L' {9 Y" z6 C& o/ b( j ![]() 选择中文简体:/ @; J3 f r v7 v: B1 x ![]() - F: l! r r" O) ] 选择安装微软雅黑字体:. j& D7 Y5 J! j" c2 O( \ + k2 D$ e( }2 S9 u: q5 e ![]() 1 J1 H z2 j3 J( r$ S* u2 _" w0 z 效果如下:: Z, I8 ~2 R% N% B 7 F8 }' s. I4 I$ v' Y: b, \7 ^ ![]() 6 V* J" s4 Y, T3 E7 ^' i 4.8.4 语法提示和语法检测功能, d8 e7 F3 s$ i% ], \& H/ W9 \ 选择此图标: ![]() 5 W8 c" H: s6 H! z( w6 w2 [& w MDK的语法提示和语法检测功能还行,大家可以根据需要开启: ![]() 6 t* o# d' t" T& Z4 X- H 4.9 总结, `! v" n8 e4 K3 u 对于初学者来说,务必要实际动手操作一遍,以后移植其它程序代码大有裨益。 2 ^$ J/ n0 J& r* j" q8 ?$ }: R6 F+ { |
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题