OpenEdv-开源电子网

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

按键触发外部中断,进步了中断

[复制链接]

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-24
在线时间
0 小时
发表于 2014-6-6 14:42:41 | 显示全部楼层 |阅读模式
5金钱
我用的是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)
    { 

    }
}


最佳答案

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

楼猪你太大意了,你的中断处理函数为: void EXTI0_IRQHandle(void) {     delay_ms(10);   //去抖动     if(EXTI_GetITStatus(EXTI_Line0) != RESET)   //检查是否有触发请求发生     {         Cin(3) = 1;         de ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-6-6 14:42:42 | 显示全部楼层
楼猪你太大意了,你的中断处理函数为:
void EXTI0_IRQHandle(void)
{
    delay_ms(10);   //去抖动
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)   //检查是否有触发请求发生
    {
        Cin(3) = 1;
        delay_ms(10);
       Cin(3) = 0;
    }
        EXTI_ClearFlag(EXTI_Line0); //清除标志位
        EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI0_IRQHandle(void)不应该是void EXTI0_IRQHandler(void)吗?(字母r被楼猪偷吃了)。
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-24
在线时间
0 小时
 楼主| 发表于 2014-6-6 14:42:42 | 显示全部楼层
回复【3楼】cdshkf:
---------------------------------
问题解决了,谢谢2楼的指点,确实是少了一个r的原因,之前死在while那儿是因为,我把判断是否有中断请求那一句if(EXTI_GetITStatus(EXTI_Line0) != RESET),改成了if(KEY2 == 0),我看有些程序上有这样的写法,但似乎不可行,不过现在问题总算是解决了,真是太粗心大意了,下次一定要仔细一点
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-24
在线时间
0 小时
 楼主| 发表于 2014-6-6 15:34:17 | 显示全部楼层
看了原子哥的【Alientek STM32实验4】--外部中断实验:http://www.openedv.com/posts/list/21.htm
进行了适当的修改(只是修改了IO口的设置及中断处理函数中的部分程序),可是还是进不去中断,出现的现象跟之前一样,要么死在while那儿,要么死在“B.”那儿,快要疯掉了
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-24
在线时间
0 小时
 楼主| 发表于 2014-6-7 08:59:49 | 显示全部楼层
回复【3楼】cdshkf:
---------------------------------
确实是大意了,不过这边改过来之后,单步仿真、全速仿真都不会跳到“B.”那边,但是一直死在while那儿,还是进不去中断处理函数
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
发表于 2014-12-4 12:59:19 | 显示全部楼层


大哥 关于这个中断能帮我看看是那边配置错了吗,中断一直进不去,看了一天多了,各种纠结,配置的是PB6口,麻烦了,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 06:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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