本文目录一览:
stm32启动不见程序指针
我们知道,我们的程序是放在Flash里的,这个Flash可以存储的时间长,即使断电也不会丢失,可以想象类似我们的手机ROM,一般比较大。所以我们的启动方式就选择这个,看他的芯片手册可以直到怎么去选择。其他两种方式我还不是很了解,后期我学习后会分享给大家。
2. 中断向量表
在正式开始之前,要知道一个东西,中断向量表,很重要。
中断向量表就是中断向量的列表。
中断向量表在内存中保存,其中存放着中断源(中断向量号或者中断类型号)所对应的中断处理程序的入口地址。
一个中断源对应一个中断处理程序,这种关系索引表,就是中断向量表。
中断是很重要的东西对吧,中断的实现就是由中断向量表中的程序实现的,假如这一个定时器中断,它会对应中断表中一项,这一项放着中断处理程序的地址,这个有点像指针。记得之前手写过一些中断(异常)向量表,是ARM汇编,有兴趣的可以了解一下。-stm32启动文件
3. 启动过程
为什么每次上电都是可以执行哪些程序呢?因为我们选择的是Flash启动。他是怎么找到那些我们烧录的程序的。每次启动就是一次中断,对应中断向量表中的复位中断,这就找到了我们的程序。
3.1 STM32启动文件
我们以具体的代码来说明。
项目里有个startup_stm32f103xb.s的文件,这就是启动文件。我们先看看他的描述。
;******************** (C) COPYRIGHT 2017 STMicroelectronics ********************
;* File Name : startup_stm32f103xb.s
;* Author : MCD Application Team
;* Description : STM32F103xB Devices vector table for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the clock system
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the Cortex-M3 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;******************************************************************************
从这个文件看一看出来启动过程大致分为五步:
初始化堆栈指针。
设置PC指针的值。
设置中断向量表。
配置系统时钟。
调用C库函数__main()。
【STM32】STM32的C程序卡死在启动文件 LDR R0, =SystemInit
在线调试STM32 卡在LDR R0, = SystemInit_ExtMemCtl
程序卡在在线调试STM32 卡在LDR R0, = SystemInit_ExtMemCtl的解决办法如下:
出现最多的情况就是设置的 断点过多,可以把断点全部删除试试看 ,把断点设置在主函数。
在程序中使用了C库(printf),那么进入Option---target将usemicroLib勾选上。
硬件原因,主芯片,或者晶振有问题,更换一下就好了
stm32调试不应进入.s启动文件
STM32的FLASH地址起始于0x08000000,程序文件就从此地址开始写入。
此外STM32内部通过“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而“中断向量表”的起始地址是0x08000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。-stm32启动文件