STM32启动过程分析

合集下载

东软stm32期末考试题及答案

东软stm32期末考试题及答案

东软stm32期末考试题及答案一、单项选择题(每题2分,共20分)1. STM32系列微控制器属于以下哪种类型的微控制器?A. 8位微控制器B. 16位微控制器C. 32位微控制器D. 64位微控制器答案:C2. STM32的内部时钟系统不包括以下哪一项?A. 内部高速时钟(HSI)B. 外部高速时钟(HSE)C. 外部低速时钟(LSE)D. 外部中速时钟(MSE)答案:D3. 在STM32中,以下哪个寄存器用于控制GPIO的模式?A. GPIOx_MODERB. GPIOx_OTYPERC. GPIOx_OSPEEDRD. GPIOx_PUPDR答案:A4. STM32的中断优先级配置中,抢占优先级和响应优先级的范围是多少?A. 0-15B. 0-31C. 0-255D. 0-1023答案:B5. STM32的以下哪个外设不是用来实现通信的?A. USARTB. SPIC. I2CD. ADC答案:D6. STM32中,以下哪个选项不是ADC的触发方式?A. 软件触发B. 硬件触发C. 外部中断触发D. DMA触发答案:D7. STM32的以下哪个寄存器用于配置定时器的计数模式?A. TIMx_CR1B. TIMx_CR2C. TIMx_SMCRD. TIMx_DIER答案:C8. STM32中,以下哪个选项不是DMA的通道?A. DMA1_Channel1B. DMA2_Channel2C. DMA1_Channel7D. DMA3_Channel4答案:D9. STM32的以下哪个寄存器用于配置RCC时钟?A. RCC_CRB. RCC_CFGRC. RCC_CIRD. RCC_PLLCFGR答案:B10. STM32中,以下哪个选项不是电源控制寄存器PWR的控制位?A. PVDEB. DBPC. FPDSD. VOS答案:A二、填空题(每题2分,共20分)1. STM32的内部高速时钟(HSI)的频率是_________ MHz。

解析STM32启动过程

解析STM32启动过程

解析STM32启动过程
STM32启动过程是指当电源被接通时,STM32芯片进行自检并加载固
件的过程。

这个过程可以分为四个主要阶段:复位阶段、时钟初始化阶段、中断向量表重定位阶段和主函数执行阶段。

时钟初始化阶段是STM32启动的第二个阶段。

在复位阶段,系统时钟
会被配置为默认的内部RC振荡器,通常为8MHz。

在时钟初始化阶段,可
以通过程序代码来配置系统时钟,包括选择和配置时钟源、设置时钟分频等。

时钟的初始化是系统正常运行的前提条件,因为大多数外设的工作频
率都与系统时钟相关。

主函数执行阶段是STM32启动的最后一个阶段。

在中断向量表重定位
完成后,主函数会被调用执行。

主函数中通常会初始化系统的各种外设,
配置时钟、GPIO、中断等,并进入一个无限循环等待外设事件的发生。


旦外设事件发生,会触发中断,处理对应的中断服务程序。

总结来说,STM32启动过程包括复位阶段、时钟初始化阶段、中断向
量表重定位阶段和主函数执行阶段。

复位阶段进行系统自检和硬件初始化,时钟初始化阶段配置系统时钟,中断向量表重定位阶段将中断向量表重定
位到实际的起始地址,主函数执行阶段初始化外设并进入循环等待外设事
件的发生。

这个过程是STM32系统启动的基本过程,对于系统的正常运行
起着关键作用。

第10章 STM32复位启动和中断控制1

第10章 STM32复位启动和中断控制1

在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常。

除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。

简单来说:异常包括外部中断和内核fault。

外部中断(IRQ):原本处于正常状态,突然有个外部因素干扰,然后马上处理干扰事项,解决好后又回到原来正常状态。

在中断产生后一般会去执行中断服务函数,实现特定任务。

无特殊说明,后面:异常就是中断,中断就是异常在编译时,每一个函数都有一个入口地址,该地址就是函数名。

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。

函数名相当于一个指向其函数入口指针常量。

函数名后面加圆括号,表示函数调用。

若要得到函数的地址,直接用函数名就可以了。

函数名就是一个地址,是存放该函数代码在存储器空间上的起始地址。

