STM32再学习――启动流程分析

发布者:大橙子5511最新更新时间:2022-05-11 来源: eefocus关键字:STM32  启动流程  C语言 手机看文章 扫描二维码
随时随地手机看文章

  我们写嵌入式程序,基本上采用C语言来编写,以main( )作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一个专门的启动程序来完成,由于需要做的工作内容不多,并且需要更直接的管理内存,一般采用汇编编写。


  无论是STM32、ARM系列的单片机,还是简单的如51,PIC等,都以为上述原因,需要启动程序,只不过51,PIC等单片机的启动程序已经在相应的IDE编译、链接的时候隐含的编译了,故在写单片机程序的时候无需考虑。而STM32的启动有相应的启动文件,本文将采用KEIL MDK自带的启动文件STM32F10x.s进行分析。


  1 启动模式的选择

  STM32芯片自带的启动方式有3种如下表

启动模式选择引脚

启动模式

说明

BOOT1

BOOT0

X

0

闪存存储器

主闪存存储器作为启动区域

0

1

系统存储器

系统存储器作为启动区域

1

1

内置SRAM

内置SRAM作为启动葡萄

  STM32的启动选择,通过设置BOOT1、BOOT0的引脚的高低电平即可选择。其中主闪存启动是将程序下载到内置的Flash进行启动(该flash可运行程序),该程序可以掉电保存,下次开机可自动启动;系统存储器启动是将程序写入到一快特定的区域,一般由厂家直接写入,不能被随意更改或擦除。内置SRAM启动,由于SRAM掉电丢失,不能保存程序,一般只用于程序的调试。


  就程序的启动而言,采用以上3种方式启动,但对于一个嵌入式系统的程序来说,如果程序执行文件很大,而STM32内置的存储空间有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存储在flash中,程序执行在SDRAM中,既节约了成本有提高了运行效率。如果采用外置的Flash+SDRAM的方式,就需要一个更加复杂的启动文件(bootloader),需要考虑flash的COPY,Flash的驱动,内存的管理,通信机制等,本文暂不涉及此内容,以后有机会专门讲述。


  2 启动文件STM32F10x.s分析

  关于STM32F10x.s的启动文件,主要做了3个工作:分配和初始化堆、栈;定义复位向量并初始化;中断向量表及其相应的异常处理程序。


  2.1 定义堆、栈及其初始化

  堆和栈是能够运行C语言的前提,如以下程序:

  定义栈:

  Stack_Size EQU 0x00000200

  AREA STACK, NOINIT, READWRITE, ALIGN=3

  Stack_Mem SPACE Stack_Size

  __initial_sp

  定义堆:

  Heap_Size EQU 0x00000000

  AREA HEAP, NOINIT, READWRITE, ALIGN=3

  __heap_base

  Heap_Mem SPACE Heap_Size

  __heap_limit

  初始化堆、栈:

  _user_initial_stackheap

  LDR R0, = Heap_Mem

  LDR R1, =(Stack_Mem + Stack_Size)

  LDR R2, = (Heap_Mem + Heap_Size)

  LDR R3, = Stack_Mem

  BX LR


  2.2 定义复位向量

  Boot引脚的设置不同,复位时,起始地址的位置不同,SRAM的起始地址为0x2000000, flash的起始地址为0x8000000。Cortex-M3内核规定,起始地址必须存放堆定指针,而第二个地址必须存放复位中断入口向量。在系统复位时,内核会自动从其实地址的下一个地址(即32位)空间取出复位中断入口向量,然后跳转到复位中断服务程序,该服务程序就会跳转到main()执行程序。


  中断向量表(部分向量):

  __Vectors

  DCD __initial_sp ; Top of Stack // 初始化堆跳转

  DCD Reset_Handler ; Reset Handler // 复位中断向量跳转

  DCD NMI_Handler ; NMI Handler

  DCD HardFault_Handler ; Hard Fault Handler

  DCD MemManage_Handler ; MPU Fault Handler

  DCD BusFault_Handler ; Bus Fault Handler

  DCD UsageFault_Handler ; Usage Fault Handler

  DCD 0 ; Reserved

  DCD 0 ; Reserved

  DCD 0 ; Reserved

  DCD 0 ; Reserved

  DCD SVC_Handler ; SVCall Handler

  DCD DebugMon_Handler ; Debug Monitor Handler

  DCD 0 ; Reserved

  DCD PendSV_Handler ; PendSV Handler

  DCD SysTick_Handler ; SysTick Handler

  复位中断服务程序

  ; Reset Handler // 该程序会跳转到main()

  Reset_Handler PROC

  EXPORT Reset_Handler [WEAK]

  IMPORT __main

  LDR R0, =__main

  BX R0

  ENDP


  3 其他中断向量及服务子程序

  在启动文件中,只定义了中断向量,其相应的服务子程序跳转到空操作。为以后扩展中断服务程序做了准备。


  在以上这些都胜利跑完之后,我们的微处理器(MCU)就开始main函数之旅……


关键字:STM32  启动流程  C语言 引用地址:STM32再学习――启动流程分析

上一篇:嵌入式学习②——STM32入门初步之LED闪烁
下一篇:关于STM32能否使用malloc申请动态内存的问题

