历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2020年03月24日 | STM32的启动过程分析

2020-03-24 来源:eefocus

对于stm32的启动过程一直心存疑惑。今天找了很多资料,进行了一个大致的分析。


1.cortex M3的复位过程(来自官方资料)

上述开机启动流程比较详细,内容较为全面,但部分步骤可以省略(红字可省略标出),因为对于某些初始化,我们可能会在main函数中重新配置。


2.复位程序的详细跟踪分析(重点)

此次分析基于单步跟踪stm32从复位到main()函数的汇编代码。


1.stm32复位程序

; Reset handler

Reset_Handler    PROC

                 EXPORT  Reset_Handler             [WEAK]

     IMPORT  __main

     IMPORT  SystemInit

                 LDR     R0, =SystemInit

                 BLX     R0

                 LDR     R0, =__main

                 BX      R0

                 ENDP

这个程序的可以大致分解为以下两个函数的调用

SystemInit();

__main();


2.SystemInit()

功能:初始化时钟(SYSCLK, HCLK, PCLK2 and PCLK1 prescalers)、配置中断向量表(中断向量表的定位是在flash还是SRAM)。

void SystemInit (void)

{

  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */

  /* Set HSION bit */

  RCC->CR |= (uint32_t)0x00000001;


  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */

#ifndef STM32F10X_CL

  RCC->CFGR &= (uint32_t)0xF8FF0000;

#else

  RCC->CFGR &= (uint32_t)0xF0FF0000;

#endif /* STM32F10X_CL */   

  

  /* Reset HSEON, CSSON and PLLON bits */

  RCC->CR &= (uint32_t)0xFEF6FFFF;


  /* Reset HSEBYP bit */

  RCC->CR &= (uint32_t)0xFFFBFFFF;


  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */

  RCC->CFGR &= (uint32_t)0xFF80FFFF;


#ifdef STM32F10X_CL

  /* Reset PLL2ON and PLL3ON bits */

  RCC->CR &= (uint32_t)0xEBFFFFFF;


  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x00FF0000;


  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;


  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;      

#else

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;

#endif /* STM32F10X_CL */

    

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

  #ifdef DATA_IN_ExtSRAM

    SystemInit_ExtMemCtl(); 

  #endif /* DATA_IN_ExtSRAM */

#endif 


  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */

  /* Configure the Flash Latency cycles and enable prefetch buffer */

  SetSysClock();


#ifdef VECT_TAB_SRAM

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */

#else

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

#endif 

}


3.__main();重点

该函数属于C/C++库函数。

该函数的作用是

1.完成全局/静态变量的初始化工作

2.初始化堆栈

3.库函数的初始化

4.程序的跳转,进入main()函数。


1.加载_main()函数的相应汇编代码

2._main()函数的汇编代码

功能:跳转进入__scatterload_rt2函数。


3.__scatterload_rt2函数汇编代码(C库函数)

该函数的作用是设置四个寄存器为后续__scatterload_cpy()函数服务的。

设置待copy内容(静态变量、全局变量、常量)的的加载域和运行域,设置待copy内容的大小,跳转进入__scatterload_cpy函数


4.__scatterload_cpy函数(C库函数)

完成静态变量、全局变量、常量的从flash到SRAM的加载以及程序的跳转进入__scatterload_zeroinit函数


5.__scatterload_zeroinit函数(C库函数)

功能:未初始化的全局变量的初始化,跳转进入__user_steup_stackheap函数


6.__user_steup_stackheap函数(C库函数)

功能:实现用户的堆栈的配置

__user_steup_stackheap函数包含了以下函数的调用:

a.__user_libspace------------------------__user_libspace为C库保持了静态数据。这是一个96字节,0初始化的数据块,该块由C库创建。在C库初始化期间可以用来当做临时栈。

b.__user_initial_stackheap-------------------------------------------------用户的初始化堆栈函数

7._fp_init和__rt_fp_status_addr(C库函数)------------------------------------------------------两个函数调用实现浮点运算的支持

调用结束跳转进入main()函数


8.main()函数

推荐阅读

史海拾趣

国盛科技(BOCHEN)公司的发展小趣事

国盛科技在发展过程中获得了多项认证与荣誉。例如,公司获得了知识产权管理体系认证证书,荣登《人民代表报》全国两会特刊,成为“中国质量万里行促进会”会员并获得“收录企业”荣誉称号等。这些认证与荣誉的获得,充分证明了国盛科技在电子行业的领先地位和企业实力的不断提升。

