历史上的今天
今天是:2024年09月02日(星期一)
2019年09月02日 | STM32开发 -- 启动流程
2019-09-02 来源:eefocus
启动模式讲完了,我们知道是主闪存存储器启动的(主闪存存储器就是芯片内部的flash)。主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x0800 0000)访问它。
接下来,再看一下它的启动流程是怎样的。
话说启动流程,我都讲过很多个了。
参看:S5PV210开发 – 启动流程
参看:DM368开发 – Bootloader 开发(转毕设)
一、回顾

首先你得知道主闪存存储器、系统存储器、内置SRAM代表什么?它们映射哪个区域。
我主要以STM32F105RC为例来讲一下。
参看:STM32F105RC 介绍

主闪存存储器:芯片内部的flash,即256K字节;从用户闪存启动,这是正常的工作模式
系统存储器:应该类似于BL1(18K字节);将程序写入到一快特定的区域,一般由厂家直接写入,不能被随意更改或擦除。
内置SRAM:64K字节;由于SRAM掉电丢失,不能保存程序,一般只用于程序的调试。
二、内存布局
接下来我们就应该看一下,STM32F105RC的内存布局

查看,闪存模块的组织
分为:小容量产品(32K,1KB/page)、中容量产品(128K,1KB/page)、大容量产品(512K,2KB/page)、互联型产品(256K,2KB/page)
STM32F105RC的Flash为256K,可见为互联型产品(Connectivity line devices)

再看,NAND的地址映像

最后,是keil上我们可以设置 IROM起始地址
0x800 0000 – 0x800 4000 为boot

三、启动文件
这里之所以有 8 个启动文件,是因为对于不同容量的芯片启动文件不一样。对于 105 系列,主要是用其中 4 个启动文件:
startup_stm32f10x_ld.s: 适用于小容量 产品
startup_stm32f10x_md.s : 适用于中等容量产品
startup_stm32f10x_hd.s: 适用于大容量产品
startup_stm32f10x_cl.s: 适用于互联型产品
小容量产品主存储块最大为4K×64位,每个存储块划分为32个1K字节的页
中容量产品主存储块最大为16K×64位,每个存储块划分为128个1K字节的页
大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页
互联型产品主存储块最大为32K×64位,每个存储块划分为128个2K字节的页
很显然,STM32F105RC 是互联型产品
那我们就看一下,startup_stm32f10x_cl.s
参看:startup_stm32f10x_cl.s文件解读
1、堆和栈的定义
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
;AREA 伪指令用于定义一个代码段或数据,定义栈,
可初始为0,8字节对齐2*2*2,2的3次方。
;STACK 段名
;NOINIT:指定此数据段仅仅保留了内存单元,
;READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。
;ALIGN属性:使用方式为ALIGN 表达式。
在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,
表达式的取值范围为0~31,相应的对齐方式为2表达式次方。
Stack_Mem SPACE Stack_Size
;SPACE 用来分配一片连续的存储区域并初始化为0。
;Stack_Mem 表示分配0x400个连续字节,并初始化为0
__initial_sp ;表示栈空间顶地址,汇编代码地址标号
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
;ALIGN用来指定对齐方式, 8字节对齐
__heap_base ;表示堆空间起始地址
Heap_Mem SPACE Heap_Size
__heap_limit ;表示堆空间结束地址
PRESERVE8
THUMB
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
2、中断向量表
; Vector Table Mapped to Address 0 at Reset
;实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)
AREA RESET, DATA, READONLY
;定义一块数据段,只可读,段名字是RESET
;DATA属性:用于定义数据段,默认为READWRITE。指定本段为可读可写
EXPORT __Vectors
;在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用
EXPORT __Vectors_End
;在程序中声明一个全局的标号__Vectors_End
EXPORT __Vectors_Size
;在程序中声明一个全局的标号__Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
;栈顶地址,该处物理地址值即为 __Vetors 标号所表示的值
;该地址中存储__initial_sp 所表示的地址值,大小为一个字(32bit)
DCD Reset_Handler ; Reset Handler
;复位中断服务入口地址
DCD NMI_Handler ; NMI Handler
;不可屏蔽中断
DCD HardFault_Handler ; Hard Fault Handler
;硬件错误处理
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
;系统滴答定时器
;External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1 and ADC2
DCD CAN1_TX_IRQHandler ; CAN1 TX
DCD CAN1_RX0_IRQHandler ; CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
史海拾趣
|
我用过memorycopy、write_register_buffer_ulong,他们在拷贝16k数据要消耗将近200us时间,有没有更省时间的函数阿?… 查看全部问答> |
|
针对 Xilinx Spartan™-6 LX150 的电源参考设计 此参考设计旨在给Spartan 6 LX150及带有TI Swift Integrated FETS的DC/DC转换器供电… 查看全部问答> |
|
最近在看FPGA控制ps2来控制vga的显示,可是ps2鼠标的生成模块有很多输出管脚,不知道是不是都有用或者是有的没有用上呢?至少要多少端口,都是做什么的,谁能告诉一下我啊 这个就是生成的模块 … 查看全部问答> |
|
2012年8月14日和15日,飞思卡尔FTF 2012在北京国贸大酒店隆重举行,作为行业内人士备受关注的科技盛会,场面自然异常火爆,小编更是兴奋至极,能够近距离目睹到飞思卡尔CEO Gregg Lowe,这位刚刚上任的掌 ...… 查看全部问答> |