以一个子函数为例,编译器会分配一段内存空间用于存放改子函数代码内容,这段内存空间的起始地址是一个具体值,在程序里边就是函数名,当我们在程序其他位置调用该子函数时候,实际上就是让程序跳转到该函数名地址去运行子函数内容。

Cotrex-M4支持大量的中断,包括16‐5(保留功能)-1=10个系统异常,和最多240个外部中断。

当一个中断发生时候,并由CM4内核接受后,会执行对应的中断服务函数。

所以可以想象需要定义非常多的中断服务函数(而实际上并不需要很多,因为一般都只使能我们需要用到的中断)。

为方便CM4找到对应的中断函数入口,CM4使用了“向量表查表机制”这里使用一张向量表。

向量表其实是一个WORD(32位整数)数组,每个下标对应一种中断,该下标元素的值则是该中断服务函数的入口地址。

●#1~15(系统异常)在CortexM4中定义,IRQ#0~239(外部中断)中断由各个芯片商定义●向量表定义了中断的处理例程的入口地址。

缺省情况下,CM4认为向量表位于零地址处●响应中断时,CM4会根据中断号从表中找出对应的中断处理程序的入口地址●每个表项占用4字节●位置0x00000000处保存的是MSP的初始值异常类型表项地址偏移量异常向量00x00MSP的初始值10x04复位20x08NMI30x0C硬fault40x10MemManage fault50x14总线fault 60x18用法fault7‐100x1c‐0x28保留110x2c SVC120x30调试监视器130x34保留140x38PendSV 150x3c SysTick 160x40IRQ #0170x44IRQ #1中断向量表的跳转●支持10个Cortex-M4系统异常和82个可屏蔽外部中断●16个可编程优先级(使用了4位中断优先级)●包括内核异常在内的所有中断均通过NVIC进行管理。

stm32启动文件详解及SystemInit函数分析

stm32启动文件详解及SystemInit函数分析
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
;__main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数,来到C的世界。
Stack_Size EQU 0x00000400 ;//定义堆栈大小
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0
;链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。
PRESERVE8 ;//指示编译器8字节对齐
Байду номын сангаас THUMB ;//指示编译器以后的指令为THUMB指令
;中断向量表定义
; Vector Table Mapped to Address 0 at Reset
;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称
;STM32被设置为从内部FLASH启动时(这也是最常见的一种情况),当STM32遇到复位信号后,

解析STM32的启动过程

解析STM32的启动过程

解析STM32的启动过程STM32的启动过程可以分为硬件启动过程和软件启动过程两部分。

硬件启动过程主要是指芯片上电后的初始化阶段,而软件启动过程则是指固定在芯片内的启动程序的执行过程。

硬件启动过程1.上电复位:当STM32芯片上电后,会进行一次复位操作,将片内的所有寄存器初始化为默认值。

2.时钟初始化:芯片复位后,需要初始化芯片的各个时钟源和时钟分频系数。

例如,配置系统时钟、外设时钟和外设时钟的分频。

3.外设初始化:初始化芯片的各个外设,包括GPIO、USART、SPI、I2C等。

外设初始化主要是配置相应的寄存器使它们能够正常工作。

4.中断向量表:中断向量表是储存在芯片中的一系列函数指针,用于响应中断事件。

在硬件启动过程中,需要将中断向量表的地址设定为固定的位置,并将其中各个中断的函数指针初始化为默认的中断服务函数。

5.系统堆栈初始化:系统堆栈是用于存储函数调用时的临时变量和程序返回地址的存储区域。

在硬件启动过程中,需要初始化系统堆栈指针,为后续的函数调用和中断处理做准备。

6. 程序复位:在芯片复位后,可以选择从外部存储器(如Flash)中加载启动程序,或从内部存储器(如内置Bootloader)中加载启动程序。

启动程序一般是一个二进制文件,其中包含了一系列的初始化指令和应用程序的入口点。

软件启动过程1.初始化函数:启动程序首先执行初始化函数,用于初始化C库、变量和硬件资源等。

例如,初始化堆栈指针、启动C库和启用FPU等。

2.系统时钟初始化:启动程序需要初始化系统时钟,以使系统能够正常工作。

这包括设置主时钟源、配置主时钟分频系数和外设时钟分频系数等。

