野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11008|回复: 7

关于《STM32库开发实战指南》中SysTick中断优先级的疑问

[复制链接]
发表于 2015-8-7 23:56:07 | 显示全部楼层 |阅读模式
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */

}这个是systick的配置函数,查看了SysTick_IRQn为-1,NVIC_PRIO_BITS为4,请问大家,经过下面这个函数后,优先级到底是什么?应该是比所有的外设的中断优先级都要高吧(SysTick_IRQn为-1,负数!)


static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
  if(IRQn < 0) {
    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
  else {
    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
}这个是设置systick中断的库函数

回复

使用道具 举报

发表于 2015-8-8 09:15:57 | 显示全部楼层
是的,默认的是比所有外设的优先级都高
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-17 22:32:06 | 显示全部楼层
前段时间网页打不开,还以为是关闭了,现在终于可以打开了,可以再向大家学习了!
谢谢楼上兄弟!
回复 支持 反对

使用道具 举报

发表于 2015-11-18 08:43:14 | 显示全部楼层
RAYINGPX 发表于 2015-11-17 22:32
前段时间网页打不开,还以为是关闭了,现在终于可以打开了,可以再向大家学习了!
谢谢楼上兄弟!

前段时间论坛重新审核,现在可以了
回复 支持 反对

使用道具 举报

发表于 2016-6-1 10:17:23 | 显示全部楼层
flyleaf 发表于 2015-8-8 09:15
是的,默认的是比所有外设的优先级都高

那我在按键外部中断服务函数里用滴答时钟做的延时函数处理按键抖动,把按键的抢占优先级设为0,然后就死那了,除非把按键优先级改为1就没有问题,滴答时钟的优先级不是最高吗?请问这是什么原因啊?谢谢
回复 支持 反对

使用道具 举报

发表于 2016-6-4 23:39:17 | 显示全部楼层
haijingling1981 发表于 2016-6-1 10:17
那我在按键外部中断服务函数里用滴答时钟做的延时函数处理按键抖动,把按键的抢占优先级设为0,然后就死 ...

systick时钟不配置的话默认最低优先级
在systick配置中加一段  NVIC_SetPriority(SysTick_IRQn, 0x0); 应该就好了。
回复 支持 反对

使用道具 举报

发表于 2016-6-5 01:22:04 | 显示全部楼层
    /* 01.NVIC_SetPriority(SysTick_IRQn, n);   */
    /* 02.n=0x00~0x03 设置Systick为抢占优先级0 */
    /* 03.n=0x04~0x07 设置Systick为抢占优先级1 */
    /* 04.n=0x08~0x0B 设置Systick为抢占优先级2 */
    /* 05.n=0x0C~0x0F 设置Systick为抢占优先级3 */   
回复 支持 反对

使用道具 举报

发表于 2016-6-5 09:22:01 | 显示全部楼层
搞基小队队长 发表于 2016-6-4 23:39
systick时钟不配置的话默认最低优先级
在systick配置中加一段  NVIC_SetPriority(SysTick_IRQn, 0x0);  ...

加了,也不行,我已经把滴答时钟调整到最高级了
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-27 07:23 , Processed in 0.033299 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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