STM32
直播中

敷衍作笑谈

9年用户 941经验值
擅长:制造/封装 连接器 光电显示 接口/总线/驱动 RF/无线
私信 关注
[问答]

如何利用Stm32控制小灯的亮灭?

如何利用STM32控制小灯的亮灭?

回帖(1)

龙慧

2021-11-17 09:34:55
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20
个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿
检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为
中断或者事件,以及触发事件的属性。
目标:用按键控制小灯亮灭,按键1按第一下LED1亮,按第二下LED2亮,按第三下都灭;
按键2按一下两个灯都灭。
引脚连接

1.按键
KEY1-PA0
KEY2-PC13
2.LED
LED1-PB9
LED2-PB8
代码

1.main

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_exti.h"
#include "bsp_SysTick.h"




int main(void)
{
        SysTick_Init();       
        /* LED 端口初始化 */
        LED_GPIO_Config();
        LED1(0);
        LED2(0);
                 
        /* 初始化EXTI中断,按下按键会触发中断,
  *  触发中断会进入stm32f10x_it.c文件中的函数
        *  KEY1_IRQHandler和KEY2_IRQHandler,处理中断.
        */
       
        EXTI_Key_Config();
       
        /* 等待中断,由于使用中断方式,CPU不用轮询按键 */
        while(1)                           
        {
        }


}
2.Stm32f10x-it.c

void SysTick_Handler(void)
{
                TimingDelay_Decrement();       
}


        int i=0;


void KEY1_IRQHandler(void)
       
{
  //确保是否产生了EXTI Line中断
        if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
//                Delay_us( 10000 );
        if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
        {
//        while(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET);
                i++;


        if(i%4==2)
        {
                LED1(1);     
        }  
       
        else if(i%4==1)
        {
                LED2(1);
   
        }
  else if(i%4==0)
        {
                LED1(0);
    LED2(0);
        }
        }  
            //清除中断标志位
                EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}


void KEY2_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
        if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
        {
                i=0;
                LED1(0);               
                LED2(0);
    //清除中断标志位
                EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     
        }  
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分