3.初始化其他硬件资源:启动程序会初始化其他的硬件资源,例如外设、存储器、中断控制器等。

4.跳转到主函数入口点:启动程序最后一步是跳转到主函数的入口点,开始执行用户代码。

总结STM32的启动过程可以分为硬件启动过程和软件启动过程。

硬件启动过程包括上电复位、时钟初始化、外设初始化、中断向量表配置和系统堆栈初始化等操作。

STM32 boot0 boot1的启动方式

STM32 boot0 boot1的启动方式

STM32 三种启动模式对应的存储介质是芯片内置的,它们分别是:1.用户闪存 =芯片内置的Flash2.SRAM=芯片内置的RAM区,就是内存了。

3.系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段bootloader,就是同时的ISP升级程序,这个区域的内容在芯片出现后没有人能够修改或拆除,即它是一个ROM。

在每个STM32 的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时电平状态决定了芯片复位后从哪个区域开始执行程序:BOOT1=X ,BOOT0=0 :从用户闪存(flash)启动,这是正常模式,较多情况下使用这种模式。

BOOT1=1, BOOT0=1 :从内置SRAM(内存)启动,这种模式可以用于调试。

BOOT1=0 ,BOOT0=1 :从系统存储器启动,这种可以用于调试。

使用注意:(1)一般情况下如果我们想用用串口下载代码,则必须配置BOOT0为 1, BOOT1为 0,而如果想让 STM32 一按复位键就开始跑代码,则需要配置 BOOT0为0,BOOT1随便设。

(2)一般不使用内置SRAM启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。

多数情况下SRAM只是在调试时使用,也可以做其他一些用途。

如做故障的局部诊断,写一段小程序加载到SRAM中诊断板上的其他电路,或用此方法读写板上的Flash或EEPROM等。

还可以通过这种方法解除内部Flash的读写保护,当然解除读写保护的同时Flash的内容也被自动清除,以防止恶意的软件拷贝。

STM32引脚状态决定了用哪种方式启动。

Main Flash memory (flash启动) :是STM32内置的flash,一般我们使用JTAG或者SWD模式下载时,就是下载到这里面,启动后也直接从这启动程序。

System memory 从系统存储启动:这种模式启动的程序功能是有厂家设,一般很少使用,一般来说STM32在出厂是内置了一段bootloader,也就是我们常说的ISP程序,这是一块ROM,出厂后我发修改,这种启动模式,是为了从串口下载程序,因为厂家提供BootLoader中,可以通过bootloader将程序下载到系统Flash中。

STM32之启动文件详解

STM32之启动文件详解

STM32 之启动文件详解在嵌入式应用程序开发过程里,由于使用C 语言编程,基本很少涉及到机器底层寄存器的执行过程,一般都会直接在main 函数里开始写代码,似乎main 成为了理所当然的起点,尽管从C 程序的角度来看程序都是直接从main 函数开始执行。

然而,MCU 上电后,是如何寻找到并执行main 函数这一问题却很自然的被忽略了!事实上微控制器是无法从硬件上去定位main 函数的入口地址,因为使用C 语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,因此main 函数的入口地址在编译后便不一定是一个绝对地址。

MCU 上电后又是如何寻找到这个入口地址呢?以前接触无论是PIC、AVR、MSP430 或是51 过程中都没涉及到启动文件的配置,仅仅只有熔丝位或配置字是需要根据实际使用配置来设置,其实并非没有,而是由于大部分的开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main 函数开始进行应用程序的设计即可。

然而,但接触到嵌入内核比如Linux 系统移植过程bootloader 却是很重要也是必不可少的一个环节。

事实上,每一种微控制器,无论性能高下,结构简繁,价格贵贱都是必须有启动文件才能正常工作的,它的作用同bootloader 类似。

启动文件完成了微控制器从复位到开始执行main 函数中间这段时间的必要启动配置。

在STM32 中,如果是在MDK 下创建一个工程,一般都有提示是否加入Star up Code 文件,这个就是启动文件,这里有个误区,一般对于初学者来看,很容易误以为STM32F10x.s 这个启动文件是STM32 所有类型芯片的通用启动文件,因此也自然不会去理会它的作用,事实上,这个启动文件只是。

STM32启动代码分析、简化、实战

