OpenEdv-开源电子网

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

为什么stm32f407按键中断不行?

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-10-12
在线时间
7 小时
发表于 2021-10-21 21:14:09 | 显示全部楼层 |阅读模式
#include "stm32f4xx.h"
#include "sys.h"


static  GPIO_InitTypeDef   GPIO_InitStructure;//定义一个GPIO初始化的结构体
static  EXTI_InitTypeDef   EXTI_InitStructure;//定义一个中断初始化的结构体
static  NVIC_InitTypeDef   NVIC_InitStructure;//定义一个中断优先级初始化的结构体


void delay(void)
{
        uint32_t i=0x1000000;
       
        while(i--);

}

void exti8_Init(void)
{
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能硬件时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能系统时钟

       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//PB8 KEY1按键初始化
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        //将PB8连接到外部中断8
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource8);
       
    //配置外部中断8
        EXTI_InitStructure.EXTI_Line = EXTI_Line8;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

    //配置中断优先级
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//打开外部中断1的请求通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
       

}

void exti9_Init(void)
{
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能硬件时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能系统时钟

        //配置PB9引脚为输入模式 KEY0按键初始化
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        //将PB9连接到外部中断9
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource9);
       
    //配置外部中断9
        EXTI_InitStructure.EXTI_Line = EXTI_Line9;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

    //配置中断优先级
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//外部中断9的请求通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
       

}



int main(void)
{
        //使能端口F的时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//选择端口F的9号和10引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//选择推挽输出,增大输出电流
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//高速响应
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉电阻;当有负载时不需要上下拉电阻,反之需要,以保证静电流向大地,不会损坏IO引脚               
        GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化端口F
       

       
        PFout(9)=1;
        PFout(10)=1;
       
       
        //中断优先级组的配置:选择第二组
        //支持四个抢断优先级和四个响应优先级
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        exti9_Init();
        exti8_Init();
       
        while(1)
        {

               
       
         }
       
       
       
}       


void EXTI9_IRQHandler(void)      //中断服务函数
{
        if(EXTI_GetITStatus(EXTI_Line9)== SET)//判断是否有中断请求
        {
                PFout(9)=0;//打开LED0
                delay();
                  
                PFout(9)=1;//关闭LED0
                delay();
               
                /* 清空外部中断9的标志位 */
                EXTI_ClearITPendingBit(EXTI_Line9);
        }
}

void EXTI8_IRQHandler(void)      //中断服务函数
{
        if(EXTI_GetITStatus(EXTI_Line8)== SET)//判断是否有中断请求
        {
                PFout(10)=0;//打开LED1
                delay();
                  
                PFout(10)=1;//关闭LED1
                delay();
               
                /* 清空外部中断8的标志位 */
                EXTI_ClearITPendingBit(EXTI_Line8);
        }
}

       
       
       


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2020-8-19
在线时间
335 小时
发表于 2021-10-22 11:04:31 | 显示全部楼层
原子有例程,你可以参考一下
回复 支持 反对

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-10-22 11:24:39 | 显示全部楼层
用例程试试
回复 支持 反对

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2020-10-10
在线时间
114 小时
发表于 2021-10-29 01:02:30 来自手机 | 显示全部楼层
不是共用一个中断入口吗?EXTI9_5IRQHandler
回复 支持 反对

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1976
金钱
1976
注册时间
2021-4-16
在线时间
505 小时
发表于 2021-10-29 09:48:19 | 显示全部楼层
确实,中断8和中断9都用这个:EXTI9_5_IRQHandler               
中断里判断下是哪个中断触发的就行。
回复 支持 反对

使用道具 举报

7

主题

82

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1259
金钱
1259
注册时间
2018-6-13
在线时间
141 小时
发表于 2021-10-29 10:04:27 | 显示全部楼层
参考正点原子例程,如果是共用的中断就要在进入中断后判断是具体哪一路发生的中断,可以通过获取中断管脚的电平信号的方式
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-10-12
在线时间
7 小时
 楼主| 发表于 2021-11-1 15:58:57 | 显示全部楼层
谢谢 已解决
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-10-12
在线时间
7 小时
 楼主| 发表于 2021-11-1 15:59:23 | 显示全部楼层
yao79 发表于 2021-10-29 01:02
不是共用一个中断入口吗?EXTI9_5IRQHandler

谢谢 已解决
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-10-12
在线时间
7 小时
 楼主| 发表于 2021-11-1 16:00:04 | 显示全部楼层
疾如风 发表于 2021-10-29 09:48
确实,中断8和中断9都用这个:EXTI9_5_IRQHandler               
中断里判断下是哪个中断触发的就行。

谢谢 已解决
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 19:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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