[转载]2017年12月4日14:48:29

先描述下这几天碰到的一个奇怪的问题:

一个基于stm32的工程中使用到了IAP编程,其中boot空间预留长度为0x6100,实际boot的bin文件大小为21.1KB,具体为21633Byte.我在最开始调试时对于IAP编程的app程序直接下载到单片机中,程序工作一切正常,但是在通过boot将app更新到单片机中后程序可以进入到app中,但是程序工作不正常。

最后经过查找原因,最后在代码注释中找到了问题所在:

途中划红线的部分可以看出,NVIC_SetVectorTable函数参数中的Offset必须是0x200的倍数,但是~但是我刚刚说的那个IAP中的boot空间大小为0x6100,这个值并不是0x200的整数倍,这也就是问题所在了。

=============================分割线==============================

上面找到了问题所在,那么是不是就结束了呢?很明显没有,NVIC_SetVectorTable的函数注释中知识轻描淡写的说Offset必须是0x200的倍数,但是为什么要这样它并没有进行解释。着就是目前的新问题了。

首先查看NVIC_SetVectorTable函数的实现代码,非常简单,首先是对参数进行正确性判断,然后就是对一个寄存器进行赋值。在判断参数正确性的代码中并没有找到有关于0x200的代码,那么问题肯定就在这个寄存器赋值上了。具体代码如下:

SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);

我们关注Offset部分,它与0x1FFFFF80进行与运算,奇怪的是这个与运算的结果只能使得Offset能够0x80的整数倍,并不是0x200。如果要是0x200,那么倒推回来那么这个地方应该是0x1FFFFE00才对,难道是stm32官方的库函数有问题?!这个真是让我有点小兴奋。我隐约感觉到问题没有这么简单,决定先看看这个寄存器相关的资料在做结论,经过查看,在周立功的《CM3技术参考手册》中的讲解NVIC章节(第90页)中发现了如下的讲解:

这个地方说明VTOR寄存器的第7到28位是用来存储偏移量的,这也就能解释为什么刚才代码里面进行与运算的是0x1FFFFF80了。

但是问题还是没有解决,为什么Offset要是0x200的整数倍呢?

对于这种与CM3系统架构相关的内容,一般都是去看《Cortex-M3权威指南》,果然,最后找到了如下解释(中文版第113页):

途中划红线的部分是关键,按照它说的方法,我打开工程的启动文件,发现其中有60个普通中断,另外有16个系统中断,一起是74个中断,由于74大于2的6次方(也就是64,),所以幂向上加1也就是2的7次方,即128,然后一个地址占用四个字节,所以得出128*4=512,也就是我苦苦寻觅的0x200。

至此最初的疑问已经解决,但是在读上面划红线的文字时,一个疑问在我脑海环绕:为什么要一定为2的整数次幂,按着划红线的示例,我在flash中就花费48*4个字节给中断向量表不就挺好么。对于这个问题目前还没有发现比较好的答案,根据我个人的理解,我觉得可能是出于以下两点原因:

1 方便扩从中断向量表

解释:比如现在需要48个中断向量那我就分配它48*4个字节空间,但是以后需要49个捏?考虑到拓展性所以还是多留空间的好

2 方便编程时的FLASH擦写

解释:给出一个Offset的相对固定的值,方便程序员在编程时提高效率,试想如果设置一个非常复杂的boot长度地址,每次修改都会浪费不少时间

当然,这两点只是我个人拙见,如果各位读者谁有好的答案,还请务必指教指教我~~

stm32中关于NVIC_SetVectorTable函数使用的疑惑与理解的更多相关文章

  1. STM32 中的 assert_param 函数

    在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用. 断言机制函数assert_param我们在分析库函数的时候,几乎每一 ...

  2. stm32中的延时函数

    //粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10;  //自己定义 while(i--) ; } } //毫秒级的 ...

  3. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

  4. STM32中如何对printf函数重定向

    通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...

  5. 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...

  6. (二)STM32中中断优先级理解

    很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和 ...

  7. C语言学习及应用笔记之七:C语言中的回调函数及使用方式

    我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题.但是回调函数的理解和使用却不是一件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析. 1.什么是回调函数 ...

  8. 初识STM32中的USMART组件

    今天看了usmart那部分的模块,感觉使我们stm32的学习变更加方便,你可以通过串口查看和检验你所注册过的函数. USMART配步骤1.将USMART包添加到工程中,头文件要包括path2.添加所需 ...

  9. stm32中assert_param的用法说明

    stm32中assert_param的用法说明   首先是要知道条件判断语句 这个运算符分成三部分: (条件) ? (条件成立执行部分) :(条件不成立执行部分) 就这么简单 例如:a=(x>y ...

随机推荐

  1. 学习WEB前端是应该自学还是参加培训机构?

    先说观点,我强烈建议每个人都要自学,不要参加培训班. 我干web前端工程师这个职位已经有6年多的时间,之前在蚂蚁金服做过2年,后来离开是因为加班实在熬不住才走的,像这些已经上市的互联网公司几乎没有不加 ...

  2. Git简单操作及原理

    设置签名: ​ 用户名:tom ​ Email地址:goodMorning@atguigu.com ​ git config user.name tom_pro ​ git config user.e ...

  3. SpringBoot中的自动代码生成 - 基于Mybatis-Plus

    作者:汤圆 个人博客:javalover.cc 前言 大家好啊,我是汤圆,今天给大家带来的是<SpringBoot中的自动代码生成 - 基于Mybatis-Plus>,希望对大家有帮助,谢 ...

  4. 爬虫简介、requests 基础用法、urlretrieve()

    1. 爬虫简介 2. requests 基础用法 3. urlretrieve() 1. 爬虫简介 爬虫的定义 网络爬虫(又被称为网页蜘蛛.网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程 ...

  5. Qt获取一张图片的平均色(主色调)

    这两天在一个小工具中想做一个图标的发光效果,用固定颜色做出来效果很丑,于是想到此方法,得到图标的主色调后,将颜色调亮,并设置为阴影颜色,从而达到类似发光的效果. 本文章主要在于得到一张图片的平均色,并 ...

  6. Mybatis(一)Porxy动态代理和sql解析替换

    JDK常用核心原理 概述 在 Mybatis 中,常用的作用就是讲数据库中的表的字段映射为对象的属性,在进入Mybatis之前,原生的 JDBC 有几个步骤:导入 JDBC 驱动包,通过 Driver ...

  7. zabbix容器化安装及监控docker应用

    一.zabbix agent2 介绍 从Zabbix 4.4之后,官方推出了Zabbix Agent 2,意味着zabbix 不在只是物理机监控的代名词,现在你可以使用Go为Zabbix编写插件,来监 ...

  8. python3函数可变输入参量

    技术背景 通常我们在python中定义一个函数的时候,需要给出明确的函数输入参量,比如对于一个数学函数\(z=f(x,y)\)就表示,\(z\)是关于\(x\)和\(y\)的一个函数.但是如果对于未知 ...

  9. 在Visual Studio 中使用git——使用git管理源代码(三)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二)   第三部分:使用git管理源代码 ...

  10. 2.1.3- 体会css样式

    css初始 css样式规则 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...