历史上的今天
今天是:2024年10月19日(星期六)
2021年10月19日 | stm32专题四:启动文件分析
2021-10-19 来源:eefocus
stm32的启动文件startup_stm32f10x_hd.s主要包含以下6个部分:
分配栈,包括大小和栈顶地址(不初始化);
分配堆,包括大小和堆起始地址(不初始化);
初始化中断向量表,将栈顶地址初始化为FLASH的0地址,复位程序为0X04地址,并将程序计数器指针PC指向复位程序0X04;
复位程序;
中断服务程序;
初始化1和2分配的堆栈;
以下是启动文件:
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name : startup_stm32f10x_hd.s
;* Author : MCD Application Team
;* Version : V3.5.0
;* Date : 11-March-2011
;* Description : STM32F10x High Density Devices vector table for MDK-ARM
;* toolchain.
;* This module performs:
;* - Set the initial SP
;* - 初始化堆栈指针SP
;* - Set the initial PC == Reset_Handler
;* - 初始化PC指针 == Reset_Handler复位程序,上电复位后的第一个程序
;* - Set the vector table entries with the exceptions ISR address
;* - 以规定的ISR(中断服务请求)地址来设置中断向量表
;* - Configure the clock system and also configure the external
;* SRAM mounted on STM3210E-EVAL board to be used as data
;* memory (optional, to be enabled by user)
;* - 配置系统时钟,配置挂载到stm32板上的外部SRAM(可选项)
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* - 调用Ck库函数 __main,去到C的世界
;* After Reset the CortexM3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;*******************************************************************************
; 1-栈
; Amount of memory (in bytes) allocated for Stack
; 为堆栈分配内存,以字节为单位
; Tailor this value to your application needs
; 可以根据需要修改栈的大小
; ; 配置栈(栈就是一块内存):变量(局部/全局),函数调用 ; ;
Stack_Size EQU 0x00000400
; 定义栈大小 1024字节(1KB)
AREA STACK, NOINIT, READWRITE, ALIGN=3
; 告诉编译器汇编一个数据段,段名为STACK,不初始化,可读可写,8字节对齐
Stack_Mem SPACE Stack_Size
; 分配内存空间,单位字节,大小为Stack_Size
__initial_sp
; 栈顶地址
; 2-堆
; ; 配置堆,主要用于动态内存分配,malloc() ; ;
Heap_Size EQU 0x00000200
; 512字节
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
; 堆起始地址
PRESERVE8 ; 当前堆栈以8字节对齐
THUMB ; 兼容THUMB指令集,THUMB是16位指令集,现在使用的THUMB-2是32位指令
; 3-中断向量表
; Vector Table Mapped to Address 0 at Reset
; 初始化中断向量表,向量表在复位时映射到地址0
AREA RESET, DATA, READONLY
; 汇编一个数据段,属性只读
EXPORT __Vectors
; 向量表起始地址
EXPORT __Vectors_End
; 向量表结束地址
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
; 把栈顶地址初始化成向量表的起始地址,解释如下:
; 向量表从FLASH的0地址开始放置,以4个字节为一个单位,地址0存放的是栈
; 顶地址,0X04存放的是复位程序的地址,以此类推。从代码上看,向量表中存放
; 的都是中断服务函数的函数名,可我们知道C语言中的函数名就是一个地址。
DCD Reset_Handler ; Reset Handler
; 初始化复位程序地址,地址0X04
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
史海拾趣
|
大家好,本人新手,希望得到大家的帮助! 我想使用C51单片机连接一个74HC154译码器,进而实现对多个步进电机的控制,我想问的是这能否实现?如果不能实现,我该怎样才能做到用单片机控制多个电机呢? 非常感谢! 简单地说,怎样实现用单片机控制 ...… 查看全部问答> |
|
现在想用msp430的串口进行收发程序开发,但不知道对方一次发送过来多少数据?如何才能完整接收呢?我感觉使用中断的方式一次只能接收一个字节的数据,不能把对方发送的完整数据全部接收!请问有什么解决办法?谢谢! 另外,使用串口通信,一方是ms ...… 查看全部问答> |
|
有一套串口通信协议需要分析破解,寻求达人帮助! 谢谢! to:hawking20001981(东东VC++Primer) 请速和我联系! QQ:652650436… 查看全部问答> |
|
我用ta做pwm输出,设置如下: void init_timer_a(void) { TACTL = TASSEL1 +TACLR + MC_1; //选择SMCLK为时钟,定时器清空,选择up模式,中断允许 TACCTL0 = CCIE; //将CCR0设为比较模式,中断允许+ TAIE TACCR0 = 1 ...… 查看全部问答> |




