好文档 - 专业文书写作范文服务资料分享网站

STM32启动代码分析、简化、实战

天下 分享 时间: 加入收藏 我要投稿 点赞

初始化堆栈段

由于前面只是定义了堆栈段并没有初始化,这里对堆栈段进行初始化。就像定义了:int a; 初始化a = 1;也可以像代码段一样定义的同时就初始化:int b = 2;

下面代码中有个__MICROLIB,对应后面MDK截图的Use MicroLIB,如果选了勾选了Use MicroLIB,IF就为真,否则为假。

ALIGN

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

+++++++++++启动代码分析到此结束++++++++++++++

简化后的启动代码

1.去掉外部中断,去掉__MICROLIB判断,如果需要可以手动添加 2.去掉SystemInit,系统初始化可以在main函数里进行

3.去掉[WEAK],如果用户自己想定义内部中断服务程序可以加上[WEAK] ;定义栈

Stack_Size EQU 0x00000400

AREA STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE Stack_Size __initial_sp ;定义堆

Heap_Size EQU 0x00000200

AREA HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem SPACE Heap_Size __heap_limit ;MDK关键字

PRESERVE8 THUMB

;定义并初始化中断向量表

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 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

__Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors ;定义并初始化代码段,程序正真的入口

AREA |.text|, CODE, READONLY

Reset_Handler PROC

; __main为运行时库提供的函数,会调用下面定义的__user_initial_stackheap,初始化堆栈。 IMPORT __main

LDR R0, =__main BX R0 ENDP

;异常服务程序,对应同一个死循环的地址 NMI_Handler HardFault_Handler MemManage_Handler BusFault_Handler UsageFault_Handler SVC_Handler

DebugMon_Handler PendSV_Handler

SysTick_Handler PROC

B . ENDP

;初始化堆栈

ALIGN 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 END

;*************************END OF FILE**********************************

;进入main

启动代码实战(点亮一个LED)

1. 打开Keil,新建工程,命名LED保存。

2. 选择芯片型号STM32F107VC,点击OK

3. 是否要默认启动代码,点击否

4. 新建启动文件,保存为start_up.s,并添加到工程中。

5. 新建C程序文件,保存为main.c,并添加到工作中

6. 拷贝启动代码到start_up.s中,并保存。

7. 拷贝C程序到main.c中,并保存。(C程序在最后)

STM32启动代码分析、简化、实战

初始化堆栈段由于前面只是定义了堆栈段并没有初始化,这里对堆栈段进行初始化。就像定义了:inta;初始化a=1;也可以像代码段一样定义的同时就初始化:intb=2;下面代码中有个__MICROLIB,对应后面MDK截图的UseMicroLIB,如果选了勾选了UseMicroLIB,IF就为真,否则为假。
推荐度:
点击下载文档文档为doc格式
3rmzx269sd48fsc2ak5p
领取福利

微信扫码领取福利

微信扫码分享