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
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371134
  • 复位
    +关注

    关注

    0

    文章

    179

    浏览量

    24966
  • 控制寄存器
    +关注

    关注

    0

    文章

    34

    浏览量

    11741
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32程序的烧录方式

    电子发烧友网站提供《STM32程序的烧录方式.pdf》资料免费下载
    发表于 08-28 16:03 6次下载

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】01初读体验

    第三章和第章,更多的是从语法和源文件分析的角度上去讲解yocto相关的基础知识,但由于内容比较偏知识点讲解,缺乏实战,因此看完后,脑海中仅有个概念,看到后面的内容时还需要往回翻对应的知识点
    发表于 06-30 21:49

    CUEBIDE生成的APP程序,在写入FLASH之后无法正常跳转怎么解决?

    实现IAP的功能,使用CUEBIDE生成的APP程序的bin文件,写入到FLASH之后,无法正常跳转程序卡在/ 检查栈顶地址是否合法 / 但是用KEIL生成的bin文件写入后可以正常跳转
    发表于 06-09 06:43

    CUEBIDE生成的APP程序,在写入FLASH之后无法正常跳转怎么解决?

    实现IAP的功能,使用CUEBIDE生成的APP程序的bin文件,写入到FLASH之后,无法正常跳转程序卡在/[i] 检查栈顶地址是否合法 / 但是用KEIL生成的bin文件写入后可以正常
    发表于 06-05 07:15

    EMC 设计避坑指南:不口诀

    明明设计得很好,为什么一做EMC测试就失败?雷卯EMC小哥教大家4个超实用的EMC设计技巧不口诀,帮你避开常见的坑!准则1让电流“走捷径”,不绕远路核心逻辑:高频电流走“电感最小路径”,环路越大→辐射越强!雷卯实验室关键知识点
    的头像 发表于 05-29 09:03 2949次阅读
    EMC 设计避坑指南:<b class='flag-5'>四</b>不口诀

    C51单片机及C语言知识点必备秘籍

    单片机关键知识点一览: 系列一 1:单片机简叙 2:单片机引脚介绍 3:单片机存储器结构 4:第一个单片机小程序 5:单片机延时程序分析 6:单片机并行口结构 7:单片机的特殊
    发表于 05-15 14:00

    电机选型计算公式与知识点汇总

    纯分享帖,需要者可点击附件获取完整资料~~~*附件:电机选型计算公式与知识点汇总.pdf 【免责声明】内容转自今日电机,因转载众多,无法确认真正原始作者,故仅标明转载来源。版权归原出处所有,纯分享帖,侵权请联系删除内容以保证您的权益。
    发表于 04-29 16:10

    电气工程师必知必会的100个电⽓知识点分享

    电⽓⼯程师也都是从电⽓学徒⼯⼀步⼀步积累成长起来的。积跬步⾄千⾥,汇细流成江海!朋友们,现在让我们⾛⼀个捷径,花半个⼩时的时间来积累100个必知必会的电⽓知识点吧!
    的头像 发表于 03-14 11:05 1509次阅读

    如何用几条命令搞定Ubuntu系统的网络配置

    在某些场景下,设备没有显示器或屏可以用,这时候通过命令行来设置网络就变得特别重要了。本文将介绍如何用几条命令搞定Ubuntu系统的网络配置。
    的头像 发表于 03-14 10:53 3256次阅读
    如何用<b class='flag-5'>几条</b>命令搞定Ubuntu系统的网络配置

    使用stm32cubeide debug是可以运行的,但是就是不能跳转,为什么?

    使用stm32cubeide debug是可以运行的,但是就是不能跳转,很奇怪
    发表于 03-12 08:01

    请问STM32H5递增HDPL后如何跳转下一级程序

    STM32H5的HDP保护,比如某一级ROT提升HDP等级并跳转下一级代码运行。那设置HDP等级提升后,立刻生效吗?如果生效,芯片不能再执行当前ROT中的程序,接下来怎么跳转到下一级
    发表于 03-11 06:00

    华邦电子安全闪存关键知识点

    黑客攻击?高温考验?驾驶安全?通通没在怕的!1月15日,华邦电子举办了“安全闪存强化车用电子安全性”为主题的线上研讨会。为了让没能参加这场线上研讨会的邦友们也可以清晰 Get 安全闪存关键知识点,邦
    的头像 发表于 02-12 18:15 1106次阅读

    Docker-镜像的分层-busybox镜像制作

    目录 知识点1:镜像的分层 示例:进入 docker hub查看Jenkins的Dockerfile 知识点2:base镜像 知识点3:scratch镜像 scratch 镜像是什么? 示例:在
    的头像 发表于 01-15 10:44 1006次阅读
    Docker-镜像的分层-busybox镜像制作

    Aigtek功率放大器应用:电感线圈的知识点分享

    电磁驱动是功率放大器的一大基础应用领域,其中我们最常见的就是用功放来驱动电感线圈,那么关于电感线圈的这10大知识点你都知道吗?今天Aigtek安泰电子来给大家介绍一下电感线圈的基础知识
    的头像 发表于 01-07 15:43 1189次阅读
    Aigtek功率放大器应用:电感线圈的<b class='flag-5'>知识点</b>分享

    后悔没有早点看到:天线设计中的知识点

    Cat.1 bis R13架构,天线架构精简为单天线架构,去掉了分集接收天线,因此只需要一根天线。   知识点: Cat.1 bis相对于Cat.1的区别是,后者为两根天线(一根主天线,一根分集天线
    的头像 发表于 12-24 17:11 1595次阅读
    后悔没有早点看到:天线设计中的<b class='flag-5'>知识点</b>!