野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24670|回复: 13

“滴答”定时器的中断优先级有多高啊?急急急!!!

[复制链接]
发表于 2013-7-22 22:32:55 | 显示全部楼层 |阅读模式
   我想问一下野火stm32例程里面的那个systick"滴答"定时器的中断优先级是多高啊?

我写了一个串口函数,想利用串口发送数字1,2,3分别控制3个LED灯点亮,延时一段时间后又再熄灭LED,处理LED灯的代码在串口中断处理函数USART1_IRQHandler 里面执行,这个中断函数我设定的优先级为抢占优先级1,响应优先级0。但是结果出不来,J—LINK仿真的时候到了 while(TimingDelay != 0) 这个地方就不执行下去了,貌似是死循环。我想会不会是因为“滴答”定时器的中断优先级不够高,导致在串口中断处理函数中无法进入定时器的中断处理函数,从而为死循环了。。。。求大侠解救。
工程文件截图.jpg

USER.rar

55.71 KB, 下载次数: 27

USER文件夹

回复

使用道具 举报

发表于 2013-7-22 23:03:27 | 显示全部楼层
需要设置的啊,默认是无抢占优先级的,看教程啊
回复 支持 反对

使用道具 举报

发表于 2013-7-22 23:17:23 | 显示全部楼层
默认systick优先级为6,比串口,timer之类的优先级都高。可以参考《STM32参考手册》第9章的《中断和向量表》
回复 支持 反对

使用道具 举报

发表于 2013-7-23 00:05:40 | 显示全部楼层
你把串口的中断优先级设置的太高了, Systick中断根本就进不去
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 00:09:18 | 显示全部楼层
格拉姆 发表于 2013-7-22 23:03
需要设置的啊,默认是无抢占优先级的,看教程啊

找到原因了,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 00:10:38 | 显示全部楼层
flyleaf 发表于 2013-7-22 23:17
默认systick优先级为6,比串口,timer之类的优先级都高。可以参考《STM32参考手册》第9章的《中断和向量表》 ...

谢谢,我看了手册,还真的是为 6 ,但是这个通道怎么设置啊?
NVIC_InitStructure_Systick.NVIC_IRQChannel = SysTick_;
这样对吗?这个地方不是很懂。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 00:14:00 | 显示全部楼层
似水流年、 发表于 2013-7-23 00:05
你把串口的中断优先级设置的太高了, Systick中断根本就进不去

嗯嗯,就是,那怎么办?我把Systick的优先级设高点行不行?,抢占优先级0,响应优先级0,但是我不是很会啊,
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure_Usart1;
        NVIC_InitTypeDef NVIC_InitStructure_Systick;       
        /* Configure the NVIC Preemption Priority Bits */  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
       
        /* Enable the USARTy Interrupt */
        NVIC_InitStructure_Usart1.NVIC_IRQChannel = USART1_IRQn;         
        NVIC_InitStructure_Usart1.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure_Usart1.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure_Usart1.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure_Usart1);
       
        /* Enable the Systick Interrupt */
        NVIC_InitStructure_Systick.NVIC_IRQChannel = SysTick;         
        NVIC_InitStructure_Systick.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure_Systick.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure_Systick.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure_Systick);
}
这样对吗?
回复 支持 反对

使用道具 举报

发表于 2013-7-23 08:44:52 | 显示全部楼层
rocker 发表于 2013-7-23 00:14
嗯嗯,就是,那怎么办?我把Systick的优先级设高点行不行?,抢占优先级0,响应优先级0,但是我不是很会啊 ...

不对,
    /* Enable the Systick Interrupt */
    NVIC_InitStructure_Systick.NVIC_IRQChannel = SysTick;         
这里的 NVIC_InitStructure_Systick.NVIC_IRQChannel 应该为 SysTick对应的中断通道,而不是 SysTick的内存地址,应该是 SysTick_IRQn,这个值在 stm32f10x.h中定义的有,为 -1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 09:09:36 | 显示全部楼层
似水流年、 发表于 2013-7-23 08:44
不对,
    /* Enable the Systick Interrupt */
    NVIC_InitStructure_Systick.NVIC_IRQChannel = S ...

其实也不是那样的,昨天我查过了,systick是内核中断类型,已经有库函数直接可以修改它的优先级,而且好像只能用库函数,库函数是 NVIC_SetPriority(SysTick_IRQn,n),可是我修改了以后也不行。。。在这个地方真的懵了。。。
回复 支持 反对

使用道具 举报

发表于 2013-7-23 09:43:26 | 显示全部楼层
rocker 发表于 2013-7-23 09:09
其实也不是那样的,昨天我查过了,systick是内核中断类型,已经有库函数直接可以修改它的优先级,而且好像 ...

那你试着把串行中断优先级设低点呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 10:10:39 | 显示全部楼层
似水流年、 发表于 2013-7-23 09:43
那你试着把串行中断优先级设低点呢?

嗯嗯,我试过了,我将串口的优先级设为了 7,0 就行了,因为Systick的优先级为6,可是我还是想知道,如果我要改systick的优先级怎么改啊,网上查到的那些方法我都试过了,都没用啊。。。
回复 支持 反对

使用道具 举报

发表于 2013-7-23 10:52:05 | 显示全部楼层
rocker 发表于 2013-7-23 10:10
嗯嗯,我试过了,我将串口的优先级设为了 7,0 就行了,因为Systick的优先级为6,可是我还是想知道,如果我 ...

你在 SysTick初始化的时候设置一下呢
[code=c]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 */
}[/code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 22:18:18 | 显示全部楼层
似水流年、 发表于 2013-7-23 10:52
你在 SysTick初始化的时候设置一下呢

我也想过,可是__NVIC_PRIO_BITS是什么东西啊?我试图将它改为 1 再试,可是依旧不行,真的是有点无语了啊。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 22:18:36 | 显示全部楼层
似水流年、 发表于 2013-7-23 10:52
你在 SysTick初始化的时候设置一下呢

我也想过,可是__NVIC_PRIO_BITS是什么东西啊?我试图将它改为 1 再试,可是依旧不行,真的是有点无语了啊。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 01:42 , Processed in 0.047201 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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