OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 263|回复: 3

SysTick的中断优先级设置

[复制链接]

  离线 

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-7-4 11:35:05 | 显示全部楼层 |阅读模式
有时候想用SysTick的中断来做一些事情,但又不知道怎么去设置它的优先级,目前了解了一下,SysTick优先级的设置和其他优先级的设置方式是不一样的。默认情况下,SysTick的优先级是很低的,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1<<4-1 = 15,这里面的4是因为STM32 使用4个位来配置中断优先级。我们看外设配置的中断优先级时的优先级分组,如果分组为 2,那抢占优先级和子优先级各有2个位表示优先级,抢占的取值范围为0~3,子优先级的取值范围为:0~3。那这时systick的优先级15,只需要把15转换成二进制:1111,这四位同样受优先级分组的控制,即前两位表示抢占优先级,那就是3,后两位表示子优先级,也是3。在分组2里面都是最低的。如果你的外设也配置成组2,主和子优先级配置的不是3,那就肯定比systick的优先级高。一般我们用原子哥的程序中,一开始是先做中断的优先级分组,然后对时钟初始化,就是delay_init(),那我们对SysTick的优先级设置也在里面,只需要SysTick->LOAD=reload;NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);即可,至于要设置SysTick的优先级大小,就把-1改成-x,然后算出大小就可以了。
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
发表于 2018-7-12 13:10:37 | 显示全部楼层
如果没有优先级分组,那默认是按照什么来分组的呢?
回复 支持 反对

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
发表于 2018-7-12 13:51:02 | 显示全部楼层
hougeqvjing 发表于 2018-7-12 13:10
如果没有优先级分组,那默认是按照什么来分组的呢?

优先级的分组应该是按照SCB_AIRCR中的PRIGROUP来的。也就是说可配置的系统异常中断和其他外设中断共用一个分组。在配置systick时,因为没有设置分组,所以为默认分组状态,然后根据写入到systick的优先级按位分配为抢占优先级和响应优先级。
回复 支持 反对

使用道具 举报

  离线 

24

主题

1172

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1947
金钱
1947
注册时间
2018-5-11
在线时间
368 小时
发表于 2018-7-12 19:46:35 | 显示全部楼层
hougeqvjing 发表于 2018-7-12 13:51
优先级的分组应该是按照SCB_AIRCR中的PRIGROUP来的。也就是说可配置的系统异常中断和其他外设中断共用一 ...

楼上已经解析得很清楚了,
用户还没有设置分组,
但系统默认已经把它优先级的4BIT设置成1111
这样,用户后面再无论怎样设置分组,它的优先级都是最低的。
不过,
如果想提高的话,你可以自己改的。
https://github.com/ShuifaHe/STM32.git
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

必看,必学:"原子哥”力荐上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-9-21 11:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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