完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文以STM32F103为例,介绍STM32的启动文件。
一般而言,系统上电后第一个执行的是由汇编所编写的启动文件,其主要工作为一下五部分: (1)、初始化堆栈指针SP=_initial_sp (2)、初始化PC指针,令其=Reset_Handler (3)、初始化中断向量表 (4)、配置系统时钟 (5)、调用C库函数_main初始化用户堆栈,从而最终调用main函数进入C的世界 这上述的五个功能一般都由STM32官方在它们提供的官方库里的ASM文件(汇编启动文件)startup_stm32f10x_hd.s实现,因此在实际中只需要根据所用编译软件的不同选择对应的ASM文件,然后将之加入编译的工程中,再编写自己的main文件便可,而系统时钟已在ASM文件中设为72M,以及向量表已经设置完成(向量表的介绍在别的文章里介绍)。 一、初始化堆栈指针 (1)初始化栈指针(SP) 在startup_stm32f10x_hd.s文件中,开始为上述代码,其将栈大小设为0x0000 0400(1KB),栈名为STACK,不初始化,可读可写,8(2^3)字节对齐。最后的__initial_sp表示栈的结束地址,即栈顶地址,因为栈是由高地址向低地址生长。 栈的主要作用是用于局部变量、函数调用以及函数形参等的开销,其大小应小于内部RAM的大小,以及考虑到局部变量的需求,防止栈溢出。 (2)、初始化堆(Heap) 在栈的代码后面便是初始化堆的代码,其中堆的大小设为0x0000 0200(512B),栈名为HEAP,不初始化,可读可写,8(2^3)字节对齐。而__heap_base为堆的起始地址,__heap_limit为堆的结束地址,因为堆的由低地址向高地址生长。 堆的作用是用于malloc()之类函数申请的动态内存的分配。 (3)静态区 内部一般用于存放全局变量以及静态局部变量,其在程序结束后释放。初始化文件里对其没设置。 对于这三者更加详细的介绍可参考博客:http://blog.csdn.net/liubing8609/article/details/42362179 二、向量表的设置 启动文件中已分配好向量表,此处在另一篇文章中再介绍。 三、初始化中断向量表、时钟并调用C库的main进入C的世界 因为Reset_Handler是系统上电后自动跳转至该处,然后开始执行其后的相关代码,其中_main并非C中的main函数,而是C库函数,其会初始化栈、堆,配置系统环境,在函数的最后调用用户编写的main函数,进入C的世界。 (1)首先是调用SystemInit函数来初始化系统时钟以及中断向量表 查看STM32的官方手册可知,SystemInit函数主要是对RCC进行相关的操作,其中RCC在官方的固件库里的定义如下: #define RCC ((RCC_TypeDef *) RCC_BASE) #define RCC_BASE (AHBPERIPH_BASE + 0x1000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) #define PERIPH_BASE ((uint32_t)0x40000000) 再调用SetSysClock()函数来将系统时钟配置为72M,然后配置一下向量表的地址,便可调到下一步,即调用main()函数从而进入C的世界。 四、用户堆栈的设置 ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory ;该函数可有用户自己实现 EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF END 如上述代码所述,根据宏__MICROLIB是否定义来决定用户堆栈初始化的方法。 小结: 在STM32官方提供的ASM启动文件里,其已完成了系统时钟以及向量表的相关设置,因此如果在main函数中如果时钟频率没要求改变的话,其可以忽略时钟一类信息的设置,而是直接进行相关操作。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1856 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1648 浏览 1 评论
1126 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
750 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1709 浏览 2 评论
1959浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
774浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
603浏览 3评论
620浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
584浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-7 06:15 , Processed in 0.898927 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号