OpenEdv-开源电子网

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

usart实验 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);这句不加也能中断

[复制链接]

38

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-7-12
在线时间
0 小时
发表于 2011-11-21 21:29:20 | 显示全部楼层 |阅读模式
 
usart实验  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);这句要加?
我没加也可以中断


而我同学写的一个实验,必须加这句,不加不会进中断,不只哪里有问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-21 21:36:35 | 显示全部楼层
回复【楼主位】天马:
---------------------------------
这句是必要的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-7-12
在线时间
0 小时
 楼主| 发表于 2011-11-21 22:01:06 | 显示全部楼层

#ifdef  VECT_TAB_RAM  
/* Set the Vector Table base location at 0x20000000 */ 
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  //向量表位于RAM
#else  /* VECT_TAB_FLASH  */
/* Set the Vector Table base location at 0x08000000 */ 
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //向量表位于FLASH
#endif





usart实验  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0),是不是在调试模式下要加,如果直接下载到芯片中运行就不需要加?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-21 22:46:15 | 显示全部楼层
回复【3楼】天马:
---------------------------------
都需要加的,这个你如果想做IAP/SRAM运行代码的时候,就显得十分重要了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-7-12
在线时间
0 小时
 楼主| 发表于 2011-11-22 10:03:25 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
CM3权威指南中:
8.5  中断系统设置全过程的演示 
  下面给出一个简单的例子,以演示如何建立一个外部中断。 
  1.  当系统启动后,先设置优先级组寄存器。缺省情况下使用组0(7位抢占优先级,1位亚优
先级)。 
  2. 如果需要重定位向量表,先把硬fault和NMI服务例程的入口地址写到新表项所在的地址中。  
  3.  配置向量表偏移量寄存器,使之指向新的向量表(如果有重定位的话) 
  4.  为该中断建立中断向量。因为向量表可能已经重定位了,保险起见需要先读取向量表偏移
量寄存器的值,再根据该中断在表中的位置,计算出对应的表项,再把服务例程的入口地址填写进去。如果一直使用ROM中的向量表,则无需此步骤。



  如果应用程序储存在ROM中,并且不需要改变异常服务程序,则我们可以把整个向量表编码到
ROM的起始区域(从0地址开始的那段)。在这种情况下,向量表的偏移量将一直为0,并且中断向量
一直在ROM中,因此上例可以大大简化,只需3步: 
1.  建立优先级组 
2.  为该中断指定优先级 
3.  使能该中断 






可不可以这样理解:你不写这句,中断向量表就在FLASH的起始地址0x08000000中,如果你加上
#ifdef  VECT_TAB_RAM   
/* Set the Vector Table base location at 0x20000000 */  
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  //向量表位于RAM 
#else  /* VECT_TAB_FLASH  */ 
/* Set the Vector Table base location at 0x08000000 */  
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //向量表位于FLASH 
#endif 



就可以在flash中的其他地址放中断向量表或在RAM中使用向量表

 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-22 10:44:01 | 显示全部楼层
回复【5楼】天马:
---------------------------------
关键是后面的参数。
例如:
/* Set the Vector Table base location at 0x08000000 */   
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //向量表位于FLASH  

这个0X0,就是偏移了。如果你的程序是从0X08001000开始的,那么这个就应该设置为:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x1000);   //向量表位于FLASH  
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 13:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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