推荐阅读最新更新时间:2024-11-13 00:04

STM32学习笔记之EXTI(外部中断)
一:EXTI(外部中断)说明 =========================================分割线========================================= 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置 输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独 立的屏蔽。挂起寄存器保持着状态线的中断要求。 =========================================分割线========================================= 19个中断如下:
[单片机]
<font color='red'>STM32</font>学习笔记之EXTI(外部中断)
STM32处理器定时器分析(实现一个定时中断)
前言: 1.本博文基于STM32F103ZET6芯片和ST官方提供的3.5.0库函数; 2.学习过51单片机学习STM32定时器会容易理解一些,但是两个定时器的实力有很大的距离; 3.定时器是难点也是重点;本博文以通用定时器TIM2~TIM5来说明;例程是TIM3 6.定时器结构稍复杂,寄存器较多,本博文根据一个简单的定时器中断实验展开,所列出的相关寄存器是专门针对本次实验来说的,其他不相关定时器不再列出; 一 STM32定时器的分类 1.高级定时器: TIM1和TIM8 2.通用定时器: TIM2,3,4,5; 3.基本定时器: TIM6和TIM7; 二 通用定时器的功能 (1)16位向上,向下,向上/向下自动装载寄存器
[单片机]
<font color='red'>STM32</font>处理器定时器分析(实现一个定时中断)
嵌入式-stm32学习:按键检测
bsp_key.h #ifndef __KEY_H #define __KEY_H #include stm32f4xx.h //引脚定义 /*******************************************************/ #define KEY1_PIN GPIO_Pin_0 //GPIO引脚号 #define KEY1_GPIO_PORT GPIOA //GPIO端口A #define KEY1_GPIO_CLK RCC_AHB1Periph_GPIOA //GPIO端口时钟 #define KEY2_
[单片机]
STM32IO及定时器映射到地址
意义: 有时候我们在操作多个STM32 IO 时,硬件设计未必有规律,比如输出引脚是:PB3,PC4,PC5,PD0,但是操作这些引脚具有共性,或者说我们想用 for(it i = 0; i 4; i++) 像操作数组一样操作这些引脚,程序将变得非常简洁,这时候把 IO 映射到地址就可以实现该目的。 方法: 1.//位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考《CM3权威指南》第五章(87~92页),M4同M3类似,只是寄存器地址变了 //IO口操作宏定义 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFF
[单片机]
stm32固件库文件描述
固件函数库文件描述 其中新版本的V3.5stm32f10x_map.h变成了stm32f10x.h 固件函数库文件描述 Table 2. 固件函数库文件描述(其中的ppp表示外设) 文件名 描述 stm32f10x_conf.h 参数设置文件,起到应用和库之间界面的作用。用户必须在运行自己的程序前修改该文件。 用户可以利用模板使能或者失能外设。也可以修改外部晶振的参数。 也可以是用该文件在编译前使能Debug或者release模式。///使能外设的 h头文件 main.c 主函数体示例。 stm32f10x_it.h 头文件,包含所有中断处理函数原形。 stm32f10x_it.c 外设中断函数文件。用户可以加入自己的中断程序
[单片机]
<font color='red'>stm32</font>固件库文件描述
stm32delay函数怎么写
STM32的延时函数可以使用SysTick定时器来实现。SysTick定时器是一个24位的计数器,它可以在每个时钟周期自动减少计数值,直到计数值为0时触发中断。我们可以利用SysTick定时器的特性来实现精确的延时函数。 以下是一个实现延时函数的示例代码: #include stm32xxxx.h void SysTick_Handler(void) { // 在这里可以写一些需要周期执行的操作,但是要尽量保持简洁 } void delay_us(uint32_t us) { uint32_t ticks = us * (SystemCoreClock / 1000000); // 将微秒转换为滴答数 Sys
[单片机]
STM32学习—定时器中断TIME
定时器中断TIME 通用定时器配置步骤(TIME2-TIME5) (1)使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟 (2)初始化定时器参数,包含自动重装值,分频系数,计数方式等 voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); typedef struct { uint16_t TIM_Prescaler; //定时器预分频器 1-65535 uint16_t TIM_CounterMo
[单片机]
X-CUBE-STL:支持更多STM32, 揭开功能安全的神秘面纱
X-CUBE-STL 目前支持 STM32MP1、STM32U5、STM32L5、STM32H5和 STM32WL。实际上,这个最大的通用微控制器产品家族还在不断扩大,将会有更多的产品支持SIL2和SIL3系统。客户的开发团队可以在ST最新的产品上开发满足 IEC 61508、ISO 13849 和 IEC 61800 等要求 的应用。此外,在ST网站的功能安全网页上,开发者很容易找到各种资源,轻松快速通过工业或家电安全认证。网页上还列出了ST 授权合作伙伴以及他们提供的实时操作系统、开发工具、工程服务和培训课程,确保客户团队能够完成从概念验证到商品的市场转化。 o观看ST的功能安全网络研讨会 国际电工委员会对安全的定
[单片机]
X-CUBE-STL:支持更多<font color='red'>STM32</font>, 揭开功能安全的神秘面纱
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved