关于M0内核MCU的Bootloader编写_m0内核的bootloader-程序员宅基地

技术标签: Bootloader  中断向量表映射  Cortex-M0  内核启动  51822  嵌入式  

      在使用MCU的时候如果要使用程序下载、程序升级或程序备份,那么都需要自己编写Bootloader。那么编写Bootloader使首先应该完成的是什么呢?没错,就是中断向量表。那如果操作中断向量表呢?这里就详细说一下:

      要操作中断向量表,首先要知道中断向量表是什么,它的作用是什么?在编写MCU程序的时候都会用到中断,然后会有中断回调函数。MCU是如何通过中断而转到中断回调函数呢?这就需要中断向量表了,可以简单的理解,中断向量表就是连接中断事件和中断回调函数的桥梁。当有中断产生的时候,MCU会到中断会向量表中找回调函数,进而去执行。如果想了解更多的可以看M0和M3内核手册。

      那知道了中断向量表是什么,现在要编写Bootloader的时候需要对中断向量表进行处理。在我的另一篇文章《STM32 IAP下载》篇中有介绍M3内核的相关操作,这里就不做过多介绍了,有兴趣的可以去看一下,附上链接:https://blog.csdn.net/qq_26226375/article/details/80158869

      这篇文章还是以一个特定的MCU来解释,因为最近都在玩Nordic的51822芯片,所以,就以51822为例来介绍。51822是一款可以跑蓝牙协议栈的芯片,这里并没有使用协议栈,用的裸机。言归正传,如何操作中断向量表,M0和M3内核有一定的区别,使用M3内核的STM32F1XX可以直接对中断向量表进行映射,而且这个操作只需要配置一个寄存器就好了。而使用M0的51822芯片却不能这么做,有兴趣的可以试一下,如果写两个工程,一个Boot程序,一个应用程序,两个工程的起始地址不一样。如果可以完成从Boot程序成功跳转到应用程序,那么恭喜,已经成功了四分之一了。如果这时候在应用程序中进入了中断回调函数,会发现好像中断回调函数的执行结果和自己在应用程序中写的中断回调函数结果不一样,但是却好像跟Boot的中断回调函数一样,这就很气了。这是为什么呢?这是因为所有程序的起始地址都是从0x00000000开始,从起始地址向后偏移一定的位置是中断向量表,MCU都是根据这个中断向量表来找到中断回调函数。虽然在应用程序中也定义了中断向量表,但是如果不做处理,这个向量表不能被MCU检测到。所以当在应用程序中调用回调函数的时候,程序会回到Boot的中断回调函数位置,然后调用Boot的回调函数。那么我们最关键的就是让应用程序能调用应用程序的回调函数。

    这里顺便介绍一下M0的启动流程。通常M0处理器都是从0x00000000开始的,内容如下图:

  

0x00000000的地址有个0x20008000的地址,这个地址就是(MSP)主栈指针的初始值,在往上的4个字节是复位后的程序执行的起始地址(会先执行复位)。从图上可以看到是0x000000c1,也就是说,程序在复位后,会从0x000000c1的位置开始。而0x00000000-0x000000c0的内容都被称之为“向量表”。那之后的是什么呢?见下图:

这个图就可以详细的看到向量表中存储的是什么。复位向量后是NMI向量,之后是硬件错误。。bulabula。。。这些看起来是不是有点眼熟。没错,这些就是在启动文件里的向量表内容。一般都会在.s文件里。这里依旧以51822为例:

可以看到这个启动文件里的东西,跟我们上边说的是对应的。我们看到的都是异常中断的中断回调函数,当程序出现异常的时候就会进入这些异常回调函数中。同样,图片下方的POWER_CLOCK_IRQHandler 、RADIO_IRQHandler..bulabula 也都是中断回调函数。既然M0内核没有办法进行中断向量表映射,那我们就需要让程序在boot和应用程序分别调用自己的中断回调函数。但是每次中断,程序都会回到0x00000008的位置开始寻找,所以必须在0x00000008的位置开始就区分开。

因为中断回调函数也是函数,也是调用一个地址的内容,所以我们可以把中断回调函数的内容都换成有序的、可以被我们控制的地址。那么当调用中断回调函数的时候,程序就会调用我们希望其调用的地址。可以这样做,如下附上代码:

/*
中断向量表重映射,映射到0x20000000的位置
*/
uint32_t my_vectors[48] __attribute__((at(0x20000000)));
void NMI_Handler()
{
    (*(void(*)(void))my_vectors[2])();
}
void HardFault_Handler()
{
    //(*(void(*)(void))my_vectors[3])();
}
void SVC_Handler()
{
    (*(void(*)(void))my_vectors[11])();
}
void PendSV_Handler()
{
    (*(void(*)(void))my_vectors[14])();
}

。。。。

这样,所有的中断回调函数全都会去调用my_vectors这个数组的内容的地址位置。我们把这个数组的地址定义到Boot程序和应用程序都能调用到的RAM区域,当然,这个地址要保护起来(Boot程序和应用程序都不会使用该地址)。然后我们在boot里将从0x00000000-0x000000c0的内容(向量表)拷贝到my_vectors数组中,这样就完成了boot向量表的拷贝。当程序在Boot区执行完成后,要跳转到应用程序之前,将应用程序的前0xc0的内容拷贝到my_vectors数组中,这样也就完成了应用程序的向量表重定义。这样,每次在执行boot程序的时候,执行的是boot的中断回调函数,而执行应用程序的时候,执行的是应用程序的中断回调函数。

起始,方法还有很多,这个只是其中的一种而已。欢迎留言评论,如果有说的不对的地方,也欢迎大佬指正。

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26226375/article/details/100080998

智能推荐

今天给大家介绍一下华为智选手机与华为手机的区别_华为智选手机和华为手机的区别-程序员宅基地

文章浏览阅读1.4k次。其中,成都鼎桥通信技术有限公司是一家专业从事移动通讯终端产品研发和生产的高科技企业,其发布的TD Tech M40也是华为智选手机系列中的重要代表之一。华为智选手机是由华为品牌方与其他公司合作推出的手机产品,虽然其机身上没有“华为”标识,但是其品质和技术水平都是由华为来保证的。总之,华为智选手机是由华为品牌方和其他公司合作推出的手机产品,虽然外观上没有“华为”标识,但其品质和技术水平都是由华为来保证的。华为智选手机采用了多种处理器品牌,以满足不同用户的需求,同时也可以享受到华为全国联保的服务。_华为智选手机和华为手机的区别

c++求n个数中的最大值_n个数中最大的那个数在哪里?输出其位置,若有多个最大数则都要输出。-程序员宅基地

