我在外部中中服务函数中加了一个死循环,来检查是否进入中断,灯没有变化,所以断定没有进入。
先谢过了。
程序如下:
#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);
}
有关资料参考截图:
具体寄存器有点多,麻烦参考STM32中文参考手册
不太懂,能不能把手册对应的内容上个图
恩好嘛,我想的是灯灭了就证明了进入了中断
按你刚才的写法都卡在while里面了 灯肯定是灭不了的。所以你可以把那个while那部分去掉。
一周热门 更多>