0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32四行【跳转程序】 引申出来的几条重要知识点

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-08 11:37 次阅读

本文分享以下几点(引申出来的)重要知识点:

1.STM32是如何实现程序跳转的?

2.复位向量表

3.理解__set_MSP语句

关键字帮助

堆栈指针SP

控制寄存器CONTROL

1写在前面

上一篇文章《STM32 IAP应用编程几个要点》讲述的内容很多朋友都了解过,也都使用过ST官网提供的代码。但使用过的人有许多都没有深入了解,仅仅只是把代码下载到板卡中跑了一下而已(因为代码完全可以使用)。所以,很少有人研究其中细节的问题。

o4YBAF4WkDiAaA_DAAE1AZgFFc4227.png

先看一下上图中四行跳转代码,接下来将围绕这四行代码拓展相关的内容。

2STM32是如何实现程序跳转的?

上图四行代码中有几个定义没有贴出来,下面一并贴出来:

#defineApplicationAddress0x8003000typedefvoid(*pFunction)(void);pFunction Jump_To_Application;uint32_t JumpAddress;

ApplicationAddress为0x8003000,代表应用程序起始地址为0x8003000。

1.JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

JumpAddress代表跳转地址,基于应用程序起始地址偏移4(这个偏移4下面章节讲述)。这个地址就是应用程序的复位地址,你可以理解为程序跳转到了应用程序复位的地址。

2.Jump_To_Application = (pFunction) JumpAddress;

将跳转地址JumpAddress强制转换pFunction类型,你可以理解为编译器将其编译成一个函数。

3.__set_MSP(*(__IO uint32_t*) ApplicationAddress);

这里是将把应用程序起始地址设为栈顶指针(__set_MSP下面章节讲述)。

4.Jump_To_Application();

设置PC指针为复位地址,你可以理解为跳转到应用程序的函数。

这里是讲述的大概内容,细节内容请往下看,看完下面细节再回来看本节内容。

3复位向量表

上面讲述了ApplicationAddress + 4“偏移4”这个问题,其实这个“偏移4”就是向量表的偏移地址:复位向量(PC 初始值)。

拿Cortex-M3(STM32F1)为例(其它M0、M4类似),Cortex-M3权威手册(中文)表 7.6 上电后的向量表:

o4YBAF4WkDmACHqZAAE_3S5e0cY723.jpg

是什么意思呢?就是相对应用程序存储起始地址的一张向量表,而这张向量表就是按照这样的约定:偏移4的地址为复位向量(PC 初始值),也就是我们应用程序复位的地方。

同样,可以参看启动代码(以STM32F1为例):

pIYBAF4WkDmAHS4pAADfgf_H53c301.jpg

这里代码和Cortex-M3技术参考手册数据一一对应的关系。相信看了这两个地方的内容,大家能明白为什么会是ApplicationAddress + 4了。

4理解__set_MSP语句

1.拓展:MDK-ARM新功能

点看下图,放大,自己看截图代码(标记处):

pIYBAF4WkDqAOtLqAAC8YKTDrs0130.jpg

用MDK-ARM V5.25及以上版本打开工程,可以看到在__set_MSP下面有一行下划线,什么意思呢?

这是MDK-ARM V5.25的新功能(现在,MDK-ARM V5.26就快要出来了)具有上下文帮助(F1)的关键字将用浅灰色下划线突出显示。

详细可以参看:

http://www2.keil.com/mdk5/525

(提示:公众号不支持外链接,请复制链接到浏览器下载)

这里推荐阅读我另外两篇文章:

1.MDK v5.25比较实用的功能

2.MDK-ARM V5.26预览版更新的几条重要内容

2.理解__set_MSP语句

上面讲述的内容是想引申出来:鼠标放在__set_MSP的位置,按F1,就可以直接进入帮助文档。

下面是详细内容截图:

o4YBAF4WkDqALzCoAADJRZf3woc012.jpg

大概意思是:调用MSR指令设置主状态指针(MSP)的值。

物理上存在两个不同的堆栈指针(SP):

1.主堆栈指针(MSP),复位后的默认堆栈指针。在运行异常处理程序时也使用它。

2.进程堆栈指针(PSP),只能在线程模式下使用。

当引用R13堆栈指针(SP)时,由控制寄存器(CONTROL)的Bit[1]决定:

Bit[1]=0,用MSP;

Bit[1]=1,用PSP;

这里具体内容需要参看Cortex-M技术参考手册。

我的另外一篇文章《如何判断CPU是否正在执行中断函数》讲述了关于控制寄存器(CONTROL)的一种使用方法,可以参看我那一篇文章。

5“雪白”的图片

还是跟随热点,相信大家都听说了“关于谷歌回来的消息”,据知情人透露,谷歌回来几乎不可能。

当我现在(2018年8月9日)百度图片输入“雪白”的时候,已经不在是“雪白”的图片了,已经被百度程序猿GG加班加点改掉了。

百度图片搜索“雪白”如下图:

