OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 85016|回复: 43

NVIC的向量表偏移寄存器设置问题(已解决)

  [复制链接]

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2011-1-13
在线时间
0 小时
发表于 2011-3-9 14:46:00 | 显示全部楼层 |阅读模式
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset) 
{
   //检查参数合法性
 assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
 assert_param(IS_NVIC_OFFSET(Offset));   
 SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
 //用于标识向量表是在CODE区还是在RAM区
}

问个问题,为什么(Offset & (u32)0x1FFFFF80)  为什么使用0x1FFFFF80,0x1FFFFF80是怎样得来的呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2011-7-22
在线时间
0 小时
发表于 2011-7-23 14:41:14 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
回复【9楼】kenluo:
---------------------------------
我觉得原子大哥的"&0X1FFF FE00"更确切一些。
原因如下:
在 "ARMv7-M Architecture Application Level Reference Manual(November 2010)" 的716页给出的VTOR定义为:
[31:7]——Bits [31:7] of the vector table address
[6:0]  ——Reserved.
(这里不是[29:7]的原因在 "Cortex-M3 Technical Reference Manual.r2p1" 的24页"The Vector Table Offset Register located at address 0xE000ED08 has been increased by two bits from 29:7 to 31:7",也就是r2p1版本升级扩展了两位,不过仍然向后兼容:"One or two of the high-order bits of the TBLOFF field can be implemented as 
RAZ/WI, reducing the supported address range. For example, if two bits are implemented as RAZ/WI, then TBLOFF[29:7] defines bits [29:7] of the address")

也就是说ARM官方r2p0的定义:[31:30]保留,[29]作为TBLBASE判别标准屏蔽,[6:0]保留,如此一来得到&0X1FFF_FF80;

而对于ST官方的定制而言,在"PM0056 rogramming manual Rev4"的134页 给出的定制为:
"[31:30] Reserved, must be kept cleared"
"TBLOFF[29:9]: Vector table base offset field"
"Bits 8:0Reserved, must be kept cleared"
也就是说ST把[8:7]也给保留了,原因就是楼上kenluo所说的。
这种情况下按ST官方的定制::[31:30]保留,[29]作为TBLBASE判别标准屏蔽,[8:0]保留,如此一来得到&0X1FFF_FE00,就是原子大哥的解释。

我学STM32的过程中觉得看手册一点很重要,就是区分各个官方手册的等级:
"ARMv7-M Architecture Application Level Reference Manual(November 2010)" (ARM官方发布) 这是理论框架,涵盖范围最广..........(I)
"Cortex-M3 Technical Reference Manual.r2p1" (ARM官方发布) 这是技术构架,涵盖范围次之.........................................................(II)
"PM0056 rogramming manual Rev4" & "Reference manual_Rev13"(ST官方发布)这是产品实现,范围最小,定位到特定系列产品.....(III)

以一个例子为例:
(I)中理论框架支持多大496个外部中断
(II)中技术构架240个外部中断
(III)中产品实现68个外部中断(互联型)
回复 支持 5 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-10 10:12:11 | 显示全部楼层
     在<<权威指南>>第一百零四页,有这么一段话:
    NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址0xE000_ED08 处),通过修改它的值就能定位向量表。但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上增大到是2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有32 个中断,则共有32+16(系统异常)=48 个向量,向上增大到2 的整次幂后值为64,因此地址
地址必须能被64*4=256 整除,从而合法的起始地址可以是:0x0, 0x100, 0x200 等。
    向量表偏移量寄存器,也就是SCB->VTOR.它的第29位,用来标识向量表是在CODE区还是RAM区,从而0X1,就是最高3位不去动,这好理解.   但是低位,根据上面这段话的理解,STM32自己有60个中断,加上CM3的16个,总共有76个中断,扩大到2的整次幂,那就是128,然后再乘以4,得到512,也就是0X200.根据这样计算,合法的偏移地址应该是0X0,0X200,0X400,0X600... 因此,在此处应该&0X1FFF FE00.才对.
    以上是我的理解.实际上确是&0X1FFF FF80;这点,我也有疑问.
    

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2011-1-13
在线时间
0 小时
 楼主| 发表于 2011-3-10 12:37:08 | 显示全部楼层
