对于熟悉电脑的伙伴们来说,BIOS(那个蓝色的界面)可能不会太陌生吧,这货就是电脑的启动代码。没有BIOS的电脑,那注定是一块板砖!BIOS主要是做一些开机前的准备工作,例如系统时间设定、启动顺序。。。扯远了
其实电脑本身就是从单片机而来,那么单片机也是有启动代码的,只是我们绝大部分情况 不去关心它。
启动代码究竟都干了些什么工作,为何需要它?想想你在c语言中用到了什么东西,而这些东西却是拿来就可以用的?堆、栈!没错,就是他们。我们知道堆和栈是内存中划分出的一块区域,那为什么我们没有亲自划分呢,因为启动代码帮了你的忙!!!再想想单片机工作的时候,有哪些配置被我们忽略了,而它却可以用?时钟,就是这货,我们可以不配置时钟,而你发现它竟然有默认值!还是启动代码帮了你
接下来仔细研究一下stm32的启动代码,首先要知道启动代码藏在哪里:一个叫做startup的汇编文件。启动代码是对硬件的一个最初级的配置,它必须用汇编语言来实现,汇编是真正的硬件编程语言。
从上到下解读启动代码
1、定义栈大小
2、定义堆大小
3、中断向量地址
ps:Cortex-M4内核要求内存的第一个地址是栈指针,第二个地址开始为中断向量。而中断向量的第一个必须是复位,因为代码是从上到下执行,开机首先遇到的就是复位
4、复位中断处理函数
ps1:仔细那看有两个东西需要注意:“SystemInit”这个是时钟初始,“__main”这一句代表跳转到“main”函数。正因为复位这样的写法,所以程序都是从main函数开始执行的
ps2:“SystemInit”具体实现过程在stm32fxxx.c,“__main”也是在某个地方与真正的main关联起来
5、其他中断处理函数
ps1:绝大部分中断的实现系统没有给出,等待程序猿去写。但是中断的名字我们都可以看到的,每一个名字都和上面向量表中对应着。我们知道函数名其实就是一个地址,而中断的入口地址是固定的,只要找对名字,那地址也就找对了。
ps2:中断的入口地址由内核和芯片决定,无法更改。因此不要改启动代码中的中断向量表
6、初始化堆、栈
ps:正因为堆和栈已经被初始化,所以你的C语言才可以顺利的执行
启动代码是非常关键的,所有的CPU都有启动代码。这里完成了最基本的初始化功能,尤其是中断向量表,程序猿每一个中断函数的名字都要与启动代码中的向量表对应,否则中断是无法进入的。
关键字:STM32 启动代码 存储器容量
引用地址:
带你一步步了解STM32启动代码
推荐阅读最新更新时间:2024-11-14 07:13
STM32内置CRC模块的使用
所有的STM32芯片都内置了一个硬件的CRC计算模块,可以很方便地应用到需要进行通信的程序中,这个CRC计算模块使用常见的、在以太网中使用的计算多项式: X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2 + X + 1 写成16进制就是:0x04C11DB7 使用这个内置CRC模块的方法非常简单,既首先复位CRC模块(设置CRC_CR=0x01),这个操作把CRC计算的余数初始化为 0xFFFFFFFF;然后把要计算的数据按每32位分割为一组数据字,并逐个地把这组数据字写入CRC_DR寄存器(既下图中的绿色框),写完所有的数据字后,就可
[单片机]
讲讲STM32单片机Flash的读保护和写保护
如果你还不了解什么是STM32对其Flash的保护,那么今天就来给你讲解一下什么是STM32的Flash保护! 01、什么是Flash? STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。 还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。 通常Flash包含几大块,这里以F40x为例: 主存储器:用来存放用户代码或数据。 系统存储器:用来存放出厂程序,一般是启动程序代码。 OTP 区域:一小段一次性可编程区域,供用户存放特定的数据。 选项字节:存放与芯片资源或属性相关的配置信息。 02、什么是STM32对内部Flas
[单片机]
STM32串口DMA容易忽视的问题
博主昨天晚上在STM32串口DMA的问题上纠结了好长时间,所以今天上午写篇博客来谈谈我对串口DMA发送的理解→_→今天主要讨论三个问题:1、什么叫串口DMA 请求;2、串口简要复习;3、串口DMA发送流程。 1、什么叫串口DMA 请求(博主用的是战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容: DMA全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道
[单片机]
STM32——PWM基本知识及配置过程
将通用定时器分为四个部分: 1,选择时钟 2,时基电路 3,输入捕获 4,输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 和上一讲相同,时基时钟来源于内部默认时钟 对此有疑问请参考 : 定时器中断实验 中 定时器时钟选择部分 和 定时器时钟来源部分 什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 PWM工作过程 每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 将寄存器
[单片机]
Keil开发STM32更换MCU造成的编译不通过的解决办法
1.更换MCU型号(在Keil从STM32F103ZET6换成STM32F107RCT6) 时出现的编译错误: 这个问题是因为对应处理器内部资源少于启动文件中提及的内部资源,启动文件中某一部分寄存器地址在STM32F107RCT6中没有,才会编译出错。 2.更换启动文件宏定义 由于STM32F103系列的不同型号MCU内部ROM和RAM不同,其地址区间也有些许差异所以需要选择与型号对应的启动文件,并配置对应的宏定义 故首先将startup中加入startup_stm32f10x_cl.s启动文件,然后在“C/C++”配置启动文件:把STM32F10X_HD换成STM32F10X_CL
[单片机]
stm32 复用时钟开启情况
首先为什么要开启时钟? 答:因为要对寄存器进行读写!而在STM32中对寄存器的读写都是要打开寄存器对应的时钟才可以的【就像人一样,有了跳动的脉搏手臂才能有能量才能进行各种动作】。 然后就什么时候AFIO时钟开启(所有时钟都是这样)就清楚了:当需要对“AFIO时钟管理的寄存器”进行读写时AFIO时钟打开!当然不对“AFIO时钟管理的寄存器”读写时也可以打开AFIO时钟,此时只是白白增加能耗、写无用代码(白白浪费程序存储器空间)而已! 接下来:跟AFIO相关的寄存器有哪些呢? 答:根据《STM32中文参考手册_V10》有:①事件控制寄存器(AFIO_EVCR)、②复用重映射和调试I/O 配置寄存器(AFIO_MAPR)、③外部中断配置
[单片机]
stm32——跑马灯实验(用库函数实现)
库函数介绍 1,初始化函数: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 作用:初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的有时候有设置BSRR或者BRR寄存器 例如: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5;//LED0-- PB.5 端口配置 GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT_PP;//
[单片机]
STM32学习笔记—SysTick定时器
简介:Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:为什么要设置SysTick定时器? (1)产生操作系统的时钟节拍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬
[单片机]