stm32各个启动文件选择
- 格式:doc
- 大小:211.00 KB
- 文档页数:2
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 STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。
因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
ST公司2007年10月发布了V1.0版本的固件库,MDK ARM3.22之前的版本均支持该库。
2008年6月发布了V2.0版的固件库,从2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件库。
V3.0以后的版本相对之前的版本改动较大,本书使用目前较新的V3.4版本。
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版本为基础介绍标准外设库的结构。
解析STM32的启动过程当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。
如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。
但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。
相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。
无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。
最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。
话题转到STM32微控制器,无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件,程序开发人员可以直接引用启动文件后直接进行C应用程序的开发。
这样能大大减小开发人员从其它微控制器平台跳转至STM32平台,也降低了适应STM32微控制器的难度(对于上一代ARM 的当家花旦ARM9,启动文件往往是第一道难啃却又无法逾越的坎)。
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。
ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。
STM32开发板使用说明1、开发板使用到的软件及安装说明在开始学习开发板之前需要安装的软件有:1、KEIL3.80A,2、PL-2303HX驱动,3、串口调试助手,4、下载器MCUISP。
这些软件在课件文件下面的软件文件里。
具体安装步骤如下:1.KEIL3.80A的安装,打开路径:课件\软件\KEIL3.80A\MDK3.80A安装手册,根据上面的步骤安装软件。
2.PL-2303HX驱动的安装,打开路径:课件\软件\PL-2303HX新版驱动,可根据使用电脑的操作系统来选择安装的软件,如选择安装XP驱动,可打开XP驱动,根据里面的安装说明来安装软件。
一般只要运行PL-2303 Driver Installer。
exe就可以了。
3.串口调试助手的安装,打开路径:课件\软件\串口调试助手,点击sscom33。
exe即可,也可以创建快捷方式在桌面。
4.下载器MCUISP的安装,打开路径:课件\软件\下载器MCUISP,点击mcuisp。
exe 即可,也可以创建快捷方式在桌面。
2、开发环境介绍及使用说明首先是我们之前安装的keil3.80a。
再点击Project->New uVision Project如下图所示:弹出create new project 对话框,新建一个文件夹TEST,然后把工程名字设为test。
点击保存。
弹出选择器件的对话框,因为我们的开发板使用的是STM32F103RBT6 ,所以在这里我们选择STMicroelectronics 下面的STM32F103RB( 如果使用的是其他系列的芯片,选择相应的型号就可以了)。
如下图所示:点击OK,MDK会弹出一个对话框,问你是否加载启动代码到当前工程下面,这里我们选择是。
启动代码是一段和硬件相关的汇编代码。
是必不可少的!在上面点击了是以后,MDK 就把启动代码STM32F10x。
s 加入到了我们的工程下面。
如下图所示:到这里,我们就可以开始编写自己的代码了。
STM32启动文件详解一、启动文件的作用1.初始化堆栈指针 SP;2.初始化程序计数器指针 PC;3.设置堆、栈的大小;4.设置异常向量表的入口地址;5.配置外部 SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);6.设置 C库的分支入口__main(最终用来调用 main函数);7.在 3.5版的启动文件还调用了在 system_stm32f10x.c文件中的SystemIni()函数配置系统时钟。
二、汇编指令三、启动代码1.stack ----- 栈Stack_Size EQU 0x00000400 ; 栈的大小AREA STACK, NOINIT, READWRITE,ALIGN=3 Stack_Mem SPACE Stack_Size ; 分配栈空间__initial_sp ; 栈的结束地址(栈顶地址) 分配名为STACK,不初始化,可读可写,8(2^3)字节对齐的1KB空间。
栈:局部变量,函数形参等。
栈的大小不能超过内部SRAM大小。
AREA:汇编一个新的代码段或者数据段。
STACK段名,任意命名;NOINIT表示不初始化;READWRITE可读可写;ALIGN=3(2^3= 8字节对齐)。
__initial_sp紧挨了SPACE放置,表示栈的结束地址,栈是从高往低生长,结束地址就是栈顶地址。
2.heap ----- 堆Heap_Size EQU 0x00000200 ; 堆的大小(512Bytes)AREA HEAP, NOINIT, READWRITE,ALIGN=3__heap_base ; 堆的起始地址Heap_Mem SPACE Heap_Size ; 分配堆空间__heap_limit ; 堆的结束地址分配名为HEAP,不初始化,可读可写,8(2^3)字节对齐的512字节空间。
__heap_base堆的起始地址,__heap_limit堆的结束地址。
本文通过对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,它的目的就是将栈空间清零。
第一部分开发板介绍1.1 STM32开发板简介开发板配置:●CPU主芯片是STM32F103VCT6,主频72MHz,256KB FLASH ,48KB RAM;●3个按键,可实现中断或查询方式判断是否有键按下;●4个发光二极管LED,可进行流水灯或花样显示;●1个无源蜂鸣器,可用PWM驱动;●1个电位器,可配合内部AD进行AD转换;●1个RS232串行通信接口,可使开发板与PC机进行通信;●1个基于SPI串行总线的触摸屏转换接口芯片,可进行触屏操作;●1个基于IIC串行总线的EEPROM,可进行数据存储;●1个基于CPU片内SDIO的TF卡接口,可进行数据读写;●1个FSMC控制的2.83英寸TFT液晶屏,可进行图片文字显示;●1个蓝牙模块,可使开发板与PC机进行通信;●1个USBmin2.0接口为开发板供电;●所有I/O口引出,可通过跳线自行配置和自制外围模块连接;下面介绍一下STN32开发板的各个部分。
1、LED灯STM32开发板有4个LED灯,它们在开发板上的标号分别为LED1、LED2、LED3、LED4。
在调试代码的时候,使用LED来指示程序状态,是非常不错的辅助调试方法。
2、按键STM32开发板有三个普通按键,它们在开发板上的标号分别为KEY1、KEY2、KEY3。
可以用于人机交互的输入,三个按键通过跳线帽连接到STM32的开发板的IO口上。
3、电源指示灯开发板上有一个蓝色电源指示灯,它在开发板上的标号为LED5(POWER)。
用于指示电源状态。
该开发板通过USB供电,在该电源开启的情况下,指示灯亮,否则不亮。
通过这个LED灯判断开发板的上电情况。
4、蓝牙开发板上有一个蓝牙模块,它在开发板上的标号为Bluetooth。
用于开发板与电脑进行无线通讯。
5、SD卡接口SD卡接口在开发板上的标号为TF_Card。
SD卡是最常见的存储设备,是很多数码设备的存储媒介,比如数码相框、数码相机、MP5等。