文章浏览阅读7.6k次,点赞6次,收藏17次。目录题目描述输入输出代码打擂法数组排序任意输入n个整数,把它们的最大值求出来.输入只有一行,包括一个整数n(1_n个数中最大的那个数在哪里?输出其位置,若有多个最大数则都要输出。

python overflowerror_python – 是否真的引发了OverflowError?-程序员宅基地

文章浏览阅读520次。Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34)[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> float(1...

详解SwiftUI数据流是怎么在View间传递的_ios 怎么把swiftui事件传到uiview里-程序员宅基地

文章浏览阅读1.9k次。作为一个声明式的UI框架,SwiftUI帮我们处理了几乎所有关于UI和数据之间的交互,这使我们不再需要关注数据变化时刷新UI和用户交互以后更新数据的逻辑。为了实现数据和UI的绑定,我们需要利用Swift的一些关属性包装器来向SwiftUI描述它们之间的关系,那么让我们开始吧。到公众号【iOS开发栈】学习更多SwiftUI、iOS开发相关内容。State Properties @State在前面的一篇文章中当我们给数组添加或者删除元素时,列表会自动响应变化,正是因为使用了@State._ios 怎么把swiftui事件传到uiview里

1-8 linux系统中的软件管理-程序员宅基地

文章浏览阅读99次。#### 1.Linux中软件包的类型 ####1.DEB#UBlinux DEBlinux2.RPM #redhat centOS fadora3.bz2|gz|xz#1.需要源码安装需要编译 #2.绿色软件,直接可用 #ntfs-3g_ntfsprogs-2017.3.23.tgz需要编译 "configur...

基于动态用户偏好和服务质量的推荐算法-程序员宅基地

文章浏览阅读4.9k次。引用:Zhang Y, Qian Y, Wang Y. A RecommendationAlgorithm Based on Dynamic User Preference and Service Quality[C]//2018 IEEEInternational Conference on Web Services (ICWS). IEEE, 2018: 91-98.摘要:在服务计算领域...

随便推点

Android面试官,面试时总喜欢挖基础坑,整理了26道面试题牢固你基础!(3)-程序员宅基地

文章浏览阅读795次,点赞20次,收藏15次。AIDL是使用bind机制来工作。java原生参数Stringparcelablelist & map 元素 需要支持AIDL其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

机器学习-数学基础02补充_李孟_新浪博客-程序员宅基地

文章浏览阅读248次。承接:数据基础02

短沟道效应 & 窄宽度效应 short channel effects & narrow width effects-程序员宅基地

文章浏览阅读2.8w次,点赞14次,收藏88次。文章目录1. 概念:Narrow Width Effect: 窄宽度效应Short Channel effects:短沟道效应阈值电压 (Threshold voltage)2. 阈值电压与沟道长和沟道宽的关系:Narrow channel 窄沟的分析Short channel 短沟的分析1. 概念:Narrow Width Effect: 窄宽度效应在CMOS器件工艺中,器件的阈值电压Vth 随着沟道宽度的变窄而增大,即窄宽度效应;目前,由于浅沟道隔离工艺的应用,器件的阈值电压 Vth 随着沟道宽度_短沟道效应

小米组织架构再调整,王川调职,雷军自任中国区总裁_小米更换硬件负责人-程序员宅基地

文章浏览阅读335次。5月17日,小米集团再发组织架构调整及任命通知。新通知主要内容为前小米中国区负责人王川调职,雷军自任中国区总裁。小米频繁调整背后,雷军有些着急了中国区手机业务持续下滑。根据IDC最近公布的数据,小米一季度全球出货量为2750万台,相比去年同期的2780万台,小幅下降。参考Canalys、Counterpoint的统计,小米一季度出货量也都录得1%的同比下滑。作为对比,IDC数据显示,华为同期出..._小米更换硬件负责人

JAVA基础学习大全(笔记)_java学习笔记word-程序员宅基地

文章浏览阅读9.1w次。JAVASE和JAVAEE的区别JDK的安装路径[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-perPRPgq-1608641067105)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201222001641906.png)]卸载和安装JDK[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYnXvbAn-1608641067107)(C:\Users_java学习笔记word

vue-echarts饼图/柱状图点击事件_echarts 饼图点击事件-程序员宅基地

文章浏览阅读7.8k次,点赞2次,收藏17次。在实际的项目开发中,我们通常会用到Echarts来对数据进行展示,有时候需要用到Echarts的点击事件,增加系统的交互性,一般是点击Echarts图像的具体项来跳转路由并携带参数,当然也可以根据具体需求来做其他的业务逻辑。下面就Echarts图表的点击事件进行实现,文章省略了Echarts图的html代码,构建过程,option,适用的表格有饼图、柱状图、折线图。如果在实现过程中,遇到困难或者有说明好的建议,欢迎留言提问。_echarts 饼图点击事件

推荐文章

热门文章

相关标签