【单片机01】启动流程

本文详细介绍了STM32的三种启动方式:Flash启动、SRAM启动和系统存储器启动,其中系统存储器启动包含官方Bootloader,可用于通过UART1接口下载代码。此外,还阐述了芯片启动后的初始化过程,包括中断向量表建立、存储器和堆栈初始化、全局变量和库函数的设置,最后进入main()函数执行。

STM32有3种启动方式

1. 从Flash启动,将Flash地址0x0800 0000映射到0x00000000,这样启动以后就相当于从0x08000000开始的,这是我们最常用的模式;

2. 从SRAM启动,将SRAM地址0x20000000映射到0x00000000,这样启动以后就相当于从0x20000000开始的,用于调试,笔者基本没用过

3. 从系统存储器启动(System memory),将系统存储器地址0x1FFFF000映射到0x00000000,这样启动以后就相当于从0x1FFFF000开始执行的,值得注意的是这个系统存储器里面存储的其实是STM32自带的Bootloader代码,这其实是一个官方的IAP,它提供了可以通过UART1接口将用户的代码下载到Flash中的功能,然后将boot0置0,复位单片机,便可以Flash启动。

注:系统内存存储器我们没办法烧些,因为他是一个只读的ROM,我们只能读取,但是可以通过从系统存储器启动,通过串口UART1烧录代码。

芯片固件->烧录或跳转到用户程序->       初始化执行环境                    ->初始化c库和用户应用程序

                                                        (1)建立中断向量表;                           (1)加载程序运行地址
                                                        (2)初始化存储器;                               (2)初始化数据
                                                        (3)初始化堆栈寄存器;
                                                        (4)初始化i/o以及其他必要的设备;
                                                        (5)根据需要改变处理器的状态。

初始化数据(__main()函数

1.完成全局变量/静态变量/常量的初始化和重定位工作:
a. 跳转进入__scatterload_rt2函数:通过设置四个寄存器来配置待copy内容(静态变量、全局变量、常量)的的加载域和运行域,设置待copy内容的大小,为后续__scatterload_cpy()函数服务。
b. 跳转进入__scatterload_cpy函数,完成静态变量、全局变量、常量的从flash到SRAM的重定位。
c. 跳转进入__scatterload_zeroinit函数,完成未初始化的全局变量的初始化。

2.初始化堆栈(这里指程序栈)和库函数:
跳转进入__user_steup_stackheap函数:调用**__user_libspac__user_libspace**为C库保持了静态数据。这是一个96字节,0初始化的数据块,该块由C库创建。在C库初始化期间可以用来当做临时栈。再调用 __user_initial_stackheap 用户的初始化堆栈函数,实现用户的堆栈的配置,调用 _fp_init 和 __rt_fp_status_addr (C库函数) 两个函数调用实现浮点运算的支持。
 

3.程序的跳转,进入main()函数:
跳转进入用户的main函数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值