找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1352|回复: 1
打印 上一主题 下一主题
收起左侧

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)
有不妥之处,欢迎指正。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:899981 发表于 2023-12-15 09:20 | 只看该作者
兄弟在不?有休眠的例程吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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