OpenEdv-开源电子网

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

为什么外部中断实验“卡住了”

[复制链接]

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-8-1
在线时间
0 小时
发表于 2015-8-8 02:39:53 | 显示全部楼层 |阅读模式
5金钱
使用一个按键(连接PD3)做外部中断实验,期望的现象是按住它时全部灯亮,松开时4个LED灯继续流水灯现象。但实际现象是按一下它流水灯就停止了,当前亮着的灯亮着,其它灯灭了,无法恢复流水灯,除非系统复位。
[mw_shl_code=c,true]#include "stm32f10x.h" #include "delay.h" #define RCC_USER2 RCC_APB2Periph_GPIOD #define USER2_PORT GPIOD #define USER2_Pin GPIO_Pin_3 #define RCC_LED RCC_APB2Periph_GPIOF #define LED_PORT GPIOF #define DS1 GPIO_Pin_6 #define DS2 GPIO_Pin_7 #define DS3 GPIO_Pin_8 #define DS4 GPIO_Pin_9 void Key_Init(void); void LED_Init(void); void NVIC_GroupConfig(void); void EXTIX_Init(void); int main() { LED_Init(); Key_Init(); NVIC_GroupConfig(); EXTIX_Init(); GPIO_SetBits(LED_PORT,DS1|DS2|DS3|DS4); while(1) { GPIO_SetBits(LED_PORT,DS2|DS3|DS4); GPIO_ResetBits(LED_PORT,DS1); Delay_ms(500); GPIO_SetBits(LED_PORT,DS1|DS3|DS4); GPIO_ResetBits(LED_PORT,DS2); Delay_ms(500); GPIO_SetBits(LED_PORT,DS2|DS1|DS4); GPIO_ResetBits(LED_PORT,DS3); Delay_ms(500); GPIO_SetBits(LED_PORT,DS2|DS3|DS1); GPIO_ResetBits(LED_PORT,DS4); Delay_ms(500); } } void Key_Init() { GPIO_InitTypeDef GPIO_StructureInit; RCC_APB2PeriphClockCmd(RCC_USER2,ENABLE); GPIO_StructureInit.GPIO_Pin=USER2_Pin; GPIO_StructureInit.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(USER2_PORT,&GPIO_StructureInit); } void LED_Init() { GPIO_InitTypeDef GPIO_StructureInit; RCC_APB2PeriphClockCmd(RCC_LED,ENABLE); GPIO_StructureInit.GPIO_Pin=DS1|DS2|DS3|DS4; GPIO_StructureInit.GPIO_Speed=GPIO_Speed_2MHz; GPIO_StructureInit.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(LED_PORT,&GPIO_StructureInit); } void NVIC_GroupConfig() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); } void EXTIX_Init() { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource3); EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0X02; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0X03; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI3_IRQHandler() { if(EXTI_GetITStatus(EXTI_Line3)!=RESET) { Delay_ms(10); if(GPIO_ReadInputDataBit(USER2_PORT,USER2_Pin)==0) GPIO_ResetBits(LED_PORT,DS1|DS2|DS3|DS4); while(GPIO_ReadInputDataBit(USER2_PORT,USER2_Pin)==0); EXTI_ClearITPendingBit(EXTI_Line3); } } [/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

回复【3楼】5IMCU: --------------------------------- 就是因为你的systick中断问题导致的,因为systick中断优先级最低了,永远无法完成中断里面的延时,所以卡死了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-8 02:39:54 | 显示全部楼层
回复【3楼】5IMCU:
---------------------------------
就是因为你的systick中断问题导致的,因为systick中断优先级最低了,永远无法完成中断里面的延时,所以卡死了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
414
金钱
414
注册时间
2014-11-15
在线时间
75 小时
发表于 2015-8-8 07:42:47 | 显示全部楼层
单步调试
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-8-1
在线时间
0 小时
 楼主| 发表于 2015-8-8 17:50:40 | 显示全部楼层
回复【2楼】番茄君:
---------------------------------
调试发现程序卡在EXTI3_IRQHandler();里的延时程序出不来。延时使用的是SysTick,调用了SysTick中断,于是想是不是中断嵌套失败?后来在延时函数里面加一句NVIC_SetPriority(SysTick_IRQn, 0x0);就没问题了。现在想不明白的是SysTick_Config();里面已经有NVIC_SetPriority();了,为什么外面要加呢?
回复

使用道具 举报

37

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2016-9-13
在线时间
73 小时
发表于 2018-1-15 17:02:51 | 显示全部楼层
正点原子 发表于 2015-8-8 02:39
回复【3楼】5IMCU:
---------------------------------
就是因为你的systick中断问题导致的,因为systick中 ...

他写的这些并没有systick函数啊
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-12-21
在线时间
10 小时
发表于 2018-1-15 17:08:27 | 显示全部楼层
伊森亨特 发表于 2018-1-15 17:02
他写的这些并没有systick函数啊

不是include 'delay.h'了吗,那里面是
回复

使用道具 举报

37

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2016-9-13
在线时间
73 小时
发表于 2018-1-17 11:10:47 | 显示全部楼层
huangbc 发表于 2018-1-15 17:08
不是include 'delay.h'了吗,那里面是

哦,跟我写的不一样吧,我偷懒了,没有设置systick的东西,就设置了一个时钟源
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2017-7-17
在线时间
6 小时
发表于 2018-1-31 21:38:08 | 显示全部楼层
正点原子 发表于 2015-8-8 02:39
回复【3楼】5IMCU:
---------------------------------
就是因为你的systick中断问题导致的,因为systick中 ...

麻烦原子哥能再详细讲一下吗?我也遇到这个问题了
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-10-5
在线时间
30 小时
发表于 2019-5-7 13:43:44 | 显示全部楼层
应该是中断服务函数中的延时函数
回复

使用道具 举报

11

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2020-11-4
在线时间
16 小时
发表于 2020-11-26 14:12:48 | 显示全部楼层
正点原子 发表于 2015-8-8 02:39
回复【3楼】5IMCU:
---------------------------------
就是因为你的systick中断问题导致的,因为systick中 ...

怎么修改呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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