感谢原子的细心回答,其它网友有没有其它的理解呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-10 13:39:46 | 显示全部楼层
回复【3楼】kenluo:
-------------------------------
没看到....你找到答案了,告诉我一下,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2011-1-13
在线时间
0 小时
 楼主| 发表于 2011-3-10 15:05:28 | 显示全部楼层
cortex-m3权威指南上介绍 bit 28-7为向量表的起始地址,位29决定向量表在code区还是在ram区
是不是和这个有关?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-10 16:17:24 | 显示全部楼层
回复【5楼】kenluo:
-------------------------------
你在哪里看到这个的?多少页?
我怎么找不到呢...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2011-1-13
在线时间
0 小时
 楼主| 发表于 2011-3-10 19:15:55 | 显示全部楼层
Since the address 0x0 should be boot code, usually it will either be Flash memory or ROM
devices, and the value cannot be changed at run time. However, the vector table can be
relocated to other memory locations in the Code or RAM region where the RAM is so that we
can change the handlers during run time. This is done by setting a register in the NVIC called
the vector table offset register (address 0xE000ED08). The address offset should be aligned
to the vector table size, extended to the power of 2. For example, if there are 32 IRQ inputs,
the total number of exceptions will be 32  16 (system exceptions)  48. Extending it to the
power of 2 makes it 64. Multiplying it by 4 makes it 256 (0x100). Therefore, the vector table
offset can be programmed as 0x0, 0x100, 0x200, and so on. The vector table offset register
contains the items shown in Table 7.7.
In applications where you want to allow dynamic changing of exception handlers, in the
beginning of the boot image you need to have these (at a minimum):
? Initial Main Stack ointer value
? Reset vector
Figure 7.8 Defi nition of riority Fields in an 8-bit riority Level Register with riority
Group Set to 0
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Preempt priority Subpriority
Address Exception Number Value (Word Size)
0x00000000 – MSP initial value
0x00000004 1 Reset vector (program counter initial value)
0x00000008 2 NMI handler starting address
0x0000000C 3 Hard fault handler starting address
… … Other handler starting address
Table 7.6 Exception Vector Table After ower Up
Bits Name Type Reset Value Description
29 TBLBASE R/W 0 Table base in Code (0) or RAM (1)
28:7 TBLOFF R/W 0 Table offset value from Code region or RAM region

今天看到你的解释之后,看了一下英文版123页
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2011-1-13
在线时间
0 小时
 楼主| 发表于 2011-3-10 19:18:36 | 显示全部楼层
论坛贴不了图片呢?
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2011-1-13
在线时间
0 小时
 楼主| 发表于 2011-3-10 19:25:51 | 显示全部楼层
按上面的算法,好像也挺对的,Offset&0X1FFF FF80

Offset:是偏移量的计算

也就是说STM32自己有60个中断,加上CM3的16个,总共有76个中断,扩大到2的整次幂,那就是128,然后再乘以4,得到512,也就是0X200.根据这样计算,合法的偏移地址应该是0X0,0X200,0X400,0X600,0x800......


29 TBLBASE R/W 0 Table base in Code (0) or RAM (1) 
28:7 TBLOFF R/W 0 Table offset value from Code region or RAM region 

屏蔽前七位0x1FFFFF80和后三位+Offset + VECTTOR就是开始地址

不知道我的理解对不对?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-10 20:23:23 | 显示全部楼层
回复【8楼】kenluo:
-------------------------------
论坛可以贴图啊....
你点击回复文章,里面有很多编辑工具,有个图片的图标...可以贴图的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-10 20:53:06 | 显示全部楼层
回复【9楼】kenluo:
-------------------------------
这就对了。
原来低7位没有用到,所以&0X80。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
发表于 2012-1-30 14:38:15 | 显示全部楼层
Hi,不明白啊。为什么不是  0X1FFF FE00呢,再介绍下好吗?谢谢。

