启动文件讲解笔记

启动文件作用:
- 初始化堆栈指针SP
- 初始化PC指针
- 初始化中断向量表
- 配置系统时钟
- 调用C库函数_main,最终去到C的世界

;1-栈配置,用于变量,函数调用
Stack_Size      EQU     0x00000400    ; 1KB

                AREA    STACK, NOINIT, READWRITE, ALIGN=3  ;名字叫STACK,不初始化,可读可写,8字节对齐
Stack_Mem       SPACE   Stack_Size    
__initial_sp                                           ;初始化sp栈顶地址

; 2-堆配置,用于malloc等函数的动态内存分配
Heap_Size       EQU     0x00000200   ;512Byte

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3   ;名字叫HEAP,不初始化,可读可写,8字节对齐
__heap_base
Heap_Mem        SPACE   Heap_Size   ;大小
__heap_limit

                PRESERVE8    ;当前堆栈8字节对齐
                THUMB        ;兼容 THUMB 指令,老的指令,16bit,现在Cortex-M3的都是THUMB-2指令,兼容16/32位

;3-向量表,存的是中断服务函数的名称,即地址
; Vector Table Mapped to Address 0 at Reset,这里的0地址指的是FLASH的起始地址
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
    ;................................省略.................................................
                DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

;4-复位程序,系统上电后第一个要执行的程序              
; Reset handler
Reset_Handler   PROC  ;定义子程序与ENDP成对使用
                EXPORT  Reset_Handler             [WEAK] ;弱定义,可以由其他文件实现,如果没定义才执行汇编里的
                IMPORT  __main                           ;相当于C语言中的extern
                IMPORT  SystemInit                       ;初始化系统时钟,由用户定义
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main                      ;C库函数,实现堆栈的初始化和调用c里面的main函数
                BX      R0
                ENDP
                
;5-中断服务程序,全部为空,需要自己在C程序里面另外实现,但是函数名字必须跟这里的一样
;如果不一样,则会执行这里的中断服务函数,即无限循环,出现这样的错误很难发现                
; Dummy Exception Handlers (infinite loops which can be modified)
;内容省略

;6-用户堆栈初始化,由C库函数_main来完成
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB       ;这个宏在IDE(keil/IAR)里面配置
                
                 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

总体流程:
初始化栈-》 初始化堆-》 初始化中断向量表-》 编写复位程序-》 编写中断服务程序-》 用户堆栈初始化-》

小结:到现在,STM32的基础知识已经学完了,虽然有的东西还是云里雾里,但是至少留下了一个印象。希望在后面写程序的时候能够记起来,到时候不懂能知道去哪里查。其实还是边写代码边学好一点,拿起键盘就是干!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值