OpenEdv-开源电子网

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

大家看看官方库的这句是不是有点小问题

[复制链接]

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-4-15 13:15:12 | 显示全部楼层 |阅读模式
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
  /* Check the parameters */
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));  
   
  SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}

上面的 0x1fffff80,是用来清零 bit0 到 bit6的,以及 bit 29, bit 30, bit31

而programming manual 是这样说的


仔细看看发现手册上的说明也有点问题,图上是 bits 8:0 为reserved,而下面写的是 Bit10:0 是reserved。。。

在STM32上, 128 words 是 128 *4 个字节 (注意这个和8086汇编时一个word是2个字节不同)

128*4 == 0b 10 0000 0000 ,所以按照上面说的, Bit8:0 应该一直是0

所以程序里面的这句话

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

应该是

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

不知我的理解对不?

貌似我这样有点钻牛角尖啊。。。其实一般情况下使用这个函数都不会出现问题,因为第二个参数offset基本上是0。

https://github.com/roxma
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-15 16:38:41 | 显示全部楼层
我记得当时推算过.这个 应该是没有错误的.确实是0X1FFFF80.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2012-4-15 21:04:56 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------

不理解,

怎么推算的?

按照文档上的说明,应该是 ( Bit(28) | Bit(27) | ... | Bit(9)) == 0x1FFFFE00

代码里的 0x1FFFFF80 要怎么解释?
https://github.com/roxma
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

限制会员

积分
-106
金钱
-106
注册时间
2012-3-31
在线时间
0 小时
发表于 2012-4-15 23:01:37 | 显示全部楼层
发现过同样的问题,但0x1FFFFF80是可以执行的,也就是说地址STM32实际也是以32word取齐
一种解释是,代码是由ARM发布的CMSIS定义,与ST文档可能有出入(同样的出入也确实发现过,编程手册第4版订正了NVIC的地址偏移问题)
建议使用8:0bit偏移,即0x1FFFFE00,因为一是芯片定义向量数大于32,有可能会有潜在错误,并且9bit可以兼容7bit
http://sites.google.com/site/btvnlue/stm32
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2012-4-15 23:30:36 | 显示全部楼层
嗯,谢谢楼上指点
https://github.com/roxma
回复 支持 反对

使用道具 举报

6

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2013-6-20
在线时间
7 小时
发表于 2013-6-20 23:40:04 | 显示全部楼层
回复【4楼】btvnlue:

发现过同样的问题,但0x1FFFFF80是可以执行的,也就是说地址STM32实际也是以32word取齐
一种解释是,代码是由ARM发布的CMSIS定义,与ST文档可能有出入(同样的出入也确实发现过,编程手册第4版订正了NVIC的地址偏移问题)
建议使用8:0bit偏移,即0x1FFFFE00,因为一是芯片定义向量数大于32,有可能会有潜在错误,并且9bit可以兼容7bit

---------------------------------
请问,为什么0x1FFFFF80是可以执行的,就说STM32实际也是32word取齐?还有芯片定义向量大于32,有可能存在错误?为什么?
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-21 09:03:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2013-6-22 09:24:18 | 显示全部楼层
回复【7楼】 xouou_53320 :
---------------------------------
上面的红字是我特地注明的而不是什么失误,the definite guide to cortex-m3 里面一直都是把 word 当32位用的,16位是halfword,STM32F10xxx Cortex-M3 programming manual里面也是这么用的,有疑问可以自行查阅。word 本来就应该与机器相关的。计算机的指标里面有一个字长,Word_size 的定义就是和机器相关的,从这里也可以看出这一点。至于8086汇编语言里为什么把WORD固定为16位是intel公司的问题。
https://github.com/roxma
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-22 09:54:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 14:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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