STM32
直播中

史晓明

7年用户 910经验值
私信 关注
[问答]

怎么实现STM32按键按下后实现LED的翻转?

怎么实现STM32按键按下后实现LED的翻转?

回帖(1)

陈浩

2021-11-17 09:36:17
(1)实验内容

当按键按下后LED翻转
(2)原理图

LED连接PB0,按键为PA1
我使用的是洋桃开发板:





(3)代码


#include "GPIO.h"
#include "stm32f10x.h"
#include "delay.h"
void GPIO_IO_Iint(void)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;     //定义GPIO结构体
        EXTI_InitTypeDef  EXTI_InitStruct;                 //定义中断结构体
        NVIC_InitTypeDef  NVIC_InitStruct;                 //定义NVIC结构体
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       //使能GPIOA时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);      //配置端口中断需要启用复用时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);//定义PA1中断
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                    //指定引脚1
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;            //设置输出速率50MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //设置上拉输入,高电平
        GPIO_Init(GPIOA, &GPIO_InitStructure);                       //初始化外设GPIOA寄存器     


        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                         //设置分组状态
        NVIC_InitStruct.NVIC_IRQChannel=EXTI1_IRQn;                       //中断线-中断源选择
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;                           //IRQ通道被使能
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;     //抢占优先级2
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;            //子优先级(响应优先级) 2
        NVIC_Init(& NVIC_InitStruct);
       
        EXTI_InitStruct.EXTI_Line=EXTI_Line1;                                          //定义中断线
        EXTI_InitStruct.EXTI_LineCmd=ENABLE;                              //中断使能
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;                    //使能产生中断
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;          //下降沿触发中断
        EXTI_Init(& EXTI_InitStruct);                                                        //初始化外设中断寄存器
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    //使能GPIOB时钟      
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                   //指定引脚0                     
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出      
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //设置输出速率50MHz
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                        //初始化外设GPIOA寄存
}   
void EXTI1_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line1)!=RESET)//中断标志位检测
        {
                delay_ms(10);
                GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0))); //LED翻转
        }
        EXTI_ClearITPendingBit(EXTI_Line1);//清除中断标志位
}
mani.c

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "GPIO.h"


int main (void){
        GPIO_IO_Iint();
        while(1){}
}
举报

更多回帖

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