4.1 初学者重要提示# \+ e: i, K6 N" ]; Z4 I0 z" S7 H KEIL官方有一个专门的MDK上手文档mdk5-getting-started,在MDK的安装目录里面。+ m5 X# D, b9 e% a1 w* W; M+ o MDK5的工程创建过程还是比较重要的,务必实际上手操作一遍。 / I& X# J: G. R 4.2 第1步,创建工程文件夹 创建一个文件夹,里面包含如下文件(直接将跑马灯例子的Project文件里面内容全部删除,然后整个工程复制进来即可)。 Doc文件夹 用于记录例程的修改记录和例子简介。 ( o3 o4 r+ |, [1 }. r Libraries文件夹9 g+ x: ]+ z" x# L5 _7 e, G 在第一章详细介绍从官网的下载方法。 4 \8 T0 j H' t H% T+ _ Project文件夹 这个是本章的重点,在这个文件夹里面再建立两个文件夹,MDK-ARM(uV5)文件夹里面用于存放MDK工程,EWARMv8文件夹用于存放IAR工程,方便以后创建IAR的工程。 User文件夹 s/ B& E% W% H" G 这个是要用户提供的,开发板已经都提供好,bsp文件夹里面是开发板各个外设的驱动,segger文件夹是硬件异常分析代码。 7 T9 R S4 {% u' x) k/ S$ t! E 删除目标文件.bat A6 h( C' ~( g. v& w. W" j3 Y1 D1 _ 这个是批处理文件,用于删除MDK和IAR工程编译后生成的obj和list临时文件。 * a/ v% p1 |7 P, k 4.3 第2步,创建新工程 打开MDK,选择Project ->New uVision Project:- ?; p: C. M" e& K) }+ Y2 U' @' g ) k. q, K. k& v1 @! s% v , L! k3 b% n' N 工程名设置为project: / o9 y3 ~* }$ F8 W+ C7 v 选择器件:STM32H743XIHx 4 ]% b* X3 N0 c6 A% X! Z# H # j( ?$ E6 ^( Z9 b5 H 点击OK后弹出如下界面,点击Cancel取消,当前我们还不使用RTE环境创建, 1 }4 c. `7 T" q& N0 N5 T3 c+ W 4.4 第3步,设置工程名和工程分组名 默认新建的工程是下面这样的:' q) q- _% d7 P' f/ r; l 打开Manage Project Items,双击Targer1修改名字为Flash,或者任何其它方便自己管理的名称,设置完毕后点击OK。 1 i4 o3 S Z$ n* f3 N& m$ m7 [ 8 s. p: S7 I# n& o8 X 可以看到已经修改为Flash:% h0 s! v1 [; Z( S 9 U5 c5 g4 o+ e- _- ^ 再次打开Manage Project Items,添加如下分组内容: ; Z" M* K7 ], h' H S 可以看到左侧工程列表已经更新:( ^* O: P! N2 R' w* u' P; P / _; m! F5 S3 ~8 S 4.5 第4步,添加工程文件) @0 O+ ^* u# F4 {3 r& v# d: x8 n 添加方法跟第2步,第3步一样,可以通过Manage Project Items添加:2 F# m/ S* x" @6 ^+ ^ 4 C# d1 P$ c. `2 O" `5 d" t+ d ! h( N( O5 k7 D- e9 |( G 也可以直接双击工程列表里面的分组添加(注意文件类型里面推荐设置为ALL files所有文件):, r* r7 Q6 X. A & s/ ?; c$ U! q3 `9 R" v! U. U7 z 添加User分组需要的文件 main.c文件位于文件夹User,实现了一个简单的跑马灯效果。 添加BSP分组需要的内容0 m: |8 I- F4 Q' j1 A , @& Y/ ]) [" p6 a4 O. o! g 7 W ~2 `: @2 y) V- B! w u9 o& T; B bsp.c 位于路径\User\bsp,主要用于MPU、Cache、时钟和外设初始化。 bsp.h位于路径\User\bsp,此文件是各种头文件的集中汇总贴,方便管理。 bsp_led.c位于路径\User\bsp\src,用于LED驱动。 9 J% Y+ b5 j" k: d8 @+ R3 y' d bsp_key.c位于路径\User\bsp\src,用于按键驱动。6 }, x1 ]& k1 z+ u( d8 V8 I bsp_timer.c位于路径\User\bsp\src,用于软件定时器组和微妙级单次延迟。0 @( [' w4 a$ \- c bsp_fmc_io.c位于路径\User\bsp\src,用于IO扩展,这里LED要用到。1 K, U0 }' N* z+ J/ E 1 E( ~( }8 X: N bsp_uart_fifo.c位于路径\User\bsp\src,用于8串口FIFO驱动。 1 T: }' R- [1 p stm32h7xx_it.c位于路径User\bsp,用于部分系统中断服务程序。0 [+ j& ~2 v' K, s 4 c- W' \; Q6 V 添加MDK-ARM分组需要的内容 % P- R+ f. K$ v* A$ s startup_stm32h743xx.s 位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm,主要用于堆和栈空间设置,中断向量表也在这个文件。9 A! [6 Q' V; e0 j 添加HAL_Driver分组需要的内容# J% t) A; \, B, C0 V; H $ e! r" R" }- N' j 7 V- ^8 @' ^! s- o9 @9 [ stm32h7xx_hal_conf.h位于路径\User\bsp,主要用于HAL库的配置。 其它文件路径:\Libraries\STM32H7xx_HAL_Driver\Src,用到什么外设添加什么驱动文件即可,有些外设驱动跟DMA也有关联,直接添加进来即可。 添加CMSIS分组需要的内容' E' p$ i) @+ T% g - [; W4 Q. |! D. }# O5 i( p; ?1 r system_stm32h7xx.c位于路径\Libraries\CMSIS\Device\ST\STM32H7xx\Source\Templates,主要用于复位RCC相关寄存器和中断向量表位置设置。- z. ~: U! @" H* }4 }; a ; ^, F! R! _8 G( t* E" x8 o- Q 添加SEGGER/HardFault分组需要的内容 - X5 S) `: @" \1 {+ @7 P6 F e1 X 这两个文件位于路径:\User\segger\HardFaultHandlerMDK,主要用于硬件异常分析。5 ?6 x( r, ~* o& y; Z 添加Doc分组需要的内容 : d, e; O3 ?* }, c 这两个文件位于Doc文件夹,主要用于说明例程的功能和更新记录。 4.6 第5步,Target Options配置 MDK的配置基本都集中在Target Options对话框里面: : o2 O; a4 c6 L* |# }: A 4.6.1 Device选项8 }/ _: c0 u1 h) [ 这个选项不用管,因为我们在创建的时候已经选择了STM32H743XIHx, Q6 A' q% f+ ]' F 3 z, }3 C8 A$ q/ h, H2 D 4.6.2 Target选项 因为我们一般不用软件仿真,这个选项不用管,也不推荐大家用MDK提供的软件仿真,问题比较多。 选择编译器,使用默认的AC5即可。当前AC6支持的还不够好,仅MDK自家的软件都支持了,第三方的问题稍多。 我们这里使用微库MicroLib,这个库针对嵌入式应用,MicroLIB做了深度优化,比使用C标准库所需的RAM和FLASH空间都大大减小。比如调用:<math.h>,<stdlib.h>,<stdio.h>,<string.h>。 - y5 e5 @& \. D9 [7 G STM32H7支持双精度浮点,所以这里选择Double Precision双精度浮点。: @9 e) R7 i. i0 E STM32H743XIH的Flash首地址是0x0800 0000,大小0x200000,即2MB。( w/ s8 W! h8 p2 o5 p 默认的RAM空间选择DTCM,首地址0x2000 0000,大小0x20000,即128KB。 G# k8 q" h; E' \0 v9 w 地址0x2400 0000,大小0x80000,即512KB是AXI SRAM的空间。( K$ W9 ^( @" n 4.6.3 Output选项1 {# ~% K" X$ C: G( H* J 7 b$ u% ]- d; V) i, W ( p3 u; N; W; V4 V 用于存放MDK编译过程中生成的obj临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Objects,这里无需修改,使用默认即可。% d, e- v% `+ F4 U& H% G7 [! t Debug Information表示调试信息,选上。 Create HEX File表示是否生成hex文件,选上。 Browse Information表示是需要go to def的支持,使用HAL库话,推荐先不要选上,因为MDK5使用AC5编译HAL库时间比较长., t+ n; M" G/ m; o( _3 F. z; J ! u& H. V. P% G) W. ^' z, c- S , T) F/ r9 C* T; K, s" i 4.6.4 Listing选项. O* }# [. K$ v: _1 E. g 7 D+ ~' y+ w2 D- @ 用于存放MDK编译过程中生成的list临时文件路径,MDK在创建的时候已经帮我们创建好文件夹Listings,这里无需修改,使用默认即可。 是否生成*.lst文件,选上。9 g7 [- H! |2 x2 E9 [/ e 查看MAP文件要用上,全部选上。* o# Y4 V }; c6 Z( s2 P2 E0 V 4.6.5 User选项 6 b# F6 ~5 t* W( j' |6 s + \7 L* f4 g- e0 w9 D/ h 这个选项基本用不上,可以不用管,主要是用来指定编译之前和编译之后执行的用户程序。对于本教程配套的例子来说在这里添加了一个批处理功能,用来实现Objects文件夹里面的hex文件复制到路径Project\MDK-ARM(uV5)里面,方便查找。 4 b& l {8 C; ^+ y* Y9 V 3 n: H: W( F' S4 Q$ C 4.6.6 C/C++选项( b4 p+ j; ^4 g0 m! S" X7 h7 E ; K3 q$ k) \, G% { 预定义宏: K( Y _8 q8 _9 t- S USE_HAL_DRIVER 表示使用HAL库。 STM32H743xx 表示使用H743系列。 选择0级优化,优化等级低,方便调试。5 K/ q! ~, e3 P5 m 如何做MDK编译器的代码最小优化和性能最佳优化! I$ b5 E: S* r. Y9 v7 I. q 选项One ELF Section per Function用于删除工程中没有用到的冗余函数。 使用C99规范,在第9章有介绍。' {# B. Q1 ^8 k7 P* w i; h7 b, m 添加路径,把用到的头文件路径包含进来,点击最右侧的小按钮,弹出如下界面进行添加即可: ! K G2 U( I3 B0 i/ G& {& ? 4.6.7 Asm选项# j) d8 d5 j8 D$ z* q d 5 @/ P# f: g7 u" J, B. u& a6 Y 这个选项用不到,不用管。 9 T2 a% e. s( W& H* U7 [ 4.6.8 Linker选项 这个选项用不到,不用管。. x7 b# A$ Q& C0 q 0 u# e t7 G) ?5 l' l 4.6.9 Debug选项 软件仿真不推荐大家用,问题比较多。 硬件仿真,这里选择的STLINK,大家根据自己用的那种调试器选择相应型号即可。 # L* I) a( w: O3 a, @' c2 O 具体的调试设置在下一章有详细说明,本章主要是保证创建的工程能够正常编译。- K0 I3 S: r4 K0 L ' J- K) R5 M, a: _/ B1 y4 p- G8 a 4.6.10 Utilities选项+ r7 c, C& X& k0 t# X + }, O/ s x0 o1 w 这个选项主要用于编程工具选择,大家根据自己用的那种下载器选择相应型号即可。 Update Target before Debugging表示调试前更新芯片的程序。 ( C; k7 O9 v5 I" c: J, P- w6 S 4.7 第6步,最后一步验证是否创建成功/ S3 P3 m: l) P# X5 @ 点击全编译: # B2 r y- e/ ?) |( T 编译结果:0错误,0警告,编译成功。 # f* j; R. z) t1 I 4.8 MDK的字体,多核并行编译,语法提示等设置% w' Y* `, g+ N6 J9 K* P 这里将MDK经常用到的设置做个说明。 $ u7 C4 u8 F! ?- M 4.8.1 Tab Size设置 教程配套例子的Tab size要设置为4,否则代码显示不整齐: 选择此图标: 弹出的窗口里面设置Tab size为4:1 g, N: e+ v b* Y' n ; i& L5 m4 {" k6 v/ `# R* P8 h( b3 M 4.8.2 使能多核并行编译/ O6 Y4 k; w2 \3 e# C8 Z8 O @ 电脑有几个核,都选上,加快编译速度。( o" H6 b, U$ v6 N" N 选择此图标: - ?% [& G( S- G4 E- f3 Z8 x9 u+ N5 l 我这里是四核: ( t' E' d, O7 k0 ? 4.8.3 字体设置* D* N' B/ | q- w, {7 t 推荐大家用下微软雅黑,而且可以防止复制粘贴的时候出现乱码问题。& ?& P7 m2 p; Z+ }" a8 Y/ g) {* { 安装微软雅黑的时候要注意,电脑端默认自带了一个微软雅黑,安装的时候会出现字体是躺着的。 ; ~4 e6 V* Y. Q: _ 选择此图标:; e4 C( }1 c! X6 ^: l / W" G2 z; g# d( B7 |9 j. P0 X6 X- @ 选择中文简体:, m K# a2 w ^! W 9 T# X: N! `2 z& b8 R: Z. \ 9 a5 r% T& ^# L+ ~ 选择安装微软雅黑字体:- e' l. W. U: l2 j: R/ A8 I ) C, x- c8 c6 f9 y2 i/ c, G. n 7 L5 l% V! N& P4 c' ~) F% G' ] 效果如下:+ \' [; Q) |$ ]4 Y % y. `( V( s2 {1 v* v* X7 ~& |$ M 4.8.4 语法提示和语法检测功能, A; P/ v, G% `' M; V7 [1 M; h 选择此图标:4 e: Q$ \; y& I: o/ w5 K- m; I 8 {0 f; `6 B# h9 U# r MDK的语法提示和语法检测功能还行,大家可以根据需要开启:8 [. Y) M( W& F7 R0 Y- @ * z9 f S$ x9 Q) e- O( E' s+ S( G 4.9 总结 对于初学者来说,务必要实际动手操作一遍,以后移植其它程序代码大有裨益。 }& Q! R! O# \/ n9 s% C |
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重定向实现方法及常见问题