我用的是STM32F103RET6,PC0接按键,外部接一个上拉电阻,通过下降沿触发外部中断,琢磨了两三天了,就是进不去中断;
单步或全速仿真时(不按按键),程序停在while那儿,
如果一边仿真一边按键,程序停在 startup_stm32f10x_hd.s文件中的“B.”那里。
也在论坛里查找了答案,但多次尝试之后都不见效果,只能把程序贴出来劳烦各位大神指教了,程序如下:
//按键IO口设置
void GPIO_KEY_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC,ENABLE);
//PC0--KEY2   C1--KEY3   C2--KEY4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//外部已经接了上拉电阻
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
//中断配置函数
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0000);
//使能外部中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//按键中断初始化
void KEY_EXTI_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_KEY_Config();
NVIC_Config();
EXTI_ClearITPendingBit(EXTI_Line0);
//KEY1--PC0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource0); //PC0配置为外部中断
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
//KEY2--PC0--EXTI0
void EXTI0_IRQHandle(void)
{
delay_ms(10); //去抖动
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //检查是否有触发请求发生
{
PCin(3) = 1;
delay_ms(10);
PCin(3) = 0;
}
EXTI_ClearFlag(EXTI_Line0); //清除标志位
EXTI_ClearITPendingBit(EXTI_Line0);
}
//主函数
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
KEY_EXTI_Init();
while(1)
{
}
}
|