STM32F102启动脚本分析
- 格式:doc
- 大小:51.50 KB
- 文档页数:5
**这里是STM32比较重要的头文件我愛你的吻123原創講解 QQ:1746430162****************************************************************************** * @file stm32f10x.h ST 标准的头文件* @author MCD Application Team 微控制器开发小组。
* @version V3.5.0 版本* @date 11-March-2011 2011年3月11* @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File.(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。
* This file contains all the peripheral register's definitions, bits* definitions and memory mapping for STM32F10x Connectivity line,* High density, High density value line, Medium density,* Medium density Value line, Low density, Low density Value line* and XL-density devices.* 这个文件包含了芯片STM32F10X(接口增强型)内部的寄存器定义,位定义,内存地址变换定义,还有一些相应的高密度,低密度产品线的设备。
* The file is the unique include file that the application programmer* is using in the C source code, usually in main.c. This file contains:* - Configuration section that allows to select:* - The device used in the target application* - To use or not the peripherals drivers in application code(i.e.* code will be based on direct access to peripherals registers* rather than drivers API), this option is controlled by* "#define USE_STDPERIPH_DRIVER"* - To change few application-specific parameters such as the HSE* crystal frequency* - Data structures and the address mapping for all peripherals* - Peripheral's registers declarations and bits definition* - Macros to access peripheral registers hardware*这个文件在应用程序中是至关重要的头文件,它是用C代码编写而成。
STM32F102启动脚本分析STM32F102启动脚本分析stm3210e_flash.ld文件中重要的变量/* Entry Point */ENTRY(Reset_Handler) /*指定可执行文件的起始代码段为Reset_Handler *//* Highest address of the user mode stack */_estack = 0x20010000; /* end of 64K RAM *//* Generate a link error if heap and stack don't fit into RAM */_Min_Heap_Size = 64; /* required amount of heap */_Min_Stack_Size = 256; /* required amount of stack *//* Specify the memory areas */MEMORY{FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512KRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64KMEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K}/* Define output sections */SECTIONS{/* The startup code goes first into FLASH */.isr_vector :{. = ALIGN(4); /*以4字节对齐*/KEEP(*(.isr_vector)) /* Startup code */ /*所有isr_vector的section都链接到此地址*/ . = ALIGN(4);} >FLASH/* The program code and other data goes into FLASH */.text :{. = ALIGN(4);*(.text) /* .text sections (code) */*(.text*) /* .text* sections (code) */*(.rodata) /* .rodata sections (constants, strings, etc.) */*(.rodata*) /* .rodata* sections (constants, strings, etc.) */*(.glue_7) /* glue arm to thumb code */*(.glue_7t) /* glue thumb to arm code */KEEP (*(.init))KEEP (*(.fini)). = ALIGN(4);_etext = .; /* define a global symbols at end of code */} >FLASH.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH.ARM : {__exidx_start = .;*(.ARM.exidx*)__exidx_end = .;} >FLASH.ARM.attributes : { *(.ARM.attributes) } > FLASH.preinit_array :{PROVIDE_HIDDEN (__preinit_array_start = .);KEEP (*(.preinit_array*))PROVIDE_HIDDEN (__preinit_array_end = .);} >FLASH.init_array :PROVIDE_HIDDEN (__init_array_start = .);KEEP (*(SORT(.init_array.*)))KEEP (*(.init_array*))PROVIDE_HIDDEN (__init_array_end = .);} >FLASH.fini_array :{PROVIDE_HIDDEN (__fini_array_start = .);KEEP (*(.fini_array*))KEEP (*(SORT(.fini_array.*)))PROVIDE_HIDDEN (__fini_array_end = .);} >FLASH/* used by the startup to initialize data */_sidata = .;/* Initialized data sections goes into RAM, load LMA copy after code */.data : AT ( _sidata ) /*.data段,指定.data数据段的存储地址为当前的RAM地址*/ {. = ALIGN(4);_sdata = .; /* create a global symbol at data start */ /*data数据段的起始地址*/ *(.data) /* .data sections */ /*所有data数据段都链接到此地址*/*(.data*) /* .data* sections */. = ALIGN(4);_edata = .; /* define a global symbol at data end */ /*data数据段的结束地址*/ } >RAM/* Uninitialized data section */. = ALIGN(4);.bss : /*BSS栈段*//* This is used by the startup in order to initialize the .bss secion */_sbss = .; /* define a global symbol at bss start */ /*BSS栈的起始地址*/__bss_start__ = _sbss;*(.bss) /*所有bss栈段都链接到这里*/*(.bss*)*(COMMON). = ALIGN(4);_ebss = .; /* define a global symbol at bss end */ /*BSS栈的结束地址*/__bss_end__ = _ebss;} >RAMPROVIDE ( end = _ebss );PROVIDE ( _end = _ebss );/* User_heap_stack section, used to check that there is enough RAM left */._user_heap_stack : /*检查是否有建立堆段的足够空间*/. = ALIGN(4);. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(4);} >RAM/* MEMORY_bank1 section, code must be located here explicitly *//* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */.memory_b1_text :{*(.mb1text) /* .mb1text sections (code) */*(.mb1text*) /* .mb1text* sections (code) */*(.mb1rodata) /* read-only data (constants) */*(.mb1rodata*)} >MEMORY_B1/* Remove information from the standard libraries *//DISCARD/ :{libc.a ( * )libm.a ( * )libgcc.a ( * )}}startup_stm32f10x_hd.S程序内容:1、初始化SP;2、初始化PC为Reset_Handler;3、设置向量表,用异常ISR地址进入;4、设置系统时钟,和外部SRAM,SRAM mount在EV AL开发板,并用于数据存储(用户可选);5、跳转到C库中的main函数。
STM32启动⽂件:startup_stm32f10x_hd.s等启动⽂件的简单描述在官⽅的库⽂件中,分别有如下⽂件:startup│││├─arm││││ startup_stm32f10x_cl.s││││ startup_stm32f10x_hd.s││││ startup_stm32f10x_hd_vl.s││││ startup_stm32f10x_ld.s││││ startup_stm32f10x_ld_vl.s││││ startup_stm32f10x_md.s││││ startup_stm32f10x_md_vl.s││││ startup_stm32f10x_xl.sR8T6使⽤的MD.s,中容量的arm芯⽚,⼤致的启动内容如下:初始化堆栈指针 SP初始化程序计数器指针 PC设置堆、栈的⼤⼩设置中断向量表的⼊⼝地址配置外部 SRAM 作为数据存储器调⽤ SystemInit() 函数配置 STM32 的系统时钟设置 C 库的分⽀⼊⼝ "__main” (最终⽤来调⽤ main 函数)startup_stm32f10x_hd.s 是⼀个启动⽂件,⾥⾯是使⽤汇编语⾔写好的基本程序,当STM32 芯⽚上电启动的时候,受限会执⾏这⾥的汇编程序,从⽽建⽴起来C 语⾔的运⾏环境,所以我们把这个⽂件称为启动⽂件。
改⽂件使⽤的汇编指令是 Cortex-M3 内核⽀持的指令,可以参考《Cortex-M3 权威指南中⽂》内指令集章节。
startup_stm32f10x_hd.s ⽂件是由ST官⽅提供的,该⽂件可以从KEIL5 安装⽬录中找到,也可以从STV3.5库⾥⾯找到,找到该⽂件后吧启动⽂件添加到⼯程⾥⾯即可。
不同型号的芯⽚以及不同编译环境使⽤的汇编⽂件是不⼀样的,但功能相同。
在keilMDK4中只有STM32F10x.s⽂件。
在<<STM32不完全⼿册⾥⾯>>,所有的例程都采⽤了⼀个叫STM32F10x.s的启动⽂件,⾥⾯定义了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启动文件的选择及宏定义及芯片型号更改 IAP总结startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xxstartup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xxstartup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_md_vl.s 中容量的STM32F100xxstartup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xxcl:互联型产品,stm32f105/107系列vl:超值型产品,stm32f100系列xl:超高密度产品,stm32f101/103系列ld:低密度产品,FLASH小于64Kmd:中等密度产品,FLASH=64 or 128hd:高密度产品,FLASH大于128在KEIL下可以在项目的选项C/C++/PREPROMCESSOR symbols的Define栏里定义,比如STM32F10X_CL也可以在STM32F10X.H里用宏定义#if !defined (STM32F10X_LD && !defined (STM32F10X_LD_VL && !defined (STM32F10X_MD && !defined (STM32F10X_MD_VL && !defined(STM32F10X_HD && !defined (STM32F10X_XL && !defined (STM32F10X_CL#define STM32F10X_HD#endif如果芯片更换,除了做如上所述的更改外,还需以下几步:第一步 system_stm32f10x.c的系统主频率,依实际情况修改#if defined (STM32F10X_LD_VL || (defined STM32F10X_MD_VL#define SYSCLK_FREQ_24MHz 24000000#else#define SYSCLK_FREQ_72MHz 72000000#endif另外外部时钟在文件:stm32f10x.h 依实际修改第二步定时器的参数依系统主时钟做适当修改第三步 flash地址misc.h中的NVIC_VectTab_Flash 0x08000000 要与KEIL选项target的IROM1的地址一致,如果是IAP程序,依ISP程序占用大小,APP的FLASH地址向后延,比如0X8002000,那么KEIL选项target的IROM1的地址也要就0x8002000,SIZE因为ISP占用了2000,所以就为0x40000-0x2000,即只能填写0X3E000第四步 ISP程序与APP程序连接----(这一步我还不明白意思,需要验证)打开 User 选项卡在 Run User Programs Before Build/Rebuild 中,勾选 Run#1,并在其中填入D:\Keil\ARM\BIN40\fromelf.exe --bin -o ./obj/Project.bin ./obj/Project.axf 其中,Project.bin 和 Project.axf 要和 Output 选项卡中的 Name of Executable 的名字IAP我的总结1 先FLASH_Unlock(;2 小于或等于128K的STM每页为1k bytes,大于128K的每页为2K BYTES,减去从地址0x8002000占用的0x2000后,算出页数,比如IAP占用8K,则64K的MD的STM32F系列用for(i=0;i<(64-8;i++ FLASH_ErasePage(0x8002000+0x400*i;循环按页擦除FLASH3 按从外部串口获取到的数据,FLASH_ProgramWord(address,dat;//注意是按4字节方式写入的 if (*(uint32_t*address!= dat//字编程后校验。
STM32固件库详解1.1 基于标准外设库的软件开发1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本,开发环境中自带的标准外设库为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构。
可以从ST的官方网站下载到各种版本的标准外设库,首先看一下3.4版本标准外设库的文件结构,如图5-3所示。
3.0以上版本的文件结构大致相同,每个版本可能略有调整。
标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,CMSIS 是独立于供应商的Cortex-M 处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M 上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。
STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。
Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。
STM32 的三种不同启动模式STM32 三种启动模式对应的存储介质均是芯片内置的,它们是:1. 用户闪存:芯片内置的Flash。
2. SRAM:芯片内置的RAM 区,就是内存啦。
3. 系统存储器:芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP 程序。
这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM 区。
在每个STM32 的芯片上都有两个管脚BOOT0 和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。
BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。
BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。
要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。
多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。
如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的其他电路,或用此方法读写板上的Flash 或EEPROM 等。
还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清除,以防止恶意的软件拷贝。
STM32 PB2(BOOT1)使用注意由于STM32 PB2 脚是复用引脚,而且该复用功能是用于启动选择,使用时就要小心了。
-------------------------------------------------------------------------BOOT1 BOOT0 启动模式说明X 0 用户闪存存储器用户闪存存储器被选为启动区域0 1 系统存储器系统存储器被选为启动区域(进入ISP 模式)1 1 内嵌SRAM 内嵌SRAM 被选为启动区域-------------------------------- -----------------------------------------一般来讲我们正常使用是模式1(用户闪存存储。
本文通过对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表达式。
一文了解STM32启动过程1 概述说明每一款(芯片)的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。
通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。
(STM32)作为一款高端Cortex-M3系列(单片机),有必要了解它的启动文件。
打好基础,为以后优化程序,写出高质量的代码最准备。
本文以一个实际测试代码--START_(TE)ST为例进行阐述。
整体过程STM32整个启动过程是指从上电开始,一直到运行到main 函数之间的这段过程,步骤为(以使用微库为例):①上电后(硬件)设置SP、PC②设置系统(时钟)③软件设置SP④加载.data、.bss,并初始化栈区⑤跳转到C文件的main函数代码启动过程涉及的文件不仅包含startup_stm32f10x_hd.s,还涉及到了MDK自带的连接库文件entry.o、entry2.o、entry5.o、entry7.o 等(从生成的map文件可以看出来)。
2 程序在Flash上的存储结构在真正讲解启动过程之前,先要讲解程序下载到Flash上的结构和程序运行时(执行到main函数)时的S(RAM)数据结构。
程序在用户Flash上的结构如下图所示。
下图是通过阅读hex文件和在MDK下调试综合提炼出来的。
上图中:MSP初始值由编译器生成,是主堆栈的初始值。
初始化数据段是.data未初始化数据段是.bss.data和.bss是在__main里进行初始化的,对于(ARM)Com (pi)ler,__main主要执行以下函数:其中__scatterlo(ad)会对.data和.bss进行初始化。
加载数据段和初始化栈的参数加载数据段和初始化栈的参数分别有4个,这里只讲解加载数据段的参数,至于初始化栈的参数类似。
0x0800033c Flash上的数据段(初始化数据段和未初始化数据段)起始地址0x20000000加载到SRAM上的目的地址0x0000000c数据段的总大小0x080002f4调用函数_scatterload_copy需要说明的是初始化栈的函数-- 0x08000304与加载数据段的函数不一样,为_scatterload_zeroinit,它的目的就是将栈空间清零。
Stm32标准库中启动文件与芯片型号的关系我们在使用不同的stm32芯片时,往往会困惑与如何选择启动文件,今天我们就来介绍一下。
以下英文材料从stm32标准库文件的<stm32f10x.h>中引用:- Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.低密度型:适用于stm32f101/102/103系列中flash范围在16-32kbyte的芯片对应的启动文件名称为:startup_stm32f10x_ld.s- Low-density value line devices are STM32F100xx microcontrollers where the Flashmemory density ranges between 16 and 32 Kbytes.低密度超值型:适用于stm32f100系列中flash在16k到32kbytes大小的芯片对应的启动文件名称为:startup_stm32f10x_ld_vl.s- Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes.中等密度型:适用于stm32f101/102/103系列中flash在64k——128kbytes的芯片对应的启动文件名称为:startup_stm32f10x_md.s- Medium-density value line devices are STM32F100xx microcontrollers where theFlash memory density ranges between 64 and 128 Kbytes.中等密度超值型:适用于stm32f100系列中flash范围是64k-128kbytes的芯片对应的启动文件名称为:startup_stm32f10x_md_vl.s- High-density devices are STM32F101xx and STM32F103xx microcontrollers wherethe Flash memory density ranges between 256 and 512 Kbytes.高密度型:适用于stm32f101/103系列中flash介于256k-512kbytes的芯片对应的启动文件名称为:startup_stm32f10x_hd.s- High-density value line devices are STM32F100xx microcontrollers where theFlash memory density ranges between 256 and 512 Kbytes.高密度超值型:适用于stm32f100系列中flash介于256k—512kbytes的芯片对应的启动文件名称为:startup_stm32f10x_ld_vl.s- XL-density devices are STM32F101xx and STM32F103xx microcontrollers wherethe Flash memory density ranges between 512 and 1024 Kbytes.超高密度型:适用于stm32f101/103系列中flash介于512-1024kbytes的芯片对应的启动文件名称为:startup_stm32f10x_xl.s- Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. 互联网型:适用于stm32f105/107系列芯片对应的启动文件名称为:startup_stm32f10x_cl.s。
stm32 reboot指令在过去几年里,STM32微控制器在我国的嵌入式领域得到了广泛的应用。
作为一种高性能、低成本的解决方案,STM32为开发者提供了丰富的功能和便捷的开发环境。
其中,STM32重启指令是一项重要的功能,本文将对这项指令进行详细的介绍。
一、STM32重启指令的介绍STM32重启指令,即通过向特定寄存器写入特定值,使微控制器进入重启状态。
这种指令通常用于系统故障恢复、系统升级等情况。
通过对重启指令的正确使用,可以有效降低系统因故障而导致的损坏风险,提高设备的可靠性和稳定性。
二、STM32重启指令的使用方法在使用STM32重启指令时,需要按照以下步骤操作:1.确定重启寄存器:根据设备的具体型号和配置,找到相应的重启寄存器。
常见的重启寄存器有:RCC_CR、RCC_APB2RSTR、RCC_APB1RSTR 等。
2.配置重启触发条件:根据实际需求,配置重启触发条件,例如:上电重启、复位键触发重启等。
3.编写重启程序:在程序中实现向重启寄存器写入特定值的操作,以触发重启。
4.测试与调试:对编写好的程序进行测试和调试,确保重启功能正常工作。
三、STM32重启指令的实用性分析1.故障恢复:当系统发生故障时,可通过重启指令迅速恢复到正常状态,降低故障对设备运行的影响。
2.系统升级:在需要对系统进行升级时,可通过重启指令将设备恢复到出厂设置,从而方便地进行升级操作。
3.省电模式:部分STM32设备支持低功耗模式,通过重启指令可以实现设备的快速唤醒,提高系统续航能力。
四、STM32重启指令的注意事项1.确保重启寄存器的写入值正确,否则可能导致设备无法正常重启。
2.在使用重启指令时,应注意避免程序中的死循环,以免影响重启功能的正常工作。
3.若设备具备多种重启方式,应根据实际需求选择合适的重启方式,避免不必要的麻烦。
总之,STM32重启指令是一项实用且重要的功能,通过对重启指令的掌握和运用,可以有效提高设备的可靠性和稳定性。
写第⼀个STM32程序常见错误及解决⽅法1.启动KEIL,创建⼯程以后,先⽤创建⽂件,然后什么也不⼲,直接点击保存,保存到你的⼯程⽂件夹下⾯,命名为main.c(其他也可以,命名为main.c是为了⽅便你同其他的C⽂件快速区分开来)。
然后输⼊以下⼏⾏代码:#include "stm32f10x.h"void main(void){}然后点击Build,会有以下报错信息:C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(96): error: #35: #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"这是说stm32f10x.h中要求⼯程在预编译时通过⼀个字符串,来识别所⽤的芯⽚FLASH⼤⼩,然后确定头⽂件中哪些语句有效。
ST把STM32按FLASH⼤⼩尺⼨来归类的,具体在STM32参考⼿册⾥⾯有。
解决办法:请点击中的打开的界⾯中选到选项,然后Define⾥⾯输⼊STM32F10X_MD(因为这个实验板上⽤的STM32F103C8T6对应这个“中等容量的FLASH”,换做其他芯⽚不⼀定是这个字符串),如图:然后点击OK。
再,然后会出第⼆个错误:C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(8297): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory这说明⽂件包含的路径没有设置好。
解决办法:按上⾯所述选到选项。
然后在下选择,再点击,然后打开⽬录找到固件库⾥⾯的这个⽂件(最好能把这个⽂件夹复制出来保存到⼀个纯英⽂路径的⽬录下),然后选择中⾥⾯的inc⽂件夹,然后再如法炮制选中⾥⾯的src⽂件夹。
STM32启动⽂件的选择移植了同事⼀个程序,然后死活不能⽤,发现启动⽂件错了,明天继续调。
真把⼈折腾死了。
stm32给的库⽂件太琐碎了,正如它的芯⽚型号⼀样繁多,例如启动⽂件:⽹上查到的各个⽂件的解释是:startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s ⼤容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s ⼤容量的STM32F100xx startup_stm32f10x_ld.s ⼩容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s⼩容量的STM32F100xx startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_md_vl.s 中容量的STM32F100xxstartup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xx固件库中的Release_Notes_for_STM32F10x_CMSIS.html写到:STM32F10x CMSIS Startup files: startup_stm32f10x_xx.sAdd new startup files for STM32 Low-density Value line devices: startup_stm32f10x_ld_vl.sAdd new startup files for STM32 Medium-density Value line devices: startup_stm32f10x_md_vl.sSystemInit() function is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c fileGNU startup file for Low density devices (startup_stm32f10x_ld.s) is updated to fix compilation errors.那到底啥是⼤容量,⼩容量啊?⼜查user manual才知道也就是说,例如我⽤STM32F103RB,那么选启动⽂件为startup_stm32f10x_md.s。
STM32F102启动脚本分析stm3210e_flash.ld文件中重要的变量/* Entry Point */ENTRY(Reset_Handler) /*指定可执行文件的起始代码段为Reset_Handler *//* Highest address of the user mode stack */_estack = 0x20010000; /* end of 64K RAM *//* Generate a link error if heap and stack don't fit into RAM */_Min_Heap_Size = 64; /* required amount of heap */_Min_Stack_Size = 256; /* required amount of stack *//* Specify the memory areas */MEMORY{FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512KRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64KMEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K}/* Define output sections */SECTIONS{/* The startup code goes first into FLASH */.isr_vector :{. = ALIGN(4); /*以4字节对齐*/KEEP(*(.isr_vector)) /* Startup code */ /*所有isr_vector的section都链接到此地址*/ . = ALIGN(4);} >FLASH/* The program code and other data goes into FLASH */.text :{. = ALIGN(4);*(.text) /* .text sections (code) */*(.text*) /* .text* sections (code) */*(.rodata) /* .rodata sections (constants, strings, etc.) */*(.rodata*) /* .rodata* sections (constants, strings, etc.) */*(.glue_7) /* glue arm to thumb code */*(.glue_7t) /* glue thumb to arm code */KEEP (*(.init))KEEP (*(.fini)). = ALIGN(4);_etext = .; /* define a global symbols at end of code */} >FLASH.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH.ARM : {__exidx_start = .;*(.ARM.exidx*)__exidx_end = .;} >FLASH.ARM.attributes : { *(.ARM.attributes) } > FLASH.preinit_array :{PROVIDE_HIDDEN (__preinit_array_start = .);KEEP (*(.preinit_array*))PROVIDE_HIDDEN (__preinit_array_end = .);} >FLASH.init_array :{PROVIDE_HIDDEN (__init_array_start = .);KEEP (*(SORT(.init_array.*)))KEEP (*(.init_array*))PROVIDE_HIDDEN (__init_array_end = .);} >FLASH.fini_array :{PROVIDE_HIDDEN (__fini_array_start = .);KEEP (*(.fini_array*))KEEP (*(SORT(.fini_array.*)))PROVIDE_HIDDEN (__fini_array_end = .);} >FLASH/* used by the startup to initialize data */_sidata = .;/* Initialized data sections goes into RAM, load LMA copy after code */.data : AT ( _sidata ) /*.data段,指定.data数据段的存储地址为当前的RAM地址*/ {. = ALIGN(4);_sdata = .; /* create a global symbol at data start */ /*data数据段的起始地址*/ *(.data) /* .data sections */ /*所有data数据段都链接到此地址*/*(.data*) /* .data* sections */. = ALIGN(4);_edata = .; /* define a global symbol at data end */ /*data数据段的结束地址*/ } >RAM/* Uninitialized data section */. = ALIGN(4);.bss : /*BSS栈段*/{/* This is used by the startup in order to initialize the .bss secion */_sbss = .; /* define a global symbol at bss start */ /*BSS栈的起始地址*/__bss_start__ = _sbss;*(.bss) /*所有bss栈段都链接到这里*/*(.bss*)*(COMMON). = ALIGN(4);_ebss = .; /* define a global symbol at bss end */ /*BSS栈的结束地址*/__bss_end__ = _ebss;} >RAMPROVIDE ( end = _ebss );PROVIDE ( _end = _ebss );/* User_heap_stack section, used to check that there is enough RAM left */._user_heap_stack : /*检查是否有建立堆段的足够空间*/. = ALIGN(4);. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(4);} >RAM/* MEMORY_bank1 section, code must be located here explicitly *//* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */.memory_b1_text :{*(.mb1text) /* .mb1text sections (code) */*(.mb1text*) /* .mb1text* sections (code) */*(.mb1rodata) /* read-only data (constants) */*(.mb1rodata*)} >MEMORY_B1/* Remove information from the standard libraries *//DISCARD/ :{libc.a ( * )libm.a ( * )libgcc.a ( * )}}startup_stm32f10x_hd.S程序内容:1、初始化SP;2、初始化PC为Reset_Handler;3、设置向量表,用异常ISR地址进入;4、设置系统时钟,和外部SRAM,SRAM mount在EV AL开发板,并用于数据存储(用户可选);5、跳转到C库中的main函数。
.syntax unified.cpu cortex-m3.fpu softvfp.thumb.global g_pfnVectors.global Default_Handler/* start address for the initialization values of the .data section.defined in linker script */.word _sidata/* start address for the .data section. defined in linker script */.word _sdata/* end address for the .data section. defined in linker script */.word _edata/* start address for the .bss section. defined in linker script */.word _sbss/* end address for the .bss section. defined in linker script */.word _ebss/* stack used for SystemInit_ExtMemCtl; always internal RAM used */.equ BootRAM, 0xF1E0F85F* @brief This is the code that gets called when the processor first* starts execution following a reset event. Only the absolutely* necessary set is performed, after which the application* supplied main() routine is called.* @param None* @retval : None*/.section .text.Reset_Handler /*输入段描述符:text 和Reset_Handler */.weak Reset_Handler.type Reset_Handler, %functionReset_Handler:/* Copy the data segment initializers from flash to SRAM */movs r1, #0b LoopCopyDataInitCopyDataInit:ldr r3, =_sidataldr r3, [r3, r1]str r3, [r0, r1]adds r1, r1, #4LoopCopyDataInit:ldr r0, =_sdata /*从Flash中拷贝代码段_sdata和_edata 之间的代码到SRAM*/ ldr r3, =_edataadds r2, r0, r1cmp r2, r3bcc CopyDataInitldr r2, =_sbss /*BSS段清零*/b LoopFillZerobss/* Zero fill the bss segment. */FillZerobss:movs r3, #0str r3, [r2], #4LoopFillZerobss:ldr r3, = _ebsscmp r2, r3bcc FillZerobss/* Call the clock system intitialization function.*/bl SystemInit/* Call the application's entry point.*/bl mainbx lr.size Reset_Handler, .-Reset_Handler/*** @brief This is the code that gets called when the processor receives an* unexpected interrupt. This simply enters an infinite loop, preserving* the system state for examination by a debugger.* @param None* @retval None*/.section .text.Default_Handler,"ax",%progbitsDefault_Handler:Infinite_Loop:b Infinite_Loop.size Default_Handler, .-Default_Handler/****************************************************************************** ** The minimal vector table for a Cortex M3. Note that the proper constructs* must be placed on this to ensure that it ends up at physical address* 0x0000.0000.******************************************************************************** /.section .isr_vector,"a",%progbits /*输入段描述符:isr_vector */.type g_pfnVectors, %object.size g_pfnVectors, .-g_pfnVectorsg_pfnV ectors:.word _estack.word Reset_Handler.word NMI_Handler.word HardFault_Handler.word MemManage_Handler。