Cellergy公司的发展小趣事

在电子行业的快速发展中,Cellergy公司以一项创新技术打破了行业内的常规。该公司成功研发出了一种新型电容器,其性能远超市场上同类产品。这一技术突破不仅为Cellergy公司赢得了大量订单,还使其在电子行业中的地位得到了显著提升。随着技术的不断完善和市场的不断拓展,Cellergy公司逐渐成为了电容器领域的佼佼者。

ATP [ATP Electronics]公司的发展小趣事

ATP Electronics自创立之初,便以技术创新为核心竞争力。公司特有的SIP(Systems-In-Package:系统级封装)技术,在闪存卡制造领域引起了革命性的变革。通过SIP技术,ATP成功研发出超大容量的闪存卡,不仅满足了市场对于高性能存储的需求,也确立了公司在闪存卡市场的领先地位。这一技术的突破,为ATP带来了大量的订单和市场份额,奠定了公司持续发展的基础。

Elpaq公司的发展小趣事
EREM公司的发展小趣事

EREM公司起源于1960年代的瑞士日内瓦,由一群热衷于精密工具制造的工程师创立。在当时,电子行业正逐渐兴起,对高精度工具的需求日益增长。EREM的创始人看到了这一市场机遇,决定专注于生产高精度镊子和钳子,以满足电子行业的需求。他们凭借精湛的工艺和不懈的努力,逐渐在行业内建立了良好的声誉。

General Instrument Corp公司的发展小趣事
验证输入信号是否在变换器的允许范围内,避免超出其最大或最小输入电压。

问答坊 | AI 解惑

怎样做才能快速的嵌入式了?

怎样做才能快速的嵌入式了? 其实,做工程是没有捷径可走的.听听下面一个大牛写的! 先说做硬件: 把你的数字电路教材和模拟电路的教材读熟,暂时先把重点放在数字电路上面,接着把微机原理和接口技术读熟悉了,最好能用汇编写几个简单的程序上机 ...…

查看全部问答>

安防工程师心得,看后感触颇多~~

诸位,咱进入安防行业也是几年了,不算有出息,环顾四周,也没有看见几个有出息的 !回顾这几年的行业生涯,感慨万千,愿意讲几句掏心窝子的话,也算给咱们弟兄们提个醒  ,希望他们比咱强!       1:好好规划自 ...…

查看全部问答>

请教gprs modem拨号成功ppp协商获得ip地址并确认后怎么还无法上网?

gprs modem拨号成功,并且ppp协商获得ip地址而且也确认了,但是我在电脑上ping 10.0.0.172还是不通,是不是还要设置什么?电脑还有正常宽带连接中…

查看全部问答>

请教对于常用元件的选型经验

对于一些常用的电阻,电容,二级管,三极管,选型的时候有什么需要注意的地方呢?…

查看全部问答>

希望学习ARM开发,不知道从哪里开始学习

想学习ARM方面的。现在想学。目前自身的水平是会c,c++,VC都没有问题。汇编懂一点。arm系统以前用过nucleus,也是别人把系统搭好后我添加一些程序。现在自己想设计个板子,包括画板子,写驱动。 请问我该怎么学习?谢谢…

查看全部问答>

请教,如何对协议的性能进行测试?

例如像如下协议: TCP SSL FTP 还有无线通信协议。 谢谢,请各位大侠帮忙。…

查看全部问答>

关于LED灯具颜色差异评价

在LED灯具中普遍使用的颜色有红绿蓝白黄,从人眼的视觉敏感度来讲,人对黄、绿色的颜色敏感,也就是说这两种颜色稍微有点波动,人眼就能感觉到。衡量颜色的单位是nm(纳米),为了避免颜色波长不同来来的差异,灯具生产公司不得不对LED原材料进行控 ...…

查看全部问答>

请以下参与团购TI工业用样片的ID补充完整信息,逾期将做退货处理!

参与团购TI工业用样片套装的朋友请注意:               1、以下ID未填写个人相关信息,截止至18日中午12:00仍未提供详细信息将以退货处理。https://www.eeworld.com.cn/ee ...…

查看全部问答>

电子面试题

replyreload += \',\' + 1238951;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>