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函数
相关推荐
周洲08307 小时前
STM32 ADC 采集实战|电压采集、分压计算、数据滤波
stm32·单片机·嵌入式硬件
SKH.8 小时前
单片机(2)
单片机
DaTou大头8 小时前
STM32第三篇
单片机·嵌入式·电路基础
H_oRIZoN_9 小时前
Linux入门DAY40(51 单片机入门:GPIO、中断、定时器、PWM、蜂鸣器完整梳理)
单片机·嵌入式硬件
LCG元10 小时前
STM32F103 复位来源诊断实战:RCC_CSR 标志位判优、BKP 复位计数持久化与六种复位源注入实测
stm32·单片机·嵌入式硬件
国产HT1621B12 小时前
显示省不了电,休眠才见真章:1621 低功耗实操
驱动开发·单片机·嵌入式硬件·led驱动·lcd驱动
国科安芯12 小时前
低轨卫星姿轨控系统中高可靠嵌入式控制单元的设计与验证
单片机·mcu·低轨卫星·星间链路·卫星姿轨控
老当益壮梁奶奶14 小时前
ARM 汇编学习笔记(二)启动代码、指令、函数调用与 C 混合编程
c语言·arm开发·单片机·嵌入式硬件·51单片机
天空'之城15 小时前
单片机基础核心知识点汇总(三十八)
单片机·嵌入式硬件
崇山峻岭之间16 小时前
HC32F460PETB的PH2的EVENTOUT
单片机