一开机stm就出来了怎么关

版权声明:本文为博主原创文章未经博主允许不得转载。 /qq_/article/details/

启动模式讲完了我们知道是主闪存存储器启动的(主闪存存储器就是芯片内部的flash)。主闪存存储器被映射到啟动空间(0x)但仍然能够在它原有的地址(0x)访问它。
接下来再看一下它的启动流程是怎样的。
话说启动流程我都讲过很多个了。


首先你得知道主闪存存储器、系统存储器、内置SRAM代表什么它们映射哪个区域。


主闪存存储器:芯片内部的flash即256K字节;从用户闪存启动,这是正常嘚工作模式
系统存储器:应该类似于BL1(18K字节);将程序写入到一快特定的区域一般由厂家直接写入,不能被随意更改或擦除
内置SRAM:64K字節;由于SRAM掉电丢失,不能保存程序一般只用于程序的调试。

小容量产品主存储块最大为4K×64位每个存储块划分为32个1K字节的页
中容量产品主存储块最大为16K×64位,每个存储块划分为128个1K字节的页
大容量产品主存储块最大为64K×64位每个存储块划分为256个2K字节的页
互联型产品主存储块朂大为32K×64位,每个存储块划分为128个2K字节的页

;AREA 伪指令用于定义一个代码段或数据,定义栈 可初始为0,8字节对齐2*2*22的3次方。 ;NOINIT:指定此数据段仅僅保留了内存单元 ;READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE 在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的 表达式的取值范围为0~31,相应的对齐方式为2表达式次方 ;SPACE 用来分配一片连续的存储区域并初始化为0。 __initial_sp ;表示栈空间顶地址汇编代码地址標号

栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值局部变量的值等。其操作方式类似于数据结构中的栈

;ALIGN用来指定对齐方式, 8芓节对齐

堆区(heap) — 一般由程序员分配释放 若程序员不释放,程序结束时可能由OS回收 注意它与数据结构中的堆是两回事,分配方式倒昰类似于链表

;实际上是在CODE区(假设32从FLASH启动则此中断向量表起始地址即为0x8000000) ;定义一块数据段,只可读段名字是RESET ;DATA属性:用于定义数据段,默认为READWRITE指定本段为可读可写 ;在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用 ;在程序中声明一个全局的标号__Vectors_End ;栈顶地址该处物理地址值即为 __Vetors 标号所表示的值 ;该地址中存储__initial_sp 所表示的地址值,大小为一个字(32bit) ;复位中断服务入口地址

3、地址重映射及中斷向量表的转移

;定义一个代码段可读,段名字是.text 段名若以数字开头则该段名需用"|"括起来,如|1_test| ;定义只读数据段,实际上是在CODE区如果在FLASH区起动,则 中断向量起始地址为0X8000000 ;CODE属性:用于定义代码段默认为READONLY ;标记一个函数的开始;利用PROC、ENDP这一对伪指令把程序段分为若干个过程,使程序的结构加清晰 ;在外部没有定义该符号时导出该符号Reset_Handler ;EXPORT伪指令用于在程序中声明一个全局的标号 ;IMPORT 伪指令用于通知编译器要使用嘚标号在其他的源文件中定义 ;__main为运行时库提供的函数;完成堆栈的初始化等工作会调用下面定义的__user_initial_stackheap ;WEAK声明其他的同名标号优先于该标號被引用,就是说如果外面声明了的话, ;使用的话则将栈顶地址堆始末地址赋予全局属性 ;ALIGN属性:使用方式为ALIGN 表达式。在默认时ELF(可執行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31相应的对齐方式为2表达式次方

进入debug模式,来进行一下调试

首先偠搞清楚一下 SP、LR和PC 是什么

每一种异常模式都有其自己独立的r13它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(鼡户模式和系统模式)都有各自独立的堆栈,用不同的堆栈指针来索引这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压叺堆栈返回时再出栈,保证了各种模式下程序的状态的完整性

每种模式下r14都有自身版组,它有两个特殊功能
(1)保存子程序返回地址。使用BL或BLX时跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回,通常用下列指令之一:
通常子程序这样写保证了子程序中还可以调用子程序。

(2)当异常发生时异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断
PC是有读写限制的。当没有超过读取限制的时候读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的故bit[1:0]总是00。当用str或存储PC的时候偏移量有可能是8或12等其它值。在V3及以下版本中写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00否则后果不可预测。

主堆栈指针(MSP):复位后缺省使用的堆栈指针用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP):由用户的应用程序代码使用。
发生一个中断时一般都要执行一段中断处理程序。在ARM中预先定义了许多芯片支持的中断类型但是中断处理程序需要用户自己去写,这样ARM只对不同的中斷类型提供了一个预定义的地址但是这些预定义的地址里面是不够存放用户编写的中断处理程序的。
用户自己写了中断处理程序然后紦中断处理程序的入口放在系统预定义的中断地址处,这样在发生中断后就会跳转到用户编写的中断处理程序处
中断很多,形成了一个跳转表成为中断向量表。

当一个程序代码通过编译连接后其全局、静态变量、堆栈的位置已经赋予了具体的内存地址(从0x200 0000开始)了。洇此其SRAM布局就是定死了的
代码区则是从从0x通过Icode、Dcode总线访问的。

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

32如何推挽输出开机就自动低电岼, [问题点数:40分结帖人xujianxiang]

我现的情况是32 I/O 控制U2.中间一个电阻接地,这样开机就自动低电平程序跑起来后我想将I/O口强制拉高。请问要怎样配电阻的大小是多少为好。

好像不需要下拉电阻吧?IO配置完了之后,直接输入低即可...

  下拉电阻5.1K就可以了如果你不在乎上电之后到初始化结束之间很短的时间内的电平,那么就不需要下拉在初始化之后,输出0就好 

  更专业的做法是: 在输出端口接一个反相器,那么在上电复位阶段可以确保端口输出0电平

我试过了。10K接地可行但我想1楼得应该不行,我是就上电那会程序还没跑呢你怎么设置。就算你第一条僦写这个代码也没有用

我试过了。10K接地可行但我想1楼得应该不行,我是就上电那会程序还没跑呢你怎么设置。就算你第一条就写这個代码也没有用

在什么情况下需要到那么快的下拉?

查看datasheet确认复位状态下IO口状态,有的是高电平有的是低电平,有的是高阻抗输入不哃状态可以有不同的处理方法;

高电平的加反向器,低电平的可以不管、高阻抗的可以接下拉10K

单片机复位一般会有几十毫秒,有些场合昰要处理IO口上电的状态的

开机到运行到设置低电平的代码前都是高电平的,应该只能从硬件入手吧输出加个大电容能跳过这个时间。

匿名用户不能发表回复!

我要回帖

更多关于 stm 的文章

 

随机推荐