丹凤千字科普:怎么运行keil里面的代码(详细资料介绍)


丹凤千字科普:怎么运行keil里面的代码(详细资料介绍)  

本章教程主要向大家介绍STM32H7的启动流程。启动过程指的是从CPU上电复位执行第一条指令开始,到进入C程序main()函数之间的部分。

理解启动过程对于理解程序运行机理和RTOS学习都非常重要。尤其是对于那些打算学习RTOS的开发者来说,因为移植时涉及到中断向量表。

对于初学者来说,这部分内容可能有些复杂,但不用担心,随着对简单应用的理解和掌握,再来看这部分内容,会有更多的帮助。由于我们的V7板子是基于STM32H7XXX,所以这里的分析主要针对H7系列的启动过程,F1和F4系列也有相似的启动方式。

以下是关于启动过程的一些重要提示:

1. 相比F1、F4的启动方式,H7的启动方式更为灵活,仅需要一个boot引脚即可。但是一个引脚只能区分出两种状态,为了解决这个问题,H7特别增加了两个option bytes选项字节来解决此问题。

2. 这里将介绍不同编译器和H7系列对应的启动文件。首先是不同编译器的启动文件,打开我们提供的工程文件路径如下:LibrariesCMSISDeviceSTSTM32H7xxSourceTemplates。在这个文件夹里,有ST官方为各个编译器提供的启动文件。需要注意的是,KEIL公司已经在2005年被ARM公司收购,因此大部分例程都是配套MDK和IAR两个版本开发的。这里主要分析MDK的启动文件,IAR和MDK的启动文件大同小异。

3. 接下来是不同H7系列对应的启动文件。以ARM文件夹里的文件为例,如果是H743系列,就使用startup_stm32h743xx.s文件,如果是H753系列,就使用startup_stm32h753xx文件。这些启动文件主要负责完成一些初始化工作,如设置堆栈指针、设置PC指针、设置中断向量表等。

4. 启动文件是后缀为.s的汇编语言文本文件,每行前面的分号表示该行是注释。启动文件主要完成以下工作:设置堆栈指针SP = __initial_sp;设置PC指针 = Reset_Handler;设置中断向量表;配置系统时钟;配置外部SRAM/SDRAM用于程序变量等数据存储(这是可选的);跳转到C库中的 __main ,最终会调用用户程序的main()函数。Cortex-M内核处理器复位后,处于线程模式,指令权限是级别(最高级别),堆栈设置为使用主堆栈MSP。

5. 在硬件复位之后,CPU内部的逻辑电路首先完成两个工作(程序代码下载到内部flash为例,flash首地址0x0800 0000):将0x08000000位置存放的堆栈栈顶地址存放到SP中(MSP);将0x08000004 位置存放的向量地址装入 PC 程序计数器。CPU 从 PC 寄存器指向的物理地址取出第一条指令开始执行程序,也就是开始执行复位中断服务程序 Reset_Handler。复位中断服务程序会调用SystemInit()函数来配置系统时钟、配置FMC总线上的外部SRAM/SDRAM,然后跳转到C 库中__main 函数。由C库中的__main 函数完成用户程序的初始化工作(比如:变量赋初值等),最后由__main 函数调用用户写的 main()函数开始执行 C 程序。

接下来我们将详细分析startup_stm32h743xx.s启动文件。在分析之前,需要掌握一个小技巧:遇到不认识的指令或关键词可以检索查询。使用MDK软件,在Help菜单点击uVision Help,然后在搜索栏输入需要查询的单词进行查询,点击“列出主题”按钮,会将相关的知识点都罗列出来。这个功能非常实用,建议熟练掌握。

启动文件主要是汇编语言编写的,每一部分都有特定的功能,比如开辟栈空间用于局部变量、函数调用、函数的参数等;开辟堆空间用于动态内存分配;建立中断向量表;配置系统时钟等。通过了解这些部分的作用和实现方式,可以更好地理解STM32H7的启动过程。第6部分代码分析

代码片段如下:

1. 这是一个关于异常处理程序的代码段,其中包含多个中断处理程序的声明。例如NMI_Handler和HardFault_Handler等。这些处理程序在发生特定中断时被调用。

2. 在第5行,我们看到了一个死循环。这是一个无限循环,用户可以在此处实现自己的中断服务程序。通常情况下,用户会在其他的C文件中重新写一个相同名字的中断服务程序。如果没有在其他文件中定义中断服务程序并且使能了这个中断,程序会卡在这个地方。

第14部分:这是默认中断服务程序的开始部分。如果用户使能了某个中断但没有为其编写服务程序,那么程序将进入此默认处理程序。

第7部分代码分析:这部分代码涉及到启动过程中的堆栈初始化。以下是具体分析:

2. 第5行指出__user_initial_stackheap函数将由__main函数调用,用于初始化堆栈。MicroLib是MDK中的微库,比标准库更加适用于嵌入式应用,因为它占用的RAM和FLASH空间更少。在使用诸如math.h、stdlib.h等库时,MicroLib会被调用。关于MicroLib的更多信息可以通过提供的链接了解。

关于启动模式的分析和补充:某些微控制器的启动模式更加灵活,如H7系列,只需一个boot引脚即可实现启动模式的选择。H7还提供了两个选项字节来配置存储器地址,以应对使用boot引脚无法直接选择所有可能的存储器地址的问题。在启动过程中需要注意一些细节问题,如设置的地址范围必须在有效的存储器地址内等。与此相对比的是F1和F4系列的启动方式,它们由BOOT0和BOOT1两个引脚共同决定启动模式。在总结中提醒初学者了解启动过程的重要性并关注后续的电路设计等内容。此外还推荐了一些相关资源供读者学习交流并提供了购买链接作为福利推广。

  丹凤千字科普:怎么运行keil里面的代码(详细资料介绍)