32单片机软件程序启动流程

32单片机(以HC32F460为例,简称460)的软件程序主要在main函数中进行编辑,但是在上电后且还未进入main函数前,芯片还有一系列的操作,理解这段过程有助于功能开发和问题排查。

  1. 通过boot引脚选择启动模式
    460的boot引脚为PB11,引脚接高电平为从 Flash 启动,低电平为从 BOOT 启动。
    一般设计好的460电路板都会将boot引脚拉高,从而在flash中加载程序。460在flash中读取程序的起始地址为0(逻辑地址直接对应物理地址),而STM32的起始地址一般在0x08000000(逻辑地址0对应0x08000000)。
    以下(2)-(4)步其实就是startup_hc32f460.s中做的事。
  2. 程序先定义好栈区和堆区的默认大小。
  3. 从地址0x00000000读取 __initial_sp 初始栈顶值到MSP(Main Stack Pointer)
    因为程序烧入flash之后,是通过二进制数存放的,而存放在最开始地址上的就是初始栈顶指针,所以程序会读取这个指针,赋给MSP。
  4. 从地址0x00000004读取 Reset_Handler 地址到PC
    紧接在后面的是中断向量表,排在第一个的是复位中断处理函数Reset_Handler,PC指针会指向这里,运行这个中断处理函数,默认的Reset_Handler函数会导入SystemInit 和__main两个函数。
    以下步骤可以参考下图。
  5. 运行SystemInit 函数
    函数功能主要是一些寄存器配置的工作,例如配置初始化FPU,外部SRAM,中断向量表(根据用户设置的地址)等。
  6. 运行__main函数
    __main是 ARM 编译器内置的库函数,而非用户编写的代码,因此在工程源码中看不到。功能为:初始化RW段、ZI段,即全局变量和静态变量;对堆栈区等区域的初始化;调用用户主函数main
  7. 运行main函数
相关推荐
国科安芯22 分钟前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试
czhaii37 分钟前
单片机最佳入门多线程示例讲解
c语言·单片机
BackCatK Chen10 小时前
第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)
stm32·单片机·嵌入式硬件·保姆级教程·电机正反转·tmc2240·dir引脚控制
星马梦缘11 小时前
EDA彩灯电路绘制
单片机·嵌入式硬件·物联网·pcb·eda·嘉立创
Forsete13 小时前
LINUX驱动开发#9——定时器
linux·驱动开发·单片机
Hello_Embed16 小时前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
来自晴朗的明天18 小时前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技18 小时前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii19 小时前
STC AI8052U单片机特点
单片机
MAR-Sky19 小时前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件