OpenEdv-开源电子网

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

NVIC_Init(&NVIC_InitStructure); 跑飞

[复制链接]

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
发表于 2017-7-17 15:50:16 | 显示全部楼层 |阅读模式
10金钱
问题具体情况为:在gpio_init初始化函数中,初始化两个外部中断,分别在PC1、PC2口上,但是在第一个NVIC_Init(&NVIC_InitStructure)处
就执行不下去了,如果屏蔽第一个NVIC_Init(&NVIC_InitStructure); 程序可以继续执行。




代码如下:void Gpio_Init()
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
               
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
                                        |RCC_APB2Periph_GPIOB
                                        |RCC_APB2Periph_GPIOC
                                        |RCC_APB2Periph_AFIO,ENABLE);

        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_7);
       

        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_SetBits(GPIOC,GPIO_Pin_1);       
       
        EXTI_ClearITPendingBit(EXTI_Line1);
        EXTI_InitStructure.EXTI_Line = EXTI_Line1;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);
        EXTI_GenerateSWInterrupt(EXTI_Line1);
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);    //在此处跑飞,如果屏蔽这一句,就可以正常运行下去
       
/*********************ÅäÖ&#195C2£¬ía2¿ÖD¶Ï′¥·¢LD3320*********************************/
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        EXTI_ClearITPendingBit(EXTI_Line2);  
        EXTI_InitStructure.EXTI_Line = EXTI_Line2;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
        EXTI_GenerateSWInterrupt(EXTI_Line2);

        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       

}

最佳答案

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

多谢老铁,问题解决了,但是感觉也是莫名其妙的就好了,可能是因为几条主要的命令顺序问题, EXTI_GenerateSWInterrupt(EXTI_Line1); EXTI_ClearFlag(EXTI_Line1); GPIO_SetBits(GPIOC,GPIO_Pin_1); 就是这三条命令,具体原因还是不清楚,再次感谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 15:50:17 | 显示全部楼层
多谢老铁,问题解决了,但是感觉也是莫名其妙的就好了,可能是因为几条主要的命令顺序问题,  EXTI_GenerateSWInterrupt(EXTI_Line1);   EXTI_ClearFlag(EXTI_Line1);  GPIO_SetBits(GPIOC,GPIO_Pin_1);        就是这三条命令,具体原因还是不清楚,再次感谢
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 15:50:46 | 显示全部楼层
请各位老铁帮忙看一下啊
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 16:00:22 | 显示全部楼层
不要沉啊
回复

使用道具 举报

0

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1216
金钱
1216
注册时间
2016-7-17
在线时间
143 小时
发表于 2017-7-17 16:06:40 | 显示全部楼层
是程序报错了还是程序一直停留在第一个中断?
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 16:16:25 | 显示全部楼层
虾兵蟹将 发表于 2017-7-17 16:06
是程序报错了还是程序一直停留在第一个中断?

编译程序没错的,debug的时候在第一个NVIC_Init(&NVIC_InitStructure)的地方跑飞了,但是在这里进去单步执行是OK的,在这后面只要不是单步执行都会跑飞
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 16:24:46 | 显示全部楼层
最他妈讨厌的是,单步执行可以过,真的搞不清楚问题具体出在哪里
回复

使用道具 举报

0

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1216
金钱
1216
注册时间
2016-7-17
在线时间
143 小时
发表于 2017-7-17 16:31:17 | 显示全部楼层
第一个外部中断是什么中断,有没有可能持续触发该中断,导致程序无法往下走
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2017-7-17 16:33:07 | 显示全部楼层
有可能是一直在触发中断。。你在中断函数里设个断点看看
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 16:41:06 | 显示全部楼层
执迷 发表于 2017-7-17 16:33
有可能是一直在触发中断。。你在中断函数里设个断点看看

我这个是外部中断,没有电平变化 ,应该不会触发吧
回复

使用道具 举报

0

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1216
金钱
1216
注册时间
2016-7-17
在线时间
143 小时
发表于 2017-7-17 16:49:46 | 显示全部楼层
http://www.openedv.com/forum.php ... digest%26digest%3D1,参考这个帖子的内容:由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 你试试改一下第一个外部中断IO口的工作模式,看情况会不会变化。
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 17:17:17 | 显示全部楼层
虾兵蟹将 发表于 2017-7-17 16:49
http://www.openedv.com/forum.php?mod=viewthread&tid=21980&extra=page%3D1%26filter%3Ddigest%26digest% ...


多谢老铁,问题解决了,但是感觉也是莫名其妙的就好了,可能是因为几条主要的命令顺序问题,  EXTI_GenerateSWInterrupt(EXTI_Line1);   EXTI_ClearFlag(EXTI_Line1);  GPIO_SetBits(GPIOC,GPIO_Pin_1);        就是这三条命令,具体原因还是不清楚,再次感谢
回复

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-10-20
在线时间
105 小时
 楼主| 发表于 2017-7-17 17:17:32 | 显示全部楼层
执迷 发表于 2017-7-17 16:33
有可能是一直在触发中断。。你在中断函数里设个断点看看


多谢老铁,问题解决了,但是感觉也是莫名其妙的就好了,可能是因为几条主要的命令顺序问题,  EXTI_GenerateSWInterrupt(EXTI_Line1);   EXTI_ClearFlag(EXTI_Line1);  GPIO_SetBits(GPIOC,GPIO_Pin_1);        就是这三条命令,具体原因还是不清楚,再次感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-18 21:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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