一、第一个项目
我们要建立第一个项目,这里主要是为了进行项目分析之用,让我们明白用CubeMX是如何开展工作的以及如何追踪代码逻辑。好了,废话不多说,开干。
这里我选了一款型号为STM32L151C8Tx作为例子来配置MX,如图所示。
按照上图配置完成后,对MX工程进行配置,然后生成代码即可,见图。
好了,不出大的意外,第一个项目已经生成。大家自行打开即可。
二、项目架构
嗯,真的简单的架构,就那么几个文件夹而已,看图。请叫我贴图王,因为我真的非常喜欢图文并茂。
惊不惊喜、意不意外,这样就可以任意驰骋在STM32的海洋里了,无需管那人世间的纷纷扰扰。好了,拉回来。从图中看的确简单,但是我们还是有必要深入代码深处,逐步探究下这CubeMX生成的代码到底是怎么跑起来的。
三、深入代码
深入代码到底多深,只有自己知道,我这里权当抛砖引玉,各路高手自行进一步探究噢。我知道很多人和我一样有强迫症,第一个想看的不是main.c而是。。。。。。江湖中人人传到的汇编!在这个例子中就是startup_stm32l151xb.s。看看这名字,就知道这是个启动代码,只是后缀比较性感,是S。
写CubeMX的人还是很牛逼的,看汇编文件其实也很好看懂,不信你看。
文件的开头写的很清楚就做这么几件事情。
1. 设置系统初始的SP
2. 设置系统初始的PC,PC就是reset_hanlder
3. 设置中断向量表
4. 配置系统时钟
5. 跳到C库的_main中,注意_main不是main噢
看下面的源文件内容吧,我来简要注释下。
/* 栈配置 */
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x400 /* 设置stack大小为0x400 */
/* 定义STACK代码段,可读写,对齐8字节 */
AREA STACK, NOINIT, READWRITE, ALIGN=3
/* 分一段stack size大小的内存空间 */
Stack_Mem SPACE Stack_Size
__initial_sp
/* 堆配置 */
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
/* 向量表 */
; Vector Table Map