回复【11楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-1-30 20:23:45 | 显示全部楼层
回复【13楼】gz_ddc:
---------------------------------
因为向量便宜是以0X100为最小便宜的.
也就是只能0,0x100,0x200,0x300....以此类推.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
发表于 2012-1-30 21:38:55 | 显示全部楼层
如果是103RBT6 cpu,那我写成 0X1FFFFE00 会出错吗?
另外,如果是0x100,那么意味着STM32的中断数+16个系统异常中断数<=64是吗?  STM32各系列中是有一款的中断数少于等于48( 64-16 )的吗?
谢谢。


回复【14楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-1-30 22:25:51 | 显示全部楼层
回复【15楼】gz_ddc:
---------------------------------
会不会出错,自己测试一下就知道了.
至于为什么是100,貌似在CM3权威指南说了,你看看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2012-3-8
在线时间
0 小时
发表于 2012-3-8 14:06:25 | 显示全部楼层
回复【11楼】正点原子:

---------------------------------
为什么“低7位没有用到,所以&0X80”啊。谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-8 14:57:31 | 显示全部楼层
清零.
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-4-24
在线时间
6 小时
发表于 2012-10-27 10:49:38 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
VTOR寄存器定义:第29位TBLOFF—向量表是在Code区(0)还是在RAM区(1),第7—28位TBLBASE向量表的起始地址,函数NVIC_SetVectorTable定义如下:
void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)

  /* Check the parameters */
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));  
   
  SCB->VTOR = NVIC_VectTab | (Offset & (u32)0x1FFFFF80);
0x1FFFFF80——表示7—29位全为1,先与向量表基地址的偏移量Offset与,然后再和NVIC_VectTab相或,
合法的起始地址可以是:0x0, 0x100, 0x200 ,这个地址是有向量表基地址的偏移量Offset 来确定的,所以Offset 可以是0x0,0x100,0x200,0x300等,但必须是256的倍数。

}
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-9-1
在线时间
3 小时
发表于 2013-9-22 15:52:07 | 显示全部楼层
无。。。。
回复 支持 反对

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-7-18
在线时间
0 小时
发表于 2014-2-19 21:31:34 | 显示全部楼层
回复【9楼】kenluo:
---------------------------------
这么多的回答我觉得你的答案是做合理的
回复 支持 反对

使用道具 举报

62

主题

203

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-11-15
在线时间
86 小时
发表于 2014-3-17 10:29:55 | 显示全部楼层
回复【7楼】kenluo:
---------------------------------
可否给个英文版的权威手册。。。。。。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-1-16
在线时间
0 小时
发表于 2015-4-28 21:34:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
请问,偏移量为0x100能理解,偏移量为0x0怎么行啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-28 22:24:10 | 显示全部楼层
回复【23楼】哈根斯坦:
---------------------------------
0就是不偏移
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-1-16
在线时间
0 小时
发表于 2015-4-29 20:19:05 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
谢谢,我还想问一下,为什么非要满足按这种方式偏移,以32个中断为例,只要满足偏移后余下的空间能装得下0x100大小的向量表不就行了吗?那样的话随便偏移某个数比如0x1不可以吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-29 23:16:56 | 显示全部楼层
回复【25楼】哈根斯坦:
---------------------------------
看《CM3权威指南》
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2016-3-22 15:38:27 | 显示全部楼层
正点原子 发表于 2011-3-10 20:53
回复【9楼】kenluo:
-------------------------------
这就对了。
原来低7位没有用到,所以&0X80。

讲解的很详细,赞一个,对写IAP有很大帮助
合肥-文盲
回复 支持 反对

使用道具 举报

15

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-8-8
在线时间
34 小时
发表于 2016-10-24 17:29:16 | 显示全部楼层
正点原子 发表于 2011-3-10 10:12
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&lt;&lt;权威指南&gt;&gt;第一百零四页,有这么一段话:
&nbsp;&nbsp;&nbsp;&n ...

原子哥  这个里面乘以4,是什么意思
回复 支持 反对

使用道具 举报

