笑傲之华山论剑刚开始我一直认为STM32程序开始执行是从main函数开始。后来网上查查不是。原来在执行main函数之前,需要先执行一段汇编程序和完成C语言资源硬件的初始化工作。就是以下几个功能:
1-在启动的时候,先对堆栈的大小定义,并在代码区的起始位置建立异常中断向量表。然后在复位中断中服务程序中跳转执行C标准库main函数,以上这些完成后,跳转到主程序中的main函数执行相关函数应用。但是假如STM32F429单片机被设置成从内部flash启动的,这时候,片内Flash被映射到程序启动空间,异常/中断向量表实际的开始地址为0x8000000(查看STM32F4参考手册可得到),则栈顶地址存放在0x8000000处,复位中断存放在0x8000004处,若STM32F4遇到复位信号,则从0x8000004处取出复位中断服务入口地址,继而执行中断服务函数,绕后跳转到main函数,最终进入main函数。由此我们可以得下面这个图:
栈的主要作用是用于局部变量、函数调用、函数形参的开销大小应小于内部RAM大小,考虑到局部变量的需求,防止栈溢出。
SPACE:用于分配一定大小的内存空间,单位为字节;这里的大小等于Stack_Size。
伪指令(Pseudo instruction):用于告诉汇编器如何进行汇编的指令,不生成可执行代码。
这些代码中,堆的大小设为0x00000200(512B),其中Heap_ Mem是栈名,不初始化,可读可写,8(23)字节对齐。Heap_Size为堆的大小, heap_base为堆的起始地址,heap_limit为堆的结束地址,因为堆是由低地址向高地址生长的。
EXPORT:声明一个标号具有全局属性,可被外部的文件使用。如果是 IAR 编译器,则使用的是 GLOBAL 这个指令。
——Vectors是异常/中断向量表的起始位置,_Vectors_End是中断向量表的结束位置,vectors__Size中断向量表的大小。
在中断向量表中的每一个位置存储都是一个4字节服务程序入口地址,如果有中断请求并且MCU进行了请求的响应,那么MCU就会找到向量表中找到对应的中断位置,找到中断复位程序入口地址到程序计数寄存器,进而执行中断。
复位中断服务程序是系统上电后第一个执行的程序,调用Systemlnit函数初始化系统时钟,然后调用C库函数mian,最终调用 main 函数进入C程序的世界。
BL:跳转到由寄存器/标号给出的地址,并把跳转前的下条指令地址保存到链接寄存器。
BLX:跳转到由寄存器给出的地址,并根据寄存器的LSE确定处理器的状态,还要把跳转前的下条指令地址保存到链接寄存器。
WEAK:表示弱定义,如果外部文件优先定义了该标号,则首先引用该标号,可以在C语言中重新定义中断服务程序;如果在启动文件之外没有重新定义中断服务程序,则在对应的异常/中断向量表位置处存储的是汇编文件定义的中断服务程序入口地址。如果在启动文件外,在另外一个C文件中重新定义了中断服务程序,则在对应的异常/中断向量表位置处存储的是C文件中的中断服务程序入口地址。需要注意的是,启动文件中的中断服务程序的名称和C文件中重新定义的中断服务程序名称必须保持一致。
IMPORT:表示该标号来自外部文件,跟C语言中的关键字EXTERN类似。这里表示Systemlnit 和main 这两个函数均来自外部的文件。
Systemlnit是一个标准的库函数,在system_stm32f4xx.c这个库文件中定义,主要作用是配置系统时钟,在调用这个函数之后,STM32F429的系统时钟被配置为180MHz。
main是一个标准的C库函数,主要作用是初始化用户堆栈,最终调用main函数进入C程序的世界。在C应用程序中,必须有一个main函数。需要注意的是,_main不是用户C程序的main 函数。
判断是否定义了__MICROLIB,如果定义了则赋予标号__initial_sp(栈顶地址)、__heap_base(堆起始地址)、__heap_limit(堆结束地址)全局属性,可供外部文件调用。如果没有定义(实际的情况就是我们没定义__MICROLIB),则使用默认的C库函数,然后初始化用户堆栈大小,这部分由C库函数__main来完成,当初始化完堆栈之后,就调用main函数去到C程序的世界。
IF、ELSE、ENDIF:汇编的条件分支语句,跟C语言的if、else类似。
关键字:编辑:什么鱼 引用地址:STM32启动文件简介、详细步骤及代码讲解
proteus仿线上显示,可测量正负温度。程序及仿真工程已上传附件,利用proteus仿线时返回值均为零,新手上路,请多指教。使用proteus8.8版本进行仿真。 原理图 时序 原理图 单片机部分程序如下: #include stm32f10x.h #include bsp-lcd1602.h #include delay.h #include sys.h #include ds18b20.h #include stdio.h #include math.h short tem,tem1; u8 a,b,c,t
实现--DS18B20和LCD1602显示 /
#include stm32f10x.h #include key.h //按键初始化函数 void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12GPIO_Pin_13GPIO_Pin_14GPIO_Pin_15GPIO_Pin_4GPIO_Pin_5GPIO_Pin_6GPIO_Pin_7GPIO_Pin_8; GPIO_InitStructure.GPIO_S
最近做的一个项目遇到一个很莫名的错误,程序运行到某一部分时便会卡死,分析后,感觉在逻辑上并无错误,但是就是会卡死,而且不是偶然。 后来在网上查找资料怀疑是内存溢出,然后调试发现是两个函数中的的局部变量申请的内存空间太大,所以错误应该是栈溢出了。将这两个变量使用malloc申请堆段空间完美解决。 下面是对STM32的堆栈(Heap&Stack)小结: 内存分配空间 内核保护区 栈段 堆段 数据区 代码区 代码区 :静态区 常量(const) 函数代码逻辑 数据区:静态区 全局变量 局部变量+static 堆段:动态区,管理者是程序员 malloc申请的空间 栈段:动态区,管理每个子函数的空间,管理
的堆栈(Heap&Stack)空间 /
======================================================= C数据类型 1. C语言的程序优化与 编译器 和硬件系统都有关系,设置某些编译器选项是最直接最简单的优化方式。在默认的情况下,armcc是全部优化功能有效的,而GNU编译器的默认状态下优化都是关闭的。ARM C编译器中定义的char类型是8位无符号的,有别于一般流行的编译器默认的char是8位有符号的。所以循环中用char变量和条件 i ≥ 0时,就会出现死循环。为此,可以用fsigned - char(for gcc)或者-zc(for armcc)把char改成signed。 其他的变量类型如下: char
1. 前言 随着移动通信技术的发展,移动互联网日益普及,传统互联网已经在向移动互联网迁移,智能穿戴设备近年来发展的非常迅速,成为一个热点行业,它通过借助传感器,与人体进行信息交互,是一种在新理念下诞生的智能设备,具有广泛的应用领域,并能够根据用户需求不断升级。智能穿戴设备在提高人们生活品质、促进生活方式智能化方面将会起到很重要的作用。 按照主要功能的不同,智能穿戴设备产品可以划分为以下几类:运动健康类、体感交互类、信息资讯类、医疗健康类和综合功能类等,每类设备针对不同的细分市场和消费人群。运动和医疗健康类的设备有运动、体侧腕带及智能手环,主要消费人群为大众消费者;体感控制和综合功能类的设备有智能眼镜等,消费人群以年轻人为主;信
设计的蓝牙健康管理设备 /
推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般指两个三极管分别受腹部的信号的控制,总是在一个三极管导通时,另一个截止。 输出0时,N-MOS导通,P-MOS高阻,输出0。 输出1时,N-MOS高阻,P-MOS导通,输出1(不需要外部上拉电路) 开漏模式:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合做电流驱动,器吸收电流的能力相对较强 输出0时,N-MOS导通,P-MOS不激活,输出0。 输出1时,N-MOS高阻,P-MOS不激活,输出1,(需要外部上拉电路) 另外,在输出模式下,通常要设置输出速度,这个速度指的是I/O口驱动电路的响应速度,而不是输出信号的速度,输出信号的输出速度取决
时钟系统中的SysTick、FCLK、SYSCLK、PCLK和HCLK
时钟信号好比是单片机的脉搏,了解STM32时钟系统是必要的,下图是STM32F1xx用户手册中的时钟系统结构图。 在STM32F1xx中,有五个时钟源,分别为HSI、HSE、LSI、LSE、PLL。 HSI是高速内部时钟,RC振荡器,频率为8MHz HSE是高速外部时钟,可接石英/陶瓷谐振器或者接外部时钟源,频率范围为4MHz~16MHz LSI是低速内部时钟,RC振荡器,频率为40kHz LSE是低速外部时钟,接频率为32.768kHz的石英晶振 PLL为锁相环倍频输出,其输出频率最大不得超过72MHz SYSCLK 系统时钟SYSCLK最大频率为72MHz,它是供STM32中绝大部分部件工作的时钟源。系统时钟可由PLL
1 背景 最近有接触到通过可控硅的方式来控制交流风机或者电烙铁功率,STM32的定时器输出比较模式,刚好可以满足这种需求,借此机会总结一下定时器的几种输出模式。 2 STM32的定时器比较输出 STM32的定时器比较输出一共有8种,记录一下初始化方法和逻辑分析仪的波形。 在官网搜索对应的型号找到用户手册,比如STM32F103ZET6 找到比较模式相关配置的描述 TIMx capture/compare mode register 1 (TIMx_CCMR1) Address offset: 0x18 Reset value: 0x0000 The channels can be used in input (capture
定时器的几种输出模式 /
XMC4800RelaxEtherCATKit测评申请通道明天关闭,想要申请的抓紧了!测评申请明天最后一天
【设计工具】Xilinx Virtex6 ML605开发板原理图PCB
XilinxVirtex6ML605开发板原理图PCB推荐!! 原理图:ml605_schematics.pdf48页PCB(Allegro格式):ML605_brd_091909.brd16层板 【设计工具】XilinxVirtex6ML605开发板原理图PCB
参加RT-Thread软件包赛,赢取RoboMaster等丰厚奖品!RT-Thread是一款主要由中国开源社区主导开发的开源实时操作系统。实时线程操作系统不仅仅是一个单一的实时操作系统内核,它也是一个完整的应用系统,包含了实时、嵌入式系统相关的各个组件:TCP/IP协议栈,文件系统,libc接口,图形用户界面等。为让更多的人来了解RT-Thread,学习和使用RT-Thread!RT-Thread官方联合EEWorld举行了本次的活动,希望大家都来学习使用R
移动通信在世界的巨大成功,推动了各种宽带无线技术的发展,世界无线技术正在步入宽带天地。目前,3G技术已可实现成熟商用,WiMAX成为新的热点,其他近距宽带无线G技术基本成熟正向高带宽和IP化前进作为移动网络的宽带技术,3G将成为下一步无线运营商发展的主要方向。目前,3G技术已基本成熟,在全球进入规模建设期,增强型技术不断发展,网络层的IP化融合进程已经开始。1.目前WCDMA和cdma2000相关技术已经比较成熟。TD-SC
想搞嵌入式开发 要求CPU的AD要12位以上.最好是16位. 看到用的比较多的ARM9,S3C2410,S3c2440的AD都是10位的 有谁知道有AD12位以上的CPU吗? 介绍一个,,在哪能买到? 谢谢了哦.嵌入式CPU的问题
通信频段的变化主要是由频率规划的需要和无线电波传播的特点所决定的。随着各种通信技术的发展,可用的频谱资源变得越来越紧张,因此必须不断开发新的频段以满足通信需求。无线电波的传播特性会随频率的变化而变化。在低频段,电波传播的距离较短,损耗较大,但是由于可用频谱较宽,因此具有较高的信道容量。而在高频段,电波传播的距离较远,损耗较小,但是可用频谱较窄,因此信道容量较低。此外,频率越高,传播过程中的衰减也越大。这是由于无线电波在传播过程中会遇到大气分子、尘埃、水蒸气等微小粒子的阻挡,这些粒子会吸
有奖直播报名|使用低成本 MSPM0 MCU 快速开发——生态详解系列之二
有奖直播报名|Keysight World Tech Day 2023分论坛——汽车自动驾驶与新能源
【下载】LAT1289 Keil、IAR、CubeIDE中变量不被初始化方法
【下载】LAT1288 STM32 G474中Triggered-half模式的实现
【下载】LAT1309 一步一步创建STM32WBA BLE_Custom工程
【课程】STM32 & X-Cube-TouchGFX GUI开发实践
【直播】STM32H5系列:强大的ARM® CORTEX®-M33 MCU让高性能和安全性唾手可得
【直播】STM32U5系列扩充新成员-探索更安全,更高效,更节能的设计
【新品】STM32H5-Arm® Cortex®-M33 内核,主频高达250MHz,提升性能与信息安全性
【新品】STM32MP13X-支持Linux、RTOS和Bare Metal应用,新一代通用工业级MPU
【新品】Arm® Cortex®-M33处理器内核,运行频率160 MHz,基于Armv8-M架构并带有TrustZone®
STM32Cube.AI开发者云:只需四个步骤,轻松将AI集成到MCU
前言ST已经推出了三种库函数,以方便客户快速开发STM32系列MCU。从最早的标准外设驱动库,到后来的Cube HAL,再到Cube LL以及直接操作寄 ...
在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:1)对于100 ...
STM32是意法半导体(ST)推出的32位RISC(精简指令集计算机)微控制器系列产品,采用高性能的ARMCortex-M3内核,工作频率为72MHz,内置高 ...
在使用STM32的CAN控制器进行数据收发,当用到位屏蔽模式的时候,就要设置过滤器了,这个关系到是否能够接收到想要的数据。下面针对几种不同 ...
总的来讲,单片机调试是单片机开发工作必不可少的环节。不管你愿不愿意,调试过程中总会有各种不期而遇的问题出现在我们面前来磨砺我们。这 ...
2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍
直播回放: Microchip Timberwolf™ 音频处理器在线研讨会
综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程
|