当前位置: 首页 > web >正文

STM32F103x6启动代码的详细分析

以下是针对提供的STM32F103x6启动代码的详细分析(中文):

1. 堆栈初始化

Stack_Size      EQU     0x00000400   ; 定义栈大小为1024字节 (1KB)
Heap_Size       EQU     0x00000200   ; 定义堆大小为512字节

作用:

  • 分配独立的堆(HEAP)和栈(STACK)内存区域
  • __initial_sp:栈顶指针(由硬件自动加载)
  • __heap_base和__heap_limit:堆的起始和结束地址

2. 中断向量表

__Vectors       DCD     __initial_sp       ; 地址0: 主堆栈指针初始值DCD     Reset_Handler      ; 地址4: 复位中断DCD     NMI_Handler        ; 地址8: NMI中断...                        ; 后续地址分配其他中断向量

关键特征:

  • 采用固定映射顺序(符合ARM Cortex-M3架构规范)
  • 前4字节必须是栈顶地址,第2个向量必须是复位中断
  • 包含所有STM32F103x6支持的中断源(如DMA、定时器、串口等)

3. 复位处理程序

Reset_Handler   PROCLDR     R0, =SystemInit   ; 调用系统初始化函数BLX     R0LDR     R0, =__main       ; 跳转到C运行时库初始化BX      R0                ; 最终调用main()

执行流程:

  • 调用SystemInit():初始化时钟/外设/内存控制器(需用户实现)
  • 跳转__main:C运行时库初始化(初始化全局变量/静态变量)
  • 最终进入用户的main()函数

4. 默认中断处理程序

Default_Handler PROC
WWDG_IRQHandler
PVD_IRQHandler
...                ; 所有中断默认跳转到死循环
B         .      ; 无限循环

关键设计:

  • 所有中断处理程序默认设置为弱符号([WEAK])
  • 用户可重写任何中断处理函数(只需定义同名函数)
  • 未处理的中断会进入无限循环(防止程序跑飞)

5. 堆栈初始化策略

IF :DEF:__MICROLIB   ; 微库模式EXPORT  __initial_spEXPORT  __heap_baseEXPORT  __heap_limit
ELSE                ; 标准库模式__user_initial_stackheap:LDR     R0, =Heap_MemLDR     R1, =(Stack_Mem + Stack_Size)LDR     R2, = (Heap_Mem + Heap_Size)LDR     R3, = Stack_MemBX      LR
ENDIF

两种工作模式:

  • 微库模式:直接使用预定义符号(适用于资源受限场景)
  • 标准库模式:通过__user_initial_stackheap()初始化堆栈
  • 寄存器映射:
    • R0 = 堆起始地址
    • R1 = 栈顶地址
    • R2 = 堆结束地址
    • R3 = 栈底地址

6. 文件结构

AREA    |.text|, CODE, READONLY   ; 代码段
AREA    RESET, DATA, READONLY     ; 向量表段
AREA    STACK, NOINIT, READWRITE  ; 栈空间
AREA    HEAP, NOINIT, READWRITE   ; 堆空间

存储器划分:

  • .text:存放可执行代码(只读)
  • RESET:中断向量表(物理映射到0地址)
  • STACK/HEAP:未初始化(.bss)的可读写内存区

重要特点总结

  1. 符合ARM Cortex-M3架构:
  • 向量表格式严格遵循ARM标准
  • 硬件自动加载SP和PC初始值
  1. 灵活的扩展机制:
  • 弱符号定义允许用户覆盖任何中断处理
  • SystemInit()提供硬件抽象接口
  1. 双模式内存管理:
  • 支持标准库和微库两种初始化方式
  • 堆栈大小可通过EQU指令灵活配置
  1. 启动安全保障:
  • 未定义中断默认进入死循环(防止未知中断导致跑飞)
  • 严格的8字节对齐(Preserve8)保证兼容性

提示:实际工程中需关注:

  • 根据SRAM大小调整堆栈配置
  • 在system_stm32f1xx.c中实现SystemInit()
  • 在stm32f1xx_it.c中实现需要的中断服务程序
  • 使用微库时可减少代码体积(但失去部分标准库功能)
http://www.xdnf.cn/news/13914.html

相关文章:

  • 如何在python中实现简单的app自动化测试框架?
  • 梯度下降相关
  • Git 首次使用完整设置指南
  • 【专业数据库探索 03】图数据库实战:Neo4j构建智能推荐与关系网络分析系统
  • 动态规划3——背包类动态规划详解
  • 一个圆的周长是如何进行推演计算的?都有哪几种方式?为啥要计算圆的周长?-六年级上册(还需要再学习和思考)
  • Python开发功能项目
  • ‌CDGP|数据治理与AI人工智能:相互依存,互相赋能的新篇章
  • uni-app项目怎么实现多服务环境切换
  • 企业不同发展阶段平衡品牌建设和利润获取的策略-中小企实战运营和营销工作室博客
  • 方法 | B2B营销主题品牌化
  • [vela os_1] docs | Kconfig
  • ff数据解析和解码
  • 多模态AI爬虫:文本+图像智能抓取实战
  • 【cv学习笔记】YOLO系列笔记
  • FFmpeg是什么?
  • 怎么轻松实现报表跨库移植
  • 循环数组中相邻元素的最大差值
  • DEVICENET转MODBUS TCP网关连接ABB机器人配置案例
  • 【android bluetooth 框架分析 04】【bt-framework 层详解 5】【AbstractionLayer介绍】
  • JAVA:深入理解 wait() 和 sleep() 的区别与实战
  • 78Qt窗口_QStatusBar的基本使用
  • centos6.5 老旧系统编译glib-2.58.3.tar.bz2
  • mesh转solid freecad
  • OpenCV——图像基本操作(三)
  • 【开发常用命令】:docker常用命令
  • preload、preconnect、prefetch 的作用
  • day033-备份服务rsync
  • Pytorch中view函数详解和工程实战示例
  • docker compose的变量使用说明