谷歌图片搜索“雪白”如下图:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2265

    文章

    10859

    浏览量

    354554
  • 复位
    +关注

    关注

    0

    文章

    170

    浏览量

    24192
  • 控制寄存器
    +关注

    关注

    0

    文章

    34

    浏览量

    11475
收藏 人收藏

    评论

    相关推荐

    接口测试理论、疑问收录与扩展相关知识点

    本文章使用王者荣耀游戏接口、企业微信接口的展示结合理论知识,讲解什么是接口测试、接口测试理论、疑问收录与扩展相关知识点知识学院,快来一起看看吧~
    的头像 发表于 11-15 09:12 119次阅读
    接口测试理论、疑问收录与扩展相关<b class='flag-5'>知识点</b>

    STM32F1 IAP操作读保护选项字节设置,APP使用系统复位跳转后无法运行IAP的原因?

    最近调试一个程序,是基于STM32F1做的IAP,升级前后需要修改选项字节,FLASH_EraseOptionBytes函数内OB->RDP=RDP_Key语句实现读保护的解除,如果我
    发表于 05-13 08:09

    模拟电子技术知识点问题总结概览

    给大家分享模拟电子技术知识点问题总结。
    的头像 发表于 05-08 15:16 1084次阅读
    模拟电子技术<b class='flag-5'>知识点</b>问题总结概览

    一篇搞定DCS系统相关知识点

    目标。DCS系统广泛应用于各个行业,如化工、电力、制药等。在这些行业中,DCS系统可以实现对生产过程的集中监控和分散控制,提高生产效率和产品质量,降低能耗和减少环境污染,从而保证产品质量,并确保生产过程的安全可靠。 二.DCS系统知识点
    的头像 发表于 03-26 18:40 797次阅读
    一篇搞定DCS系统相关<b class='flag-5'>知识点</b>

    STM32L431RCT6从用户代码区跳转使用内置system memory bootloader无效怎么解决?

    STM32L431RCT6 从用户代码区跳转使用内置system memory bootloader 无效。 1. 跳转代码如下,这个代码 可以在STM32F407VET6上正常
    发表于 03-26 07:54

    stm32h750vbt6实现bootloader跳转到外部Qsip flash执行代码,跳转后APP程序不执行怎么解决?

    stm32h750vbt6实现bootloader跳转到外部Qsip flash执行代码,跳转后APP程序不执行
    发表于 03-19 07:24

    【量子计算机重构未来 | 阅读体验】第二章关键知识点

    本帖最后由 oxlm_1 于 2024-3-6 23:20 编辑 之所以将第二章单独拿出来,是因为在阅读过程中,发现第二章知识点较多,理解起来比较耗时间。 第二章的主要知识点: 量子
    发表于 03-06 23:17

    Vim跳转技巧

    相对跳转用于在当前行的基础上向上或向下跳转一定的行数。可以在命令模式下输入:num命令,其中num可以是正数、负数。例如,要向上跳转5,可以在命令模式下输入:+5,然后按下回车键即可
    的头像 发表于 01-18 16:30 1120次阅读

    浅谈初级电工必备知识点

    对于初学电工的朋友来说,掌握一些基础且实用的知识点是非常重要的。本文旨在分享初级电工应该掌握的核心知识,帮助新手电工更好地入门和提升技能。
    的头像 发表于 12-26 10:44 1016次阅读

    TCP协议面试常问知识点总结

    TCP 作为传输层的协议,是一个IT工程师素养的体现,也是面试中经常被问到的知识点。在此,我将 TCP 核心的一些问题梳理了一下,希望能帮到各位。
    的头像 发表于 12-15 10:38 758次阅读
    TCP协议面试常问<b class='flag-5'>知识点</b>总结

    开关模式下的电源电流如何检测?这12个电路&amp;10个知识点讲明白了

    开关模式下的电源电流如何检测?这12个电路&10个知识点讲明白了
    的头像 发表于 12-06 16:04 755次阅读
    开关模式下的电源电流如何检测?这12个电路&amp;10个<b class='flag-5'>知识点</b>讲明白了

    干货 | 搞硬件设计不能忘记的11个知识点

    干货 | 搞硬件设计不能忘记的11个知识点 1、不要忘记在 电源 输入和输出端加电容滤波通常情况,电源的输入和输出端的电信号是不稳定的,直接给负载供电,长期会给负载造成损伤,也会其使工作不稳定。而我
    发表于 11-30 15:01

    c语言程序设计基础知识点

    程序设计的基础知识点。 首先,我们将从C语言的数据类型和变量开始。C语言提供了多种数据类型,包括整数、浮点数、字符和指针等。整数类型包括int、long和short等,浮点数类型包括float和double等,字符类型用于存储ASCII字符,指针类型用
    的头像 发表于 11-27 15:25 1590次阅读

    数字电位计知识点

    电子发烧友网站提供《数字电位计知识点.pdf》资料免费下载
    发表于 11-24 16:08 7次下载
    数字电位计<b class='flag-5'>知识点</b>

    三菱和西门子PLC输入接线知识点

    三菱和西门子PLC输入接线知识点
    的头像 发表于 11-21 10:01 699次阅读
    三菱和西门子PLC输入接线<b class='flag-5'>知识点</b>