ARM嵌入式学习日记(3)

按键控制外部中断

目的:通过开发板上的四个独立按键控制LED灯,KEY_UP控制蜂鸣器翻转,KEY1控制LED0翻转,KEY0控制LED0,LED1同时翻转

main.c
#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/EXTI/exti.h"


int main(void)
{
    HAL_Init();                            /* ³õʼ»¯HAL¿â */
    sys_stm32_clock_init(RCC_PLL_MUL9);    /* ÉèÖÃʱÖÓ, 72Mhz */
    delay_init(72);                        /* ÑÓʱ³õʼ»¯ */
    usart_init(115200);                    /* ´®¿Ú³õʼ»¯Îª115200 */
    led_init();                            /* ³õʼ»¯LED */
    beep_init();                           /* ³õʼ»¯·äÃùÆ÷ */
    extix_init();                          /* ³õʼ»¯ÍⲿÖжÏÊäÈë */
    LED0(0);                               /* ÏȵãÁÁºìµÆ */

    while (1)
    {
        printf("OK\r\n");
        delay_ms(1000);
    }
}

exit.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/KEY/key.h"
#include "./BSP/EXTI/exti.h"


/**
 * @brief       KEY0 ÍⲿÖжϷþÎñ³ÌÐò
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void KEY0_INT_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(KEY0_INT_GPIO_PIN);         /* µ÷ÓÃÖжϴ¦Àí¹«Óú¯Êý Çå³ýKEY0ËùÔÚÖжÏÏß µÄÖжϱê־λ */
    __HAL_GPIO_EXTI_CLEAR_IT(KEY0_INT_GPIO_PIN);         /* HAL¿âĬÈÏÏÈÇåÖжÏÔÙ´¦Àí»Øµ÷£¬Í˳öʱÔÙÇåÒ»´ÎÖжϣ¬±ÜÃâ°´¼ü¶¶¶¯Îó´¥·¢ */
}

/**
 * @brief       KEY1 ÍⲿÖжϷþÎñ³ÌÐò
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void KEY1_INT_IRQHandler(void)
{ 
    HAL_GPIO_EXTI_IRQHandler(KEY1_INT_GPIO_PIN);         /* µ÷ÓÃÖжϴ¦Àí¹«Óú¯Êý Çå³ýKEY1ËùÔÚÖжÏÏß µÄÖжϱê־룬ÖжÏÏ°벿ÔÚHAL_GPIO_EXTI_CallbackÖ´ÐÐ */
    __HAL_GPIO_EXTI_CLEAR_IT(KEY1_INT_GPIO_PIN);         /* HAL¿âĬÈÏÏÈÇåÖжÏÔÙ´¦Àí»Øµ÷£¬Í˳öʱÔÙÇåÒ»´ÎÖжϣ¬±ÜÃâ°´¼ü¶¶¶¯Îó´¥·¢ */
}


/**
 * @brief       WK_UP ÍⲿÖжϷþÎñ³ÌÐò
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void WKUP_INT_IRQHandler(void)
{ 
    HAL_GPIO_EXTI_IRQHandler(WKUP_INT_GPIO_PIN);        /* µ÷ÓÃÖжϴ¦Àí¹«Óú¯Êý Çå³ýKEY_UPËùÔÚÖжÏÏß µÄÖжϱê־룬ÖжÏÏ°벿ÔÚHAL_GPIO_EXTI_CallbackÖ´ÐÐ */
    __HAL_GPIO_EXTI_CLEAR_IT(WKUP_INT_GPIO_PIN);        /* HAL¿âĬÈÏÏÈÇåÖжÏÔÙ´¦Àí»Øµ÷£¬Í˳öʱÔÙÇåÒ»´ÎÖжϣ¬±ÜÃâ°´¼ü¶¶¶¯Îó´¥·¢ */
}

/**
 * @brief       ÖжϷþÎñ³ÌÐòÖÐÐèÒª×öµÄÊÂÇé
                ÔÚHAL¿âÖÐËùÓеÄÍⲿÖжϷþÎñº¯Êý¶¼»áµ÷Óô˺¯Êý
 * @param       GPIO_Pin:ÖжÏÒý½ÅºÅ
 * @retval      ÎÞ
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(20);      /* Ïû¶¶ */
    switch(GPIO_Pin)
    {
        case KEY0_INT_GPIO_PIN:
            if (KEY0 == 0)
            {
                LED0_TOGGLE();  /* LED0 ״̬ȡ·´ */ 
                LED1_TOGGLE();  /* LED1 ״̬ȡ·´ */ 
            }
            break;
        case KEY1_INT_GPIO_PIN:
            if (KEY1 == 0)
            {
                LED0_TOGGLE();  /* LED0 ״̬ȡ·´ */ 
            }
            break;
        case WKUP_INT_GPIO_PIN:
            if (WK_UP == 1)
            {
                BEEP_TOGGLE();  /* ·äÃùÆ÷״̬ȡ·´ */ 
            }
            break;
    }
}

/**
 * @brief       ÍⲿÖжϳõʼ»¯³ÌÐò
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void extix_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;

    KEY0_GPIO_CLK_ENABLE();                                  /* KEY0ʱÖÓʹÄÜ */
    KEY1_GPIO_CLK_ENABLE();                                  /* KEY1ʱÖÓʹÄÜ */
    WKUP_GPIO_CLK_ENABLE();                                  /* WKUPʱÖÓʹÄÜ */

    gpio_init_struct.Pin = KEY0_INT_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);    /* KEY0ÅäÖÃΪϽµÑØ´¥·¢ÖÐ¶Ï */

    gpio_init_struct.Pin = KEY1_INT_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);    /* KEY1ÅäÖÃΪϽµÑØ´¥·¢ÖÐ¶Ï */
    
    gpio_init_struct.Pin = WKUP_INT_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_IT_RISING;             /* ÉÏÉýÑØ´¥·¢ */
    gpio_init_struct.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(WKUP_GPIO_PORT, &gpio_init_struct);        /* WKUPÅäÖÃΪϽµÑØ´¥·¢ÖÐ¶Ï */

    HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 2);               /* ÇÀÕ¼0£¬×ÓÓÅÏȼ¶2 */
    HAL_NVIC_EnableIRQ(KEY0_INT_IRQn);                       /* ʹÄÜÖжÏÏß4 */

    HAL_NVIC_SetPriority(KEY1_INT_IRQn, 1, 2);               /* ÇÀÕ¼1£¬×ÓÓÅÏȼ¶2 */
    HAL_NVIC_EnableIRQ(KEY1_INT_IRQn);                       /* ʹÄÜÖжÏÏß3 */

    HAL_NVIC_SetPriority(WKUP_INT_IRQn, 2, 2);               /* ÇÀÕ¼2£¬×ÓÓÅÏȼ¶2 */
    HAL_NVIC_EnableIRQ(WKUP_INT_IRQn);                       /* ʹÄÜÖжÏÏß0 */
}

(二进制乱码错乱中)俗话说不写标注的程序猿不是好猴(手动@某人)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值