STM32启动代码分析、简化、实战

本文通过对STM32的官方固件库STM32F10x_StdPeriph_Lib_V3.5.0里的MDK启动文件分析,简化部分不需要的代码,并从繁杂的固件库里,精炼出一个类似于“hello world”的入门实战小程序——点亮一个LED。

该工程仅仅包含一个启动文件和一个有main函数的C文件。

本文初衷:不用固件库建立自己的工程!实验软件:Keil uVision4实验硬件:神舟IV号开发板芯片型号:STM32F107VCSTM32启动代码分析、简化、实战汇编基础:1.伪指令:EQU语法格式:名称EQU表达式{,类型}EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言的#define。

其中EQU可以用“*”代替。

名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有一下三种类型:CODE16、CODE32和DA TA2.伪指令:AREA语法格式:AREA段名{,属性1}{,属性2}……AREA命令指示汇编程序汇编一个新的代码段或数据段。

段是独立的、指定的、不可见的代码或数据块,它们由链接程序处理。

段名:可以为段选择任何段名。

但是,以一个数字开始的名称必须包含在竖杠号内,否则会产生一个缺失段名错误。

例如,|1_DataArea|。

有些名称是习惯性的名称。

例如:|.text|用于表示由C编译程序产生的代码段,或用于以某种方式与C库关联的代码段。

属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。

常用的属性如下:——CODE属性:用于定义代码段,默认为READONLY。

——DA TA属性:用于定义数据段,默认为READWRITE。

——READONLY属性:指定本段为只读,代码段默认为READONLY。

——READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。

——ALIGN属性:使用方式为ALIGN表达式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32启动
ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的。

而STM32则不同,M3内核规定起始地址必须存放栈顶地址,第二个地址必须是复位中断向量的入口地址,这样CPU复位后会自动从下一个32位地址取出复位中断向量的入口地址,PC就跳转到中断服务程序,所以M3是固定了中断向量表的位置而地址是可变的。

M3的中断向量表有三个位置,通过BOOT引脚进行启动设置。

BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。

中断向量表定位于FLASH区,复位后PC=0x80000000.
OOT1=0 BOOT0=1 从系统存储器启动(相当于厂家在存储器中固化了BOOTLOADER),这种模式启动的程序功能由厂家设置。

BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。

这种模式下,中断向量表位于SRAM区,起始地址为0x20000000.复位为PC=0x20000000.
startup_stm32f10x_XX.s
这个文件里面首先定义了复位中断(复位入口矢量被硬件固定在地址
0x0000_0004)的处理函数:Reset_Handler,它的作用就是将保存于flash中的初始化数据复制到sram中,调用上面说到的SystemInit来初始化时钟,接着跳转到main执行。

接着定义了Default_Handler,这个是作为其他所有中断的默认处理函数,作用就是死循环,所以你假如开启了某个中断,请按照这里面的中断函数名给它写中断处理函数,例如串口中断处理函数名是USART1_IRQHandler,你开了串口中断,如果不重写USART1_IRQHandler,就默认执行Default_Handler,死循环了。

而如果你有重写,那么中断向量表中的处理函数的地址就会更新为你自己写的那个函数的地址了。

为什么会这样呢?因为此文件的末尾用了类似这样的语句:.weak USART1_IRQHandler
.thumb_set USART1_IRQHandler,Default_Handler
它给中断处理函数提供了弱(weak)别名(Default_Handler),如果不重写,中断了默认执行Default_Handler,如果重写了,因为是弱别名,所以会被你写的同名函数覆盖。

在中断向量表中第一个存放的是复位中断向量,STM32MDK环境中
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
首先用跳转指令是程序跳转到SystemInit,在"startup_stm32f10x_xx.s"文件中被调用,功能是设置系统时钟(包括时钟源,PLL系数,AHB/APBx的预分频系数还有flash的设定),这个函数会在系统复位之后首先被执行。

文件中默认的一些设置:允许HSE(外部时钟),FLASH(允许预取缓冲区,设置2个等待周期),PLL系数为9,开启PLL并选择PLL输出作为时钟源(SYSCLK),后续设置SYSCLK = HCLK = APB2 = 72MHz,APB1 = HCLK/2 = 36MHz,HCLK即AHB的时钟。

相关文档
最新文档