STM32的BLX R0

本文记录了作者在调试STM32过程中遇到的问题,由于设置过多的断点导致程序卡住。通过减少断点数量,成功解决了该问题。

今天在调试STM32的时候BLX     R0

      Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

一直都在卡着,还以为是单片机出了问题,原来是打的断点太多了。2017.10.30

<think>嗯,用户这次想了解STM32的启动代码和启动流程。从查询内容看,ta应该是个嵌入式开发者,正在学习STM32底层知识。用户之前可能已经接触过基础开发,现在想深入理解启动机制。 注意到用户提供了几个技术引用,其中引用[1]详细列出了不同STM32芯片对应的启动文件命名规则,这正好是启动代码的核心内容。引用[2][3]则展示了外设初始化和通信相关代码,虽然不直接相关但说明用户具备HAL库使用经验。 启动流程其实包含硬件和软件两个层面:硬件上电后首先执行复位中断服务程序,然后跳转到SystemInit函数初始化时钟系统。软件部分的关键在于启动文件(startup_stm32fxxx.s),它定义了堆栈指针初始值、中断向量表以及复位处理流程。用户可能特别需要知道如何根据芯片型号选择正确的启动文件,这点在引用[1]的表格里已经明确分类了。 考虑到用户查询的是"start line code"(可能是笔误),我推测ta实际想了解启动文件的具体代码结构。需要重点解释.s文件里的关键段:__initial_sp定义堆栈顶部,Reset_Handler包含初始化.data和.bss段的汇编指令,最后跳转到main函数。对于高级用户,还可以补充__main函数执行前的C库初始化细节。 用户可能遇到的典型问题包括:启动文件选择错误导致无法运行,或者忘记在IDE中链接正确的启动文件。后续相关问题可以围绕这些实际开发痛点展开。</think>以下是对STM32启动代码和启动流程的详细说明: ### 一、STM32启动流程核心步骤 1. **硬件复位** - 芯片上电后,硬件自动将`0x0000_0004`地址的值加载到PC寄存器 - 将`0x0000_0000`地址的值加载到SP(堆栈指针)寄存器 2. **执行复位中断服务程序** ```assembly Reset_Handler: LDR R0, =SystemInit ; 初始化时钟/内存控制器 BLX R0 ; 跳转到SystemInit函数 LDR R0, =__main ; C库初始化 BX R0 ; 跳转到__main ``` 3. **系统初始化(SystemInit)** - 配置时钟树(HSI/HSE/PLL) - 初始化FPU(若启用) - 设置向量表偏移量(VTOR寄存器) 4. **C库初始化(__main)** - 将`.data`段从Flash复制到RAM - 将`.bss`段清零 - 调用用户`main()`函数 ### 二、启动文件关键组成 启动文件(如`startup_stm32f103xe.s`)包含: ```assembly ; 1. 堆栈定义 Stack_Size EQU 0x400 ; 1KB堆栈 Heap_Size EQU 0x200 ; 512B堆 ; 2. 中断向量表 g_pfnVectors: DCD __initial_sp ; 栈顶地址 DCD Reset_Handler ; 复位中断 DCD NMI_Handler ; NMI中断 ... ; 其他中断向量 ; 3. 复位处理程序 Reset_Handler PROC IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP ``` ### 三、不同芯片的启动文件选择 根据引用[1]提供的对应关系: | 芯片类别 | 宏定义 | 启动文件名 | |------------------------|---------------------|----------------------------| | Medium-density | STM32F103xB | `startup_stm32f103xb.s` | | High-density | STM32F103xE | `startup_stm32f103xe.s` | | XL-density | STM32F103xG | `startup_stm32f103xg.s` | | Connectivity line | STM32F107xx | `startup_stm32f107xc.s` | > 注:需在IDE中正确链接对应启动文件(如Keil的Options for Target → Device → Use Custom File) ### 四、用户程序入口点 在`main.c`中实现标准入口函数: ```c #include "stm32f1xx_hal.h" int main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 配置系统时钟 // 用户初始化代码 MX_GPIO_Init(); // GPIO初始化 MX_USART2_UART_Init(); // 串口初始化 while(1) { // 主循环 } } ``` ### 五、关键注意事项 1. **向量表重定位** 若使用Bootloader需调整VTOR寄存器: ```c SCB->VTOR = FLASH_BASE | 0x8000; // 偏移32KB ``` 2. **堆栈溢出防护** 通过`.map`文件检查: ``` Stack_Size EQU 0x400 Heap_Size EQU 0x200 ``` 3. **启动模式选择** BOOT引脚配置: - BOOT0=0:从主Flash启动(常规模式) - BOOT0=1,BOOT1=0:从系统存储器启动(ISP下载)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值