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

2019-08-14 19:45发布

我在外部中中服务函数中加了一个死循环,来检查是否进入中断,灯没有变化,所以断定没有进入。
先谢过了。
程序如下:
#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中文参考手册
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
SNEZSTM32
1楼-- · 2019-08-16 01:02
472983460 发表于 2017-8-1 21:14
没有配置 GPIO 与中断线的映射
也没有对中断线上中断的初始化

不太懂,能不能把手册对应的内容上个图
sodermalm
2楼-- · 2019-08-16 03:26
感觉你写的有问题啊,你中断进入死循环后,又没有跳出来,直接卡在死循环里面了 ,len灯当然没有变化了。而且看了你后面的  其实你可以把while去掉  直接用后面的led亮灭来判断就可以了,不然你在线调试一下就知道。
SNEZSTM32
3楼-- · 2019-08-16 05:19
 精彩回答 2  元偷偷看……
SNEZSTM32
4楼-- · 2019-08-16 06:15
sodermalm 发表于 2017-8-2 09:41
感觉你写的有问题啊,你中断进入死循环后,又没有跳出来,直接卡在死循环里面了 ,len灯当然没有变化了。而 ...

恩好嘛,我想的是灯灭了就证明了进入了中断
sodermalm
5楼-- · 2019-08-16 11:15
SNEZSTM32 发表于 2017-8-2 09:48
恩好嘛,我想的是灯灭了就证明了进入了中断

按你刚才的写法都卡在while里面了   灯肯定是灭不了的。所以你可以把那个while那部分去掉。
SNEZSTM32
6楼-- · 2019-08-16 12:17
哦,我试试,先灭,在while

一周热门 更多>