15

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-8-8
在线时间
34 小时
发表于 2016-10-24 17:31:10 | 显示全部楼层
在<<权威指南>>第一百零四页,有这么一段话:
    NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址0xE000_ED08 处),通过修改它的值就能定位向量表。但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上增大到是2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有32 个中断,则共有32+16(系统异常)=48 个向量,向上增大到2 的整次幂后值为64,因此地址
地址必须能被64*4=256 整除,从而合法的起始地址可以是:0x0, 0x100, 0x200 等。
    向量表偏移量寄存器,也就是SCB->VTOR.它的第29位,用来标识向量表是在CODE区还是RAM区,从而0X1,就是最高3位不去动,这好理解.   但是低位,根据上面这段话的理解,STM32自己有60个中断,加上CM3的16个,总共有76个中断,扩大到2的整次幂,那就是128,然后再乘以4,得到512,也就是0X200.根据这样计算,合法的偏移地址应该是0X0,0X200,0X400,0X600... 因此,在此处应该&0X1FFF FE00.才对.
   这个里面为什么要乘以4 啊?
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-11-16
在线时间
44 小时
发表于 2016-12-5 16:23:15 | 显示全部楼层
正点原子 发表于 2011-3-10 10:12
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&lt;&lt;权威指南&gt;&gt;第一百零四页,有这么一段话:
&nbsp;&nbsp;&nbsp;&n ...

我看你的头像,看了半天。
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-7-5
在线时间
1 小时
发表于 2017-4-26 19:01:18 | 显示全部楼层
正点原子 发表于 2011-3-10 10:12
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&lt;&lt;权威指南&gt;&gt;第一百零四页,有这么一段话:
&nbsp;&nbsp;&nbsp;&n ...

为什么要扩大到2整数次幂?????
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-12-18
在线时间
34 小时
发表于 2017-7-7 13:34:53 | 显示全部楼层
看了上边的回复,我理解的意思是:
向量表偏移量寄存器,也就是SCB->VTOR:31位,30位保留,它的第29位,用来标识向量表是在CODE区还是RAM区,从而0X1,就是最高3位不去动,0-6位为保留位需要清零,所以要同0x1FFFFF80(0001 1111 1111 1111 1111 1111 1000 0000)与(&),保证最高3位,和低7位为0;中间7-28位是地址偏移,这个地址有个要求:(必须先求出系统中共有多少个向量,再把这个数字向上增大到是2 的整次幂,而起始地址必须对齐到后者的边界上。如:STM32自己有60个中断,加上CM3的16个,总共有76个中断,扩大到2的整次幂,那就是128,然后再乘以4,得到512,也就是0X200.根据这样计算,合法的偏移地址应该是0X0,0X200,0X400,0X600... )。

PS:
1.地址偏移的要求是用户在设定时需要另外考虑的(比如上例中,设定的地址需要是0X200的倍数),跟&0x1FFFFF80没有关系;
2.关于为什么乘以4,应该是每个32位的地址占四个字节吧。
3.要保证整除0x200就要去掉小于0x200的余数,所以&0X1FFF FE00后就能保证得出的数可以整除0x200。

楼主帮忙看看你们要表达的是不是这个意思。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2017-9-17
在线时间
19 小时
发表于 2017-10-30 09:12:51 | 显示全部楼层
刘飞月 发表于 2016-10-24 17:31
在第一百零四页,有这么一段话:
    NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址0xE000_ED08 ...

权威指南里说每个向量占4个字节
微信图片_20171030091050.png
回复 支持 反对

使用道具 举报

39

主题

234

帖子

0

精华

高级会员

Rank: 4

积分
630
金钱
630
注册时间
2016-8-25
在线时间
57 小时
发表于 2018-1-11 10:13:59 | 显示全部楼层
都是大牛  ,赞一个
回复 支持 反对

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-6-29 10:57:56 | 显示全部楼层
我把各位大神的回帖 整理总结了一下.
https://blog.csdn.net/justsure91/article/details/80852623
不知道对不对.有误请指正.
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-6-25
在线时间
11 小时
发表于 2018-9-19 16:42:55 | 显示全部楼层
正点原子 发表于 2015-4-29 23:16
回复【25楼】哈根斯坦:
---------------------------------
看《CM3权威指南》

