OpenEdv-开源电子网

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

有没有大神知道我这为什么下载到板子之后,按键不能控制led亮灭

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2023-6-12
在线时间
0 小时
发表于 2023-6-12 21:27:10 | 显示全部楼层 |阅读模式
#ifndef __EXTI_H
#define __EXTI_H
#include "./SYSTEM/sys/sys.h"

//引脚、中断服务函数定义和中断编号

#define KEY0_INT_GPIO_PORT        GPIOE
#define KEY0_GPIO_PIN                GPIO_PIN_4
//PE口时钟使能
#define KEY0_GPIO_CLK_ENABLE()        do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define KEY0_INT_IRQN                        EXTI4_IRQn
#define KEY0_INT_IRQHandler     EXTI4_IRQHander  

#define KEY1_INT_GPIO_PORT      GPIOE
#define KEY1_GPIO_PIN               GPIO_PIN_3
//PE口时钟使能
#define KEY1_GPIO_CLK_ENABLE()  do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define KEY1_INT_IRQN               EXTI3_IRQn
#define KEY1_INT_IRQHandler     EXTI3_IRQHander  

#define KEYUP_INT_GPIO_PORT     GPIOA
#define KEYUP_GPIO_PIN               GPIO_PIN_0
//PA口时钟使能
#define KEYUP_GPIO_CLK_ENABLE() do{__HAL_RCC_GPIOA_CLK_ENABLE();}while(0)
#define KEYUP_INT_IRQN               EXTI0_IRQn
#define KEYUP_INT_IRQHandler    EXTI0_IRQHander  


void exti_init();

#endif

#include "./BSP/EXTI/exti.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"

void exti_init()
{
    GPIO_InitTypeDef gpio_init_struct;

    //使能时钟
    KEY0_GPIO_CLK_ENABLE();
    KEY1_GPIO_CLK_ENABLE();
    KEYUP_GPIO_CLK_ENABLE();

    //key0对结构体内容初始化
    gpio_init_struct.Pin=KEY0_GPIO_PIN;
    gpio_init_struct.Mode=GPIO_MODE_IT_FALLING;
    gpio_init_struct.Pull=GPIO_PULLUP;
    HAL_GPIO_Init(KEY0_INT_GPIO_PORT,&gpio_init_struct);

    //key1对结构体内容初始化
    gpio_init_struct.Pin=KEY1_GPIO_PIN;
    gpio_init_struct.Mode=GPIO_MODE_IT_FALLING;
    gpio_init_struct.Pull=GPIO_PULLUP;
    HAL_GPIO_Init(KEY1_INT_GPIO_PORT,&gpio_init_struct);

    //keyup对结构体内容初始化
    gpio_init_struct.Pin=KEYUP_GPIO_PIN;
    gpio_init_struct.Mode=GPIO_MODE_IT_RISING;
    gpio_init_struct.Pull=GPIO_PULLDOWN;
    HAL_GPIO_Init(KEYUP_INT_GPIO_PORT,&gpio_init_struct);

    HAL_NVIC_SetPriority(KEY0_INT_IRQN,0,2);
    HAL_NVIC_EnableIRQ(KEY0_INT_IRQN);

    HAL_NVIC_SetPriority(KEY1_INT_IRQN,1,2);
    HAL_NVIC_EnableIRQ(KEY1_INT_IRQN);

    HAL_NVIC_SetPriority(KEYUP_INT_IRQN,3,2);
    HAL_NVIC_EnableIRQ(KEYUP_INT_IRQN);   
}

//外部中断服务程序
void KEY0_INT_IRQHandler()
{
    HAL_GPIO_EXTI_IRQHandler(KEY0_GPIO_PIN);//中断处理公用函数
    __HAL_GPIO_EXTI_CLEAR_IT(KEY0_GPIO_PIN);
}

void KEY1_INT_IRQHandler()
{
    HAL_GPIO_EXTI_IRQHandler(KEY1_GPIO_PIN);
    __HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
}

void KEYUP_INT_IRQHandler()
{
    HAL_GPIO_EXTI_IRQHandler(KEYUP_GPIO_PIN);
    __HAL_GPIO_EXTI_CLEAR_IT(KEYUP_GPIO_PIN);
}

//中断处理回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(20);
    switch(GPIO_Pin)
    {
        case KEY0_GPIO_PIN:
            if (HAL_GPIO_ReadPin(KEY0_INT_GPIO_PORT,KEY0_GPIO_PIN)==0)
            {
                LED0_TOGGLE();
                                LED1_TOGGLE();
            }
            break;
        case KEY1_GPIO_PIN:
            if (HAL_GPIO_ReadPin(KEY1_INT_GPIO_PORT,KEY1_GPIO_PIN)==0)
            {
                LED1_TOGGLE();
            }
            break;
        case KEYUP_GPIO_PIN:
            if (HAL_GPIO_ReadPin(KEYUP_INT_GPIO_PORT,KEYUP_GPIO_PIN))
            {
                LED1_TOGGLE();
            }
            break;
    }
}


/**
****************************************************************************************************
* @file        main.c
* @Author      ÕýµãÔ­×ÓÍŶÓ(ALIENTEK)
* @version     V1.0
* @date        2020-04-20
* @brief       ÅÜÂíµÆ ʵÑé
* @license     Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
****************************************************************************************************
* @attention
*
* ʵÑéƽ̨:ÕýµãÔ­×Ó STM32F103¿ª·¢°å
* ÔÚÏßÊÓƵ:www.yuanzige.com
* ¼¼ÊõÂÛ̳:www.openedv.com
* ¹«Ë¾ÍøÖ·:www.alientek.com
* ¹ºÂòµØÖ·penedv.taobao.com
*
****************************************************************************************************
*/

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/EXTI/exti.h"

int main(void)
{
    HAL_Init();                                 /* ³õʼ»¯HAL¿â */
    sys_stm32_clock_init(RCC_PLL_MUL9);         /* ÉèÖÃʱÖÓ,72M */
    delay_init(72);                             /* ³õʼ»¯ÑÓʱº¯Êý */
    led_init();                                 /* ³õʼ»¯LED */
    exti_init();
        //LED1(0);
    while(1)
    {
        LED0(0);                                /* LED0 ÁÁ */
       // LED1(1);                                /* LED1 Ãð */
        delay_ms(500);
        LED0(1);                                /* LED0 Ãð */
        //LED1(0);                                /* LED1 ÁÁ */
        delay_ms(500);
    }
}



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

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2023-6-27 11:55:01 | 显示全部楼层
外部中断触发了会进这里?
你打个断点看看,进不去就检查初始化
KEY0_INT_IRQHandler
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2019-9-5
在线时间
67 小时
发表于 2023-6-27 17:21:29 | 显示全部楼层
为什么要在回调函数加了延时(按键消抖不推荐你这样搞),在中断服务函数里这样操作是非常危险,一般是不允许的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 07:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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