该文件主要实现目的:
设置初始SP
设置初始PC=Reset_Handler
设置向量表入口地址,并初始化向量表
调用SystemInit,把系统时钟配制成72M,SystemInit在库文件system_stm32f10.c定义调转到标号_main,最终来到C程序文件
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
第一行是程序注释,在汇编里面注释用的是“;”。
第二行是定义了一个子程序:Reset_Handler。
PROC 是子程序定义伪指令。一般用法为:
1 子程序名PROC NEAR ( 或FAR )
2 ……
3 ret
4子程序名ENDP
其中NEAR 和FAR 是属性词。 NEAR属性(段内近调用):
调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用。
FAR属性(段间远调用):调用程序和子程序不在同一代码段中,可以被相同或不同代码段的程序调用。
第三行EXPORT 表示Reset_Handler 这个子程序可供其他模块调用。
关键字[WEAK]
表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接。
第四行和第五行IMPORT 说明SystemInit 和__main 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。
SystemInit在库文件system_stm32f10x.c 实现,用来初始化STM32的一系列时钟,把系统时钟设置为72MHZ。STM32的时钟比51 单片机复杂,需要经过一系列的配置才能达到稳定运行的状态。
__main 其实不是我们定义的,当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统境,并在最后跳转到用户自定义的main函数,从此来到C的世界。
第六行把SystemInit 的地址加载到寄存器R0。
第七行程序跳转到R0 中的地址执行程序,之后系统的时钟就被设置成72MHZ。
第八行把_main 的地址加载到寄存器R0。
第九行程序跳转到R0 中的地址执行程序,执行完毕之后就去到我们熟知的C 世界。
第十行表示子程序的结束。
关键字:STM32 启动文件 Reset_Handler函数
引用地址:
STM32启动文件(Reset_Handler函数)
推荐阅读最新更新时间:2024-03-16 16:22
STM32学习日志——PWM输出实验
今天学习的是通用定时器的比较输出功能,也就是PWM;从它的工作过程图中很容易看出,就是计数器与比较值CCRx作比较,可以产生对应的IO口逻辑。而具体的对应关系需要对相应的寄存器进行配置。1)首先是选择工作模式,即对CCMR1的OC1M 配置,模式1是计数器小于比较值为有效电平,模式2是计数器大于比较值为有效电平。2)其次配置输出极性,0为高电平有效,1为低电平有效。3)使能比较输出。 在频率确定的情况下(上一节课有提到,通过预分频系数来设定),PWM的周期是由ARR自动重装载确定,占空比是由CCRx确定,通过对这两个参数的修改,就可以得到我们想要的脉冲波。 根据下面的步骤就可以输出PWM,因为使用的是PB5端口,所以需要开启T
[单片机]
如何选择支持GUI的STM32
作为嵌入式系统核心的MCU,以往由于性能受限,难于支持GUI所需的图形显示的要求。而现在这已经成为了历史,一大波图形显示MCU已经来了! ★ 硬件功能配置 ★ 从2011年推出高性能STM32F4产品以来,ST不断在图形显示MCU上投入研发资源,先后推出了STM32F7、STM32H7、STM32L4+等产品系列,目前STM32具有图形显示接口(LCD-TFT接口或MIPI-DSI接口)的子产品线已有6条之多。大家可以从图1中看到STM32图形显示产品的全貌。 图1,STM32图形产品一览 为了支持HMI/GUI中的图形处理的需要,STM32图形显示MCU产品中包含一些列特殊功能: √ Chrom-ART加速器:用于提升2
[单片机]
STM32中断优先级详解
一、STM32中断优先级属性 STM32有两种优先级属性,分别为抢占式优先级和响应式优先级。其中,响应式优先级也称为副优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 二、STM32中断优先级数目分组 STM32为了适应不同的优先级组合
[单片机]
STM8S/32的读保护
一、代码写入及加读保护的步骤: 1.准备工作:HEX文件和JLINK驱动(JLinkARM_V420以上,4.08中secure chip可能出现灰色不可选) 安装完毕后,可以在开始--所有程序--SEGGER--J-Flash ARM打开该应用程序 先设置要写入的芯片和写入方式, 选择JATG还是SWD 选择芯片型号:Option-- Project settings-- CPU-- Device(型号不对程序写入不了,设置Option-- Project settings-- Production,选中Securechip;) 2.打开要烧写的HEX文件:File--Open data file ,可以下拉选择HEX文件类型 3
[单片机]
【STM32电机FOC】记录17——霍尔定时器的边沿触发
120度位置放置的霍尔传感器: 120度触发改成60度触发的思路 原先触发时是将霍尔传感器的三个信号异或成一个信号,在此信号的下降沿进行触发,接着进入相应的中断即霍尔传感器的测量状态 5、3、6,恰好每次触发为120度的电气周期。 在弄清楚过程后,试将触发方式改为双边沿触发。那意味着,进入中断子程序后,应该运行相应的霍尔传感器的测量的完整的6个状态即 5、1、3、2、6、4。于是应当将 1、2、4 三个状态的电气位置角的计算程序添加进中断程序中去。 6个运行状态的电气位置角: 状态5:offset angle +0° 状态1:offset angle +60° 状态3:offset angle +120° 状态2:
[单片机]
解决烧录问题:Jlink的三线制SWD方式连接STM32芯片无法识别
网上找到此文章解决了j-flash只能连接后不能烧录的问题,希望遇到相同问题的小伙伴,可以用同样的办法解决: 前段时间,做了一块板子,调试接口只留了三个口SWD、SWCLK、GND,在使用Jlink的SWD方式调试的时候发现无法连接。使用ST-link的时候可以连接,无奈楼主的ST-link的链接方式相当的不可靠,时而能识别时而不能识别:当然我的ST-link是山寨版的。 那么问题来了:为什么通过20针全部连接的方式可以调试,而三针的方式就不行了呢? 古人云知之为知之,不知Google之,Google不让用,那就问度娘好了。 通过查阅网上资料发现,jlink的20针,不光有调试的功能还有供电和检测电压的功能。 下面是jl
[单片机]
STM32单片机的5个时钟源解析
一、时钟系统框图讲解 1. STM32的5个时钟源 a。高速内部时钟 HSI,大约为8MHz b。高速外部时钟 HSE,晶振取值范围在4M--16M,一般采用8M晶振 c。低速外部时钟 LSE,32.768k晶振,可以作为RTC的时钟源 d。低速内部时钟 LSI,大约为40KHz e。PLL锁相环时钟 2. 系统时钟 系统时钟SYSCLK的3个来源 a。HSI b。HSE c。PLL 3. RTC的时钟来源 a。LSE b。LSI c。LSE的128分频 4. 独立看门狗IWDGCLK的时钟来源 LSI 5.USB的时钟USBCLK的来源 最大频率为48MHz PLL经过预分频器产生1或1.5分频 6. 内部时钟输出MCO,为
[单片机]
STM32单片机TIM3蜂鸣器播放音乐
下面这段代码有个小bug,软件仿真PORTB.5 beep 波形正常,如下图所示 但下到我的开发板上,beep没有声音,若看到此程序,有兴趣的朋友可以帮忙验证一下,欢迎一起探讨! #include stm32f10x_lib.h // STM32F10x Library Definitions #include STM32_Init.h // STM32 Initialization #include stm32f10x_type.h #define uchar unsigned char bool beep; uchar k; long reload_time=0,time=0;
[单片机]