OpenEdv-开源电子网

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

关于STM32 系统内部异常 和 外部中断关系的疑问?

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-12-16
在线时间
6 小时
发表于 2014-4-5 18:17:25 | 显示全部楼层 |阅读模式
M3内核有16个系统异常,240个外部中断,而实际STM32中只用到部分资源。。。
在 M3权威指南中说道  所有的外部中断有配备有一个8位的优先级寄存器(分为主优先级和响应优先级),并且单独的为系统异常开辟优先级寄存器(好像没有主优先级响应优先级之分?),那么,系统异常和外部中断哪个更高?
比如,定时器中断(属于外部中断范围),SysTick定时器异常(系统内部异常),还有PendSV异常(系统内部异常)。。。
权威指南说 把PendSV 编程为最低优先级的异常(第7章,P123),是相对于所有的异常中断都最低?还是只针对系统异常最低?
还有,我们在用到滴答定时器作为操作系统时钟的时候,需要进入滴答定时异常,那么,这个异常的优先级和普通定时器相比,哪个更高?
求解答?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

232

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2013-6-1
在线时间
0 小时
发表于 2014-4-5 19:27:28 | 显示全部楼层
STM32F103XXX参考手册里面的第9.1.2中断和异常向量里有一张向量表,你可以去看看。优先级就是从上到下
回复 支持 反对

使用道具 举报

20

主题

232

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2013-6-1
在线时间
0 小时
发表于 2014-4-5 19:30:22 | 显示全部楼层
还有就是你随便打开一个例程,工程Target1 下 Source Group 1文件夹里面的startup_stm32f10x_hd.s(启动文件)的第64行开始就是中断向量表,优先级从上到下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-5 19:41:29 | 显示全部楼层
除了Reset、NMI、HardFault等这三大天王,其他中断都是可编程优先级的。
而这三个则是优先于所有其他中断(也就是任何时刻,都可以打断其他中断的执行)。
你说的Systick和PendSV,都是可编程的,只是比较特殊,不和外部中断共用一个优先级设置。
默认条件下(不去设置Systick的优先级),Systick的优先级,是低于任何一个外部中断的优先级的,这个我验证过。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-4-5 22:12:46 | 显示全部楼层
回复【4楼】正点原子:
--------------------------------
站长 你觉得我这样分析对不对啊?
我在STM32F103x的编程手册上看到这个寄存器 SCB_AIRCR (P119),很明显这是一个32bit的寄存器,他的【10:9】是PRIGROUP ,在下面的解释说道通过这三位配置可以决定 RI_N【7:4】中的主优先级和辅助优先级。
显然,我查阅到System handler priority registers:SCB_SHPRx(一共有SHPR1-SHPR3四个寄存器组),看到编程手册P122页,Table 39.我们可以知道就是这个寄存器来配置系统内部异常的优先级的!其中PRI_15就是SysTick异常!
这时候,我想到了我们平时配置定时器中断不也要分组么?麽非这两个有联系? 于是我打开一个库函数版本的列程,看到这个函数”NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2:2位抢占优先级,2位响应优先级“,我果然在里面找到了这句代码  “SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;”,这说明,我们的普通外部中断优先级和系统内部异常优先级是没有区别的!都是在同一个分组下面;
现在假设我们设定分组为第二组,就是2bit 主优先级和2bit响应优先级,那么在默认情况下PRI_15复位值是0 ,那么优先级bit就是00 00,也就说SysTick异常的优先级默认是最高的!不过我看到好多都是在滴答初始化里面有NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
也就是讲PRI_15设置成 1111,也就是优先级最低的!
站长,你看我分析的有问题么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-6 00:11:33 | 显示全部楼层
回复【5楼】lc125253647:
---------------------------------
我用寄存器,没有调用NVIC_SetPriority函数,测试也是systick是最低优先级。这个又不好解释了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-4-6 10:12:12 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------请问是怎么测试的?我也试试?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-6 18:57:29 | 显示全部楼层
回复【7楼】lc125253647:
---------------------------------
你开启systick中断,然后也开启外部中断,将外部中断的优先级设置为最低,然后在systick的中断里面,触发外部中断,看看是否可以进入外部中断服务函数就可以判断了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-12 17:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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