在学习IAP编程时候对于APP程序执行中断时候有一点疑问
在图中的圈4步骤     APP程序发生中断时候调到原始中断表




点我在看M3权威指南时候有个关于建立新中断向量表的内容




我的理解是  对于一个APP程序  它的中断服务函数的入口地址在编译之后是固定的      不一样的是要将这个入口地址填入到中断向量表的对应位置   

既然是APP程序  那么它的中断向量表位置相对BootLoader程序有一个偏移地址    称之为新中断向量表    那么现在的问题就是将APP的中断服务函数入口地址填入的新中断向量表中  

这个时候  就需要更具中断向量表的偏移地址来计算      首先算出新表的起始地址    在计算新表中的第几项   确定之后将地址填入   

按照这个过程  APP程序发生中断时候要找中断向量只能去新表中找   而在旧表中是找不到的     所以图中的圈4应该直线灰色的新中断表   


如果去旧表中去找  那移位着BootLoader程序的中断向量被APP程序覆盖    那么BootLoader程序只能执行一次   下册执行会出错

图片1.png
C38849F3-CE97-4fab-B415-BDFCC1DE6F70.png
image.png
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2017-1-22
在线时间
12 小时
发表于 2018-12-28 18:47:18 | 显示全部楼层
本帖最后由 henu321 于 2018-12-28 18:55 编辑
正点原子 发表于 2011-3-10 10:12
     在<<权威指南>>第一百零四页,有这么一段话:
   &n ...

原子哥,请教一下,M3手册中说的"NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址 0xE000_ED08 处),通过修改它的值就能定位向量表。"是指设置SCB->VTOR后新的向量表的内容会拷贝至初始向量表中吗?因为根据中断机制,仍然读的是0x80000000开始向量表中的值,初始向量表内容如果不改了话岂不是仍然跳不到新程序中吗?但是如果是是这样的话又意味着BootLoader只能升级一次,也不对,所以请给解释下这个中断返回初始向量表后怎么实现跳转到新的程序中断的!
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-8-8
在线时间
11 小时
发表于 2019-1-3 17:53:49 | 显示全部楼层
感谢感谢
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1077
金钱
1077
注册时间
2019-1-16
在线时间
240 小时
发表于 2019-6-14 09:20:58 | 显示全部楼层
本帖最后由 jcontheroad 于 2019-6-18 15:16 编辑

向大牛学习,学习Cortex_M3权威指南。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-11-16
在线时间
5 小时
发表于 2020-4-10 09:59:23 | 显示全部楼层
最近看到的,感觉这个节式比较合理,最少有一个中断,所以(1+16)*4=68,2的倍数对齐,最少就是128字节,所以保留低七位

最近看到的

最近看到的
回复 支持 反对

使用道具 举报

18

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2019-5-24
在线时间
73 小时
发表于 2020-8-10 09:44:52 | 显示全部楼层
Feady 发表于 2020-4-10 09:59
最近看到的,感觉这个节式比较合理,最少有一个中断,所以(1+16)*4=68,2的倍数对齐,最少就是128字节, ...

你好,请问这是哪本资料
回复 支持 反对

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2020-9-24
在线时间
34 小时
发表于 2020-12-5 16:27:04 | 显示全部楼层
森海有眼泉 发表于 2018-6-29 10:57
我把各位大神的回帖 整理总结了一下.
https://blog.csdn.net/justsure91/article/details/80852623
不知 ...

为什么网址是404.。。
回复 支持 反对

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2021-4-1 11:32:21 | 显示全部楼层
向量表偏移量寄存器,有什么用啊,感觉下完flash程序,还是执行之后,摁了复位,结果又跑回bootloader程序了
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2021-4-9 10:01:36 | 显示全部楼层
正点原子 发表于 2011-3-10 20:53
回复【9楼】kenluo:
-------------------------------
这就对了。
原来低7位没有用到,所以&0X80。

很彻底的解决了大家的疑惑
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 08:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表