STM32中文参考手册_STM32读取ESP8266数据

STM32中文参考手册_STM32读取ESP8266数据http://blog.csdn.net/u012722571/article/details/47295245lanmanck原创】这篇文章已经说了STM32的启动过程:http://blog.csdn.net/lanmanck/article/details/8252560我们也知道怎么跳到main函数了,那么,中断发生后,又是怎么跑到中断入口地址的呢?从stm

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

http://blog.csdn.net/u012722571/article/details/47295245

lanmanck原创】

这篇文章已经说了STM32的启动过程:

http://blog.csdn.net/lanmanck/article/details/8252560

我们也知道怎么跳到main函数了,那么,中断发生后,又是怎么跑到中断入口地址的呢?

从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:

AREA    RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)
                EXPORT  __Vectors
IMPORT OS_CPU_SysTickHandler
       IMPORT OS_CPU_PendSVHandler

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler

这个向量表的编写是有讲究的,跟硬件一一对应不能乱写的,CPU找入口地址就靠它了,bin文件开头就是他们的地址,参考手册RM0008的10.1.2节可以看到排列。

我们再结合CORTEX-M3的特性,他上电后根据boot引脚来决定PC位置,比如boot设置为flash启动,则启动后PC跳到0x08000000。此时CPU会先取2个地址,第一个是栈顶地址,第二个是复位异常地址,故有了上面的写法,这样就跳到reset_handler。

那么这个reset_handler的实际地址是多少.?下面的一堆例如Nmi_handler地址又是多少呢?发生中断是怎么跑到这个地址的呢?下面挨个讲解。

1、我们可以通过反向来得知这些入口地址,查看工程下的map文件就可以看到了,这个地址跟keil里面设置的target->flash起始地址息息相关,实际上我们不太需要关心,让编译器分配,中断向量表放的就是他们的地址。

2、对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。

3、进到C语言后会先配置NVIC,NVIC_SetVectorTable()里面可以配置中断向量表的起始地址和偏移,主要是告诉CPU该向量表是位于Flash还是Ram,偏移是多少。例如设置为位于Flash内,偏移就是烧入的程序地址,可在Keil target中设置。这样CPU就知道入口地址了。

4、发生中断后,CPU找到中断向量表地址,然后根据偏移(对号入座)再找到中断地址,这样就跳过去了。

我们截一个图说明一下,map文件:

STM32中文参考手册_STM32读取ESP8266数据

对应的bin文件,看是不是放的上面地址:

STM32中文参考手册_STM32读取ESP8266数据

显然,200039c0就是栈顶地址,而08006F21就是reset_handler地址!

如何定位?以放到0x20000000为例

1、keil设置ram起始为0x20000100,我们在0x20000000~0x20000100放中断向量表,其他给程序用

2、设置NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);  设置NVIC_SetVectorTable(NVIC_VectTab_RAM,0);

3、跳到C时把中断向量表拷贝到0x20000000

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210123.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GridLayout用法「建议收藏」

    GridLayout用法「建议收藏」概述  在Android中,使用的最多的布局是LinearLayout了,它可以让布局界面中的子控件以常见的方式比如水平或者垂直方向对齐。在使用LinearLayout时,开发者应该会记得,会经常遇到复杂的布局结构,所以会时常使用各种LinearLayout进行嵌套,而且应该注意嵌套层次不要过多。  有很多不错的文章(比如有:AndroidLayoutTricks#1,Flattening

    2022年6月7日
    34
  • 实施运维企业面试题-5「建议收藏」

    实施运维企业面试题-5「建议收藏」NETWORK1请描述TCP/IP协议中主机与主机之间通信的三要素参考答案IP地址(IPaddress)子网掩码(subnetmask)IP路由(IProuter)2请描述IP地址的分类及每一类的范围参考答案A类1-26B类128-191C类192-223D类224-239组播(多播)E类240-254科研3请描述A、B、C三类IP地址的默认子网掩码参考答案A类255.0.0.0B类255.255.0.0C类

    2022年5月5日
    34
  • mac全选文字的快捷键_Mac文本快捷键你知道多少?

    mac全选文字的快捷键_Mac文本快捷键你知道多少?我们在MAC电脑上码字的时候,经常会遇到需要对某段文字进行修改或者操作的情况,相信很多人的做法是用鼠标去移动光标快速定位,如果字数篇幅比较小也是可以的,但是如果遇到大篇幅的文章,一点点的用鼠标去找会非常麻烦,今天我就教大家几个MAC文本快捷键,让你在最短的时间内把光标移动到你想要的位置,提高在电脑上码字的效率。image1、全文&段落定位目标位置比较远的时候,需要对光标远程定位,下面的组合…

    2022年5月26日
    55
  • awvs14安装教程_awvs官网

    awvs14安装教程_awvs官网目录0x00前言0x01AWVS14.5更新内容1、更新2、修复0x02AWVS安装1、解压后双击打开AcunetixPremiumv14.5.211026108.exe2、选一个中意的安装位置和数据存放位置,将它埋下3、建一个自己的AWVS登录账号,不需要真实的账户4、更改AWVS连接端口号,笔者直接默认5、安装AWVS途中安装证书6、成功安装0x03AWVS激活1、管理员权限打开AcunetixPremiumActivationT

    2022年9月22日
    0
  • navicat15 激活码(破解版激活)

    navicat15 激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    44
  • vue和Jquery差别之动态添加删除元素

    vue和Jquery差别之动态添加删除元素vue和jquery都是耳熟能详的,我就不多赘述了,直接上正餐吧为了展示他们在动态添加删除元素的区别,我分别用他们写了同一个功能的小例子。这个例子要求要在输入框中输入字符串,按回车键后增加一行。点击蓝色按钮,数字增加。点击“X”按钮删除整行。很明显的是jquery的代码行数更为少,但是他的灵活性和代码逻辑性比vue’差。代码如下,有可以优化的地方望指正。

    2022年10月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号