OpenEdv-开源电子网

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

外部中断没有进入中断服务函数

[复制链接]

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
发表于 2017-8-1 16:36:59 | 显示全部楼层 |阅读模式
5金钱
我在外部中中服务函数中加了一个死循环,来检查是否进入中断,灯没有变化,所以断定没有进入。
先谢过了。
程序如下:
#include "stm32f10x.h"
#include "delay.h"


void My_Exit_Init();
void My_Light_Init();

int main()
{
       
        delay_init();
        My_Light_Init();
        My_Exit_Init();
        while(1)
        {
//                GPIO_SetBits(GPIOB, GPIO_Pin_5);
//                delay_ms(500);
//                GPIO_ResetBits(GPIOB, GPIO_Pin_5);
//                delay_ms(500);
        }
        return 0;
}

void My_Exit_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                                       
        NVIC_Init(&NVIC_InitStructure);
        *(unsigned int*)(0x40010400) |= (1 << 4);
        *(unsigned int*)(0x40010400 + 0x0c) |= (1 << 4);
}

void EXTI4_IRQHandler()
{
        static unsigned char state = 0xff;
        while(1)
        {
                GPIO_SetBits(GPIOB, GPIO_Pin_5);   //就这句我能判断没有进入服务函数
        }
        delay_ms(300);
        state = ~state;
        if(state)
        {
                GPIO_SetBits(GPIOB, GPIO_Pin_5);
        }
        else
        {
                GPIO_ResetBits(GPIOB, GPIO_Pin_5);
        }
        *(unsigned int*)(0x40010400 + 0x14) |= (1 << 4);
}


void My_Light_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_SetBits(GPIOB, GPIO_Pin_5);
        GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}




有关资料参考截图: QQ截图20170801163449.png QQ截图20170801163439.png 1.png 2.png
具体寄存器有点多,麻烦参考STM32中文参考手册

最佳答案

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

在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的: void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 该函数将 GPIO 端口与中断线映射起来,使用范例是: GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); 将中断线 2 与 GPIOE 映射起来,那么很显然是 GPIOE.2 与 EXTI2 中断线连接了。设置好中断 线映射之后,那么到底来自这个 IO 口的中断是通过 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2017-8-2
在线时间
0 小时
发表于 2017-8-1 16:37:00 | 显示全部楼层
SNEZSTM32 发表于 2017-8-1 22:34
不太懂,能不能把手册对应的内容上个图

在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的:
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
该函数将 GPIO 端口与中断线映射起来,使用范例是:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
将中断线 2 与 GPIOE 映射起来,那么很显然是 GPIOE.2 与 EXTI2 中断线连接了。设置好中断
线映射之后,那么到底来自这个 IO 口的中断是通过什么方式触发的呢?接下来我们就要设置
该中断线上中断的初始化参数了。
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2017-8-1
在线时间
21 小时
发表于 2017-8-1 17:58:07 | 显示全部楼层
用的什么板子  我的LED是低电平为有效电平
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2017-8-1
在线时间
21 小时
发表于 2017-8-1 17:58:46 | 显示全部楼层
你没给LED的硬件图
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-1 19:39:16 | 显示全部楼层
竹林的风 发表于 2017-8-1 17:58
用的什么板子  我的LED是低电平为有效电平

正点原子 ——战舰
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-1 19:45:50 | 显示全部楼层
竹林的风 发表于 2017-8-1 17:58
用的什么板子  我的LED是低电平为有效电平

我的也是低电平,所以调用My_Light_Init()后,电平是低(此时灯是亮的)
我感觉灯没有问题,关键是为什么没有进入中断服务函数,我想看看寄存器配置,但是库函数看的我脑壳疼,今天暂时不想看了
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2017-7-8
在线时间
24 小时
发表于 2017-8-1 21:14:57 | 显示全部楼层
没有配置 GPIO 与中断线的映射
也没有对中断线上中断的初始化
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-1 22:34:42 | 显示全部楼层
472983460 发表于 2017-8-1 21:14
没有配置 GPIO 与中断线的映射
也没有对中断线上中断的初始化

不太懂,能不能把手册对应的内容上个图
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2017-8-2 09:41:19 | 显示全部楼层
感觉你写的有问题啊,你中断进入死循环后,又没有跳出来,直接卡在死循环里面了 ,len灯当然没有变化了。而且看了你后面的  其实你可以把while去掉  直接用后面的led亮灭来判断就可以了,不然你在线调试一下就知道。
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-2 09:46:36 | 显示全部楼层
我在void My_Exit_Init()里面加了一句*(unsigned int*)(0x40010000 + 0x0c) = 0X0004;  其中0x40010000 是AFIO的地址,0x0c是AFIO_EXTICR2地址的偏移,应该这个就是你们说的GPIO 与中断线的映射关系。(STM32中文参考手册),我在想想,也请大神门看看
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-2 09:48:03 | 显示全部楼层
sodermalm 发表于 2017-8-2 09:41
感觉你写的有问题啊,你中断进入死循环后,又没有跳出来,直接卡在死循环里面了 ,len灯当然没有变化了。而 ...

恩好嘛,我想的是灯灭了就证明了进入了中断
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2017-8-2 09:58:21 | 显示全部楼层
SNEZSTM32 发表于 2017-8-2 09:48
恩好嘛,我想的是灯灭了就证明了进入了中断

按你刚才的写法都卡在while里面了   灯肯定是灭不了的。所以你可以把那个while那部分去掉。
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-2 10:17:16 | 显示全部楼层
哦,我试试,先灭,在while
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-2 10:19:37 | 显示全部楼层
我写成GPIO_SetBits(GPIOB, GPIO_Pin_5);
while(1)
        {
                   //就这句我能判断没有进入服务函数
        }
还是不行,我在看看
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-2 10:28:37 | 显示全部楼层
可以了,我刚才把外部中断初始化注视了....主要还是加了*(unsigned int*)(0x40010000 + 0x0c) = 0X0004 这句吧,具体灯那样写对不对,我一会试试,太谢谢了
回复

使用道具 举报

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
 楼主| 发表于 2017-8-2 10:30:23 | 显示全部楼层
灯 那样写没有问题。。。 主要是只能采纳一个人。。。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-8-2
在线时间
0 小时
发表于 2017-8-2 14:49:08 | 显示全部楼层
1.        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //初始化要添加。
2.中断里面不要死循环
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 04:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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