打印

STM32F0 discovery EXTI和SysTick有冲突?该怎么设置?

[复制链接]
4199|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fdcjjrxl|  楼主 | 2013-9-24 14:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
纯粹的新手,学习F0。基本照抄的官方EXTI例程,我想在中断处理函数中加上让LED3和LED4亮一会再灭掉,可是执行到亮了以后延时600毫秒时,LED怎么也不灭了。这个Delay_ms用到了SysTick,自己写一个空循环的延时程序就可以正常执行。主程序中调用Delay_ms也正常,这会是什么原因造成的?请高手指教。

void EXTI0_1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
    /* Turn on LED3 and LED4 during 1s each time User button is pressed */
                GPIO_WriteBit(LED3_GPIO_PORT, LED3_PIN | LED4_PIN, Bit_SET);
      
    /* wait for 600ms */
    Delay_ms(600);
      
    /* Turn off LED3 and LED4 after 1s each time User button is pressed */
                GPIO_WriteBit(LED4_GPIO_PORT, LED3_PIN | LED4_PIN, Bit_RESET);
                       
                /* BlinkMode: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6, then re-cycle */
                BlinkMode++;
                if(BlinkMode == 7)
                {
                        BlinkMode = 0;
                }
   
                /* Clear the EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line0);
  }
}
沙发
mmuuss586| | 2013-9-24 14:48 | 只看该作者
030的板子吧》?

使用特权

评论回复
板凳
fdcjjrxl|  楼主 | 2013-9-24 15:06 | 只看该作者
官方的F0 discovery板子呀

使用特权

评论回复
地板
zly0123yz| | 2013-9-24 15:19 | 只看该作者
你在中断处理函数中调用延时函数。是可以的。关键这个延时函数不可以使用到别的中断。stm32在中断处理中只能同时处理一个中断。如果该中断不处理完。即使有别的高级别中断产生也不会执行处理函数。
你说你在你的延时函数中使用了systemtick,在你EXTI0_1_IRQHandler执行的时候,systemtick的中断处理不能执行。你的系统计时也不会增加,就导致你的延时函数永远等不到结束。
如果你一定要延时的话,可以使用空循环。

使用特权

评论回复
5
fdcjjrxl|  楼主 | 2013-9-24 15:26 | 只看该作者
哦,这样的啊。那可不可以将SysTick的中断优先级设高点,把EXTI0的中断优先级设低点来实现SysTick优先呢?

使用特权

评论回复
6
zly0123yz| | 2013-9-24 15:37 | 只看该作者
fdcjjrxl 发表于 2013-9-24 15:26
哦,这样的啊。那可不可以将SysTick的中断优先级设高点,把EXTI0的中断优先级设低点来实现SysTick优先呢? ...

不可以。EXTI0的优先级高低没影响的。而且SysTick天生是最高的。主要是由于stm32同时只能处理一个中断。你进入EXTI0中断后,stm32再产生的中断会被延后到EXTI0处理完后处理。
这就是为什么你在别的地方能用Systick,在中断里面不能用的原因。

使用特权

评论回复
7
zly0123yz| | 2013-9-24 15:50 | 只看该作者
本帖最后由 zly0123yz 于 2013-9-24 15:56 编辑
zly0123yz 发表于 2013-9-24 15:37
不可以。EXTI0的优先级高低没影响的。而且SysTick天生是最高的。主要是由于stm32同时只能处理一个中断。 ...

额。。。俺错了。stm32存在中断嵌套的。就是看你的中断抢断优先级的高地,具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。


使用特权

评论回复
8
fdcjjrxl|  楼主 | 2013-9-24 15:54 | 只看该作者
那中断嵌套怎么理解呢?不是说高优先级的中断可以在低优先级的中断处理过程中被响应么?

使用特权

评论回复
9
zly0123yz| | 2013-9-24 15:56 | 只看该作者
fdcjjrxl 发表于 2013-9-24 15:54
那中断嵌套怎么理解呢?不是说高优先级的中断可以在低优先级的中断处理过程中被响应么? ...

下面是中断优先级的说明
stm32中断优先级的定义
https://bbs.21ic.com/forum.php?mod=viewthread&tid=623026&fromuid=1091752

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fdcjjrxl + 1 赞一个!
10
fdcjjrxl|  楼主 | 2013-9-24 16:19 | 只看该作者

请问这个NVIC_PriorityGroupConfig函数在哪个库文件中定义的呀?

使用特权

评论回复
11
zly0123yz| | 2013-9-24 16:32 | 只看该作者
stm32f10x_nvic.c 应该是吧

使用特权

评论回复
12
hkcj| | 2013-9-24 19:00 | 只看该作者
不是很了解这一块     帮你顶一个

使用特权

评论回复
13
zly0123yz| | 2013-9-25 10:33 | 只看该作者
这个~貌似你还没结贴~~

使用特权

评论回复
14
fdcjjrxl|  楼主 | 2013-9-25 11:58 | 只看该作者
zly0123yz 发表于 2013-9-25 10:33
这个~貌似你还没结贴~~

不知道怎么结?
评分还只能1天1分那么评

使用特权

评论回复
15
zly0123yz| | 2013-9-25 12:26 | 只看该作者
额。。。这个。。。你得问管理员了。。。俺说不清楚

使用特权

评论回复
16
pattywu| | 2013-11-4 09:30 | 只看该作者
    在中断中延时,真是软件界的奇才啊。
   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

23

帖子

0

粉丝