标题: STM32中断-实现EXTI中断-管脚控制灯翻转输出状态 Keil源代码+Proteus仿真 [打印本页]

作者: Ray_杨帆    时间: 2023-5-10 20:05
标题: STM32中断-实现EXTI中断-管脚控制灯翻转输出状态 Keil源代码+Proteus仿真
这是一个学习作品,新手学习,多多指教。
STM32中断-EXTI-实现管脚控制灯翻转输出状态
将PA3管脚接一个按键,作为外部中断线3的输入源,
每次按下该按键产生一个中断,
在中断服务函数中驱动PC9管脚控制LED灯翻转输出状态。

`main`函数中主要实现相关GPIO管脚的配置,EXTI外部中断线的配置和NVIC中断优先级的配置,
代码如下:

GPIO管脚配置
void GPIO_Config(void)
{
        /*定义结构体 */
GPIO_InitTypeDef   GPIO_InitStructure;
        /* 使能GPIOA和GPIOC时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
        /* 配置PC9管脚作为推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*驱动LED*/
GPIO_Init(GPIOC, &GPIO_InitStructure);

        /* 配置PA3作为浮空输入,为外部中断做准备 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

EXTI外部中断线的配置
void EXTI_Config(void)
{
/* 定义结构体*/
        EXTI_InitTypeDef   EXTI_InitStructure;
/* 使能AFIO时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/*  配置PA3管脚作为EXIT线3  */
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);
/* 在EXTI中配置EXTI线3为中断模式,下降沿有效,并使能该配置*/
        EXTI_InitStructure.EXTI_Line = EXTI_Line3;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
}

NVIC中断优先级的配置
void NVIC_Config(void)
{
/* 定义结构体*/
NVIC_InitTypeDef   NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x07;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

中断服务子函数
uint8_t led=1;   /* 声明变量led*/
void EXTI3_IRQHandler(void)  /* EXTI3中断服务函数*/
{
        /* 检测EXTI3是否有效*/        
if(EXTI_GetITStatus(EXTI_Line3)!= RESET) /*中断悬挂标志存在,且没有被屏蔽*/
{        
           led=~led;  /* 状态翻转*/
    if(led ==1)  /* 如果等于1则PC9置位,否则清零*/
                        GPIO_SetBits(GPIOC, GPIO_Pin_9);
                else
                        GPIO_ResetBits(GPIOC, GPIO_Pin_9);
    EXTI_ClearITPendingBit(EXTI_Line3); /* 清除EXTI3的悬起标志位 */
  }
}

其Proteus 8 Professional仿真电路图如下图:


其完整代码包括仿真电路图下载,解压后,选择相应项目文件打开即可。
myproject_exit.7z (338.97 KB, 下载次数: 38)
有不妥之处,欢迎指正。

作者: ZHAOBAO511    时间: 2023-12-15 09:20
兄弟在不?有休眠的例程吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1