首页 理论教育 STM32工程文件及嵌入式应用技术

STM32工程文件及嵌入式应用技术

时间:2023-10-21 理论教育 版权反馈
【摘要】:图1-24system_stm32f4xx.c文件stm407xx.h头文件相当于C51当中的reg51.h文件,它负责定义单片机所用变量、寄存器名字与寄存器地址,这样在使用寄存器时无须记忆大量的地址,只需记住相应定义的名称即可。图1-25stm407xx.h文件到此为止,开发环境已建立完成,我们对文件结构也有了一定的了解。

STM32工程文件及嵌入式应用技术

观察工程文件所在文件夹,可以看到除了新建的1.uvprojx和main.c外,系统自动生成了几个文件夹,如图1-22所示,其作用如表1-1所示。

图1-22 项目文件下的文件与目录

表1-1 工程文件目录

依次打开RTE文件夹→Device文件夹→STM32F407ZGTx文件夹,可以看到两个重要的文件,即startup_stm32f407xx.s与system_stm32f4xx.c文件,也可以在Keil的项目管理器中打开这两个文件,单击“Device”展开,如图1-23所示。

图1-23 查看startup_stm32f407xx.s文件

startup_stm32f407xx.s文件是STM32芯片的启动文件,它采用Cortex-M4汇编语言编写好了基本程序,如图1-23所示。当STM32芯片上电启动时,首先会执行这里的汇编程序,从而建立起C语言的运行环境。这个文件由ST公司提供。不同的CPU对应的配置不一样,所以程序员在开始建立工程时要对照相应的型号,一般不要修改这个文件,但可以打开了解一下。

文件一开始定义了许多向量表,例如:

PROC是子程序定义伪指令,相当于C语言里定义一个函数,函数名为Reset_Handler。

EXPORT表示Reset_Handler这个子程序可供其他模块调用,相当于C语言的函数声明。关键字[WEAK]表示弱定义,如果编译器发现别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其他地方没有定义,编译器也不报错,意味着级别最弱。

IMPORT说明SystemInit和__main这两个标号在其他文件中,在链接的时候需要到其他文件中去寻找,相当于C语言中从其他文件引入函数声明,以便后面对外部函数进行调用。

SystemInit需要另外添加,用来初始化STM32芯片的时钟,一般包括初始化AHB、APB等各总线的时钟,需要经过一系列的配置,STM32才能达到稳定运行的状态。SystemInit这个函数在system_stm32f4xx.c文件中。(www.xing528.com)

__main与C语言中的main函数不是一个概念。当编译器编译时,只要遇到这个标号就会定义这个函数。该函数的主要功能是负责初始化栈、堆,配置系统环境,最后跳转到用户自定义的main函数。

“LDR R0,=SystemInit”的意思是把SystemInit的地址加载到寄存器R0。

BLX将程序跳转到R0中的地址执行程序,即执行SystemInit函数的内容。

同理,“LDR R0,=__main”是把__main的地址加载到寄存器R0,接着执行__main函数。

ENDP代表子程序的结束。

这段代码不需要深究指令语法等,只需了解:编译时需要一个SystemInit函数,需要一个主函数,即“int main(void)”。STM32上电后会执行SystemInit函数,最后执行编写的main函数。

system_stm32f4xx.c包含有几个头文件,双击可展开查看,如图1-24所示。先在system_stm32f4xx.c中找到SystemInit()函数。这个函数对系统的时钟做初始化设置,尤其是对RCC的设置,紧接着有SystemCoreClockUpdate()函数、SystemInit_ExtMemCtl()函数等,这些函数都是对设备时钟的设置,以达到系统的配置要求。关于时钟问题,在后面的章节中再继续深入学习

图1-24 system_stm32f4xx.c文件

stm407xx.h头文件相当于C51当中的reg51.h文件,它负责定义单片机所用变量、寄存器名字与寄存器地址,这样在使用寄存器时无须记忆大量的地址,只需记住相应定义的名称即可。比如打开stm407xx.h后,可以找到“#define FLASH_BASE 0x08000000U”这一行,如图1-25所示,很明显这里定义了Flash的基地址是0x08000000,这与表0-2是对应的。

图1-25 stm407xx.h文件

到此为止,开发环境已建立完成,我们对文件结构也有了一定的了解。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