
4.1 初学者重要提示 KEIL官方有一个专门的MDK上手文档mdk5-getting-started,在MDK的安装目录里面。% F$ e7 |( [/ H7 T) w MDK5的工程创建过程还是比较重要的,务必实际上手操作一遍。, f% G" r' K5 x( s9 x' O 4.2 第1步,创建工程文件夹 创建一个文件夹,里面包含如下文件(直接将跑马灯例子的Project文件里面内容全部删除,然后整个工程复制进来即可)。 , z6 H" p: s* \/ @' Z ![]() & S6 h* f8 Q7 M3 {9 D( } Doc文件夹 用于记录例程的修改记录和例子简介。 6 f+ q8 B- s1 l# K$ c' O Libraries文件夹5 s8 J& d1 v) E: R( n2 f. y 在第一章详细介绍从官网的下载方法。 ; |/ Z$ Y. Q" ~9 P! h Project文件夹 这个是本章的重点,在这个文件夹里面再建立两个文件夹,MDK-ARM(uV5)文件夹里面用于存放MDK工程,EWARMv8文件夹用于存放IAR工程,方便以后创建IAR的工程。 User文件夹& D2 @$ o" {' O. l% o 这个是要用户提供的,开发板已经都提供好,bsp文件夹里面是开发板各个外设的驱动,segger文件夹是硬件异常分析代码。. s) U! h, o4 f# [7 u3 ? 删除目标文件.bat 这个是批处理文件,用于删除MDK和IAR工程编译后生成的obj和list临时文件。 , y5 W3 x" t1 U4 a2 \ 4.3 第2步,创建新工程 打开MDK,选择Project ->New uVision Project: 5 H& l% U( K; D X2 O ![]() 1 t4 f" }8 W1 l$ n; p 工程名设置为project:8 i4 d) T$ Z& ]4 w u ![]() 9 _6 P( G/ j0 a: ^ 选择器件:STM32H743XIHx; b5 s( k0 Z- |3 L* [ : r: \; ?4 M% l2 f+ N ![]() % a4 h' A6 C' t* t* z0 {# U 点击OK后弹出如下界面,点击Cancel取消,当前我们还不使用RTE环境创建, ![]() 4.4 第3步,设置工程名和工程分组名 默认新建的工程是下面这样的:# e, S2 }) d3 }! N# H. i ![]() 打开Manage Project Items,双击Targer1修改名字为Flash,或者任何其它方便自己管理的名称,设置完毕后点击OK。4 y9 _- n, s1 V6 e2 O( ` 9 N3 v% Y: x' b) h/ ` ![]() $ A2 C: Q! t- |9 I0 Y' c" A" c 可以看到已经修改为Flash:0 U* d: _' i3 s; F& c! q6 f1 V: G ) I; U+ S* b$ R8 O* }( c( i, | ![]() 再次打开Manage Project Items,添加如下分组内容: ![]() 可以看到左侧工程列表已经更新: ![]() e5 j* [5 t$ \0 ?( d1 _- @' s 4.5 第4步,添加工程文件 添加方法跟第2步,第3步一样,可以通过Manage Project Items添加:; \; @% Y1 J" Z4 q" Q% u! F e( ~. G7 J. `; D& { ![]() 5 N- q9 ]) O' T 也可以直接双击工程列表里面的分组添加(注意文件类型里面推荐设置为ALL files所有文件):4 L. U* H3 ^/ j ![]() 添加User分组需要的文件 ![]() $ g B5 v1 \5 k6 \% \) t* |# B; f main.c文件位于文件夹User,实现了一个简单的跑马灯效果。 添加BSP分组需要的内容 ![]() bsp.c 位于路径\User\bsp,主要用于MPU、Cache、时钟和外设初始化。 {& D' O' W3 i- s) o: U ( [4 a( {: P! ^ bsp.h位于路径\User\bsp,此文件是各种头文件的集中汇总贴,方便管理。 bsp_led.c位于路径\User\bsp\src,用于LED驱动。; |' @$ b' a, U& N bsp_key.c位于路径\User\bsp\src,用于按键驱动。4 J d7 l3 g b/ a9 e- V1 c % [! N6 {$ q- O/ z9 |8 Q bsp_timer.c位于路径\User\bsp\src,用于软件定时器组和微妙级单次延迟。$ d8 u8 {$ w q) D$ y+ }0 b bsp_fmc_io.c位于路径\User\bsp\src,用于IO扩展,这里LED要用到。/ S. z" e9 J& L q/ v" E6 u4 v. y* P7 f bsp_uart_fifo.c位于路径\User\bsp\src,用于8串口FIFO驱动。0 a1 i7 k+ C9 d* a % q2 c: M7 z6 f4 t, v: d stm32h7xx_it.c位于路径User\bsp,用于部分系统中断服务程序。, t0 h0 g: f7 k |; o h0 m6 n8 s- t 添加MDK-ARM分组需要的内容* l( h, k% G8 l/ j1 j$ _ ![]() startup_stm32h743xx.s 位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm,主要用于堆和栈空间设置,中断向量表也在这个文件。 添加HAL_Driver分组需要的内容1 Z4 e$ O* y0 z5 f+ n) U7 O ' E( U- v. d- P; E% i/ I ![]() ; c/ u9 N/ K* @) V3 W8 T stm32h7xx_hal_conf.h位于路径\User\bsp,主要用于HAL库的配置。 % ~: W1 n; D; E; j 其它文件路径:\Libraries\STM32H7xx_HAL_Driver\Src,用到什么外设添加什么驱动文件即可,有些外设驱动跟DMA也有关联,直接添加进来即可。2 v) t2 m" S( T `0 A. q 1 {$ B7 T# h# _" u3 D2 Z7 n 添加CMSIS分组需要的内容; P7 d$ c) Z/ J$ g7 p( q ![]() & b6 r9 d1 v i8 T7 D* |- e: [+ ` system_stm32h7xx.c位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates,主要用于复位RCC相关寄存器和中断向量表位置设置。 添加SEGGER/HardFault分组需要的内容7 q2 P5 C" [5 ]6 @0 A0 ]6 Q ![]() 这两个文件位于路径:\User\segger\HardFaultHandlerMDK,主要用于硬件异常分析。 添加Doc分组需要的内容 ) O$ i N4 c5 N) z* } ![]() 这两个文件位于Doc文件夹,主要用于说明例程的功能和更新记录。) K+ ?, J8 z G& n ) `8 U! q! o5 H- |, } 4.6 第5步,Target Options配置 MDK的配置基本都集中在Target Options对话框里面: 3 a6 ^' I2 j( b' t, K ![]() 4.6.1 Device选项7 d* f. j. x0 G4 k, b) B 这个选项不用管,因为我们在创建的时候已经选择了STM32H743XIHx" O# n @7 Z$ _3 C1 Y% s ! N% ^0 x8 v/ T7 M L ![]() 4.6.2 Target选项 ) M" D, _* q* U ![]() 因为我们一般不用软件仿真,这个选项不用管,也不推荐大家用MDK提供的软件仿真,问题比较多。 选择编译器,使用默认的AC5即可。当前AC6支持的还不够好,仅MDK自家的软件都支持了,第三方的问题稍多。 我们这里使用微库MicroLib,这个库针对嵌入式应用,MicroLIB做了深度优化,比使用C标准库所需的RAM和FLASH空间都大大减小。比如调用:<math.h>,<stdlib.h>,<stdio.h>,<string.h>。' ?& ]' M" G( n! E* s ![]() & X# C( M9 ~6 R STM32H7支持双精度浮点,所以这里选择Double Precision双精度浮点。- ~# B+ P. F: `( Y0 b' v8 y STM32H743XIH的Flash首地址是0x0800 0000,大小0x200000,即2MB。: ]# O6 b6 F# c: N Y; q 默认的RAM空间选择DTCM,首地址0x2000 0000,大小0x20000,即128KB。3 o! r- g: @$ q2 n% Y4 [8 P, S 地址0x2400 0000,大小0x80000,即512KB是AXI SRAM的空间。 & b1 `5 @; w% U 4.6.3 Output选项+ W% s$ n; s/ ]# B7 z: O4 N4 ~( n ![]() 用于存放MDK编译过程中生成的obj临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Objects,这里无需修改,使用默认即可。9 }, u# k8 b! [2 I7 Y1 ] Debug Information表示调试信息,选上。. {( w) ?* C# \3 T N: P Create HEX File表示是否生成hex文件,选上。8 r( @7 e" D9 u Browse Information表示是需要go to def的支持,使用HAL库话,推荐先不要选上,因为MDK5使用AC5编译HAL库时间比较长. % } c4 N/ @2 L% S. _8 B ![]() / T3 q5 d. |6 z# j3 j4 Z' r 4.6.4 Listing选项. U5 N; m1 \' k5 i) L$ i9 P# E `, M& \ ![]() ! K) N7 C$ t# a. U 用于存放MDK编译过程中生成的list临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Listings,这里无需修改,使用默认即可。 是否生成*.lst文件,选上。 查看MAP文件要用上,全部选上。$ S/ Z. C% |- b+ E$ z4 V/ j 4.6.5 User选项+ n \- ~ w# x3 m' y9 }, q ' Z$ x6 q7 d% o' @' {3 g ![]() . V0 A& m2 \* e1 W( I 这个选项基本用不上,可以不用管,主要是用来指定编译之前和编译之后执行的用户程序。对于本教程配套的例子来说在这里添加了一个批处理功能,用来实现Objects文件夹里面的hex文件复制到路径Project\MDK-ARM(uV5)里面,方便查找。) h$ H6 P& r* Y: s ![]() * {0 ^: b H% y4 O, Q 4.6.6 C/C++选项8 s; o1 G3 y9 l' C ![]() 6 |2 [" {5 D5 x8 |$ M+ W. G 预定义宏 USE_HAL_DRIVER 表示使用HAL库。/ W; S& ~- ?9 t8 N7 X0 _' E STM32H743xx 表示使用H743系列。6 W# d! W) m) W8 d+ Z6 x + }; p7 j! M D/ m+ e6 M; x. {& a 选择0级优化,优化等级低,方便调试。 如何做MDK编译器的代码最小优化和性能最佳优化% f' c9 P/ M! g) l d 选项One ELF Section per Function用于删除工程中没有用到的冗余函数。9 }2 b8 a* X1 K# a " A# i5 U1 ^/ v, Q 使用C99规范,在第9章有介绍。 添加路径,把用到的头文件路径包含进来,点击最右侧的小按钮,弹出如下界面进行添加即可:6 }+ @8 u) ~8 p5 P ![]() 4.6.7 Asm选项" q8 G4 {& M! h, G; a: Z. \% }" G ![]() 这个选项用不到,不用管。 4.6.8 Linker选项5 k. a! k1 i' ]/ a8 }* V+ V. a: ]+ n ![]() # c( e6 e- h. @0 Q8 y, [& E 这个选项用不到,不用管。 , y) }; x4 b4 ]3 M 4.6.9 Debug选项3 |0 n- x& ]" @" L) v2 l+ B$ Z* q ![]() 9 D* f9 i- ?% s- k2 c 软件仿真不推荐大家用,问题比较多。 硬件仿真,这里选择的STLINK,大家根据自己用的那种调试器选择相应型号即可。 ![]() . r+ K4 J7 K3 t- [- v 具体的调试设置在下一章有详细说明,本章主要是保证创建的工程能够正常编译。% m6 A0 ~$ O+ c* L/ Z& c5 k 4.6.10 Utilities选项+ G& `. M% G" ]' X ![]() 这个选项主要用于编程工具选择,大家根据自己用的那种下载器选择相应型号即可。0 E; g# W3 H8 E% K! @$ C Update Target before Debugging表示调试前更新芯片的程序。 $ ?5 ?/ K% Q1 D& D 4.7 第6步,最后一步验证是否创建成功- p1 U$ X: Q# [, J( H) P ] 点击全编译: ![]() 编译结果:0错误,0警告,编译成功。 ![]() 4.8 MDK的字体,多核并行编译,语法提示等设置3 ^0 W9 m$ w- C. g- }! j/ _8 S! ~2 ` 这里将MDK经常用到的设置做个说明。 4.8.1 Tab Size设置 教程配套例子的Tab size要设置为4,否则代码显示不整齐: 选择此图标:6 [0 `7 E, }; M j' ^ l * S7 r3 t/ N0 [) M- } ![]() 弹出的窗口里面设置Tab size为4: ![]() 4.8.2 使能多核并行编译 电脑有几个核,都选上,加快编译速度。 + }* s% g1 k; A" ] 选择此图标: 3 S [/ J* W8 S( @ ![]() 我这里是四核: ![]() 4.8.3 字体设置 推荐大家用下微软雅黑,而且可以防止复制粘贴的时候出现乱码问题。& U9 c6 s7 T( w; G. _* n A 安装微软雅黑的时候要注意,电脑端默认自带了一个微软雅黑,安装的时候会出现字体是躺着的。8 o% {5 s+ t5 \% n5 z( J5 ?. D0 t , }7 I9 j) `, a! h 选择此图标: ![]() _0 s) \4 M. O2 F* B 选择中文简体:/ M: U7 u: f- z* t ![]() 7 e* i. B8 ~2 Z1 S/ ]! W: S: m9 I 选择安装微软雅黑字体: , S, {/ s- E5 o* o6 g# `( } ![]() ; M/ x+ I+ e5 g6 t 效果如下:8 z& s/ z" h0 ~ C9 a, Z6 w+ M ![]() 4.8.4 语法提示和语法检测功能 选择此图标:: V) a f% i1 b% o# B+ h6 @& W / G: x: Z$ X0 D8 B+ r. }3 M2 Z ![]() MDK的语法提示和语法检测功能还行,大家可以根据需要开启: $ c2 t* Y# m3 @$ ~ ![]() 4.9 总结 对于初学者来说,务必要实际动手操作一遍,以后移植其它程序代码大有裨益。- Q9 C1 A4 y' y& Z' I) ^ 6 s3 ]; Y9 K! J2 q% q |
【Wio Lite AI视觉开发套件】+移植TensorFlow Lite
STM32H745I-DISCO脉冲宽度调制(PWM)
STM32H745I-DISCO串口通信,输入输出
拷打cubemx【002】——自定义还需基于芯片的工程
STM32硬件结构学习
STM32中BOOT的作用
STM32H7的TCM,SRAM等五块内存基础知识
STM32H7的TCM,SRAM等五块内存基础知识
简单了解一下STM32H7的BDMA
有奖预约 | STM32H7R7基于RT-Thread RTOS的智能终端GUI解决方案