若PA5连接一 LED 指示灯(PA5为0时灯亮,为1时灯灭),PB5连接一按钮开关(开关闭合时为低电平)。现欲实现开关每按一次, LED 的状态翻转一次。请用中断方式编写实现该功能的代码。
时间: 2023-04-04 07:03:35 浏览: 337
您好,我可以回答这个问题。以下是实现该功能的代码:
#include "stm32f10x.h"
void EXTI9_5_IRQHandler(void) // 定义中断处理函数
{
if (EXTI_GetITStatus(EXTI_Line5) != RESET) // 判断是否是 PB5 的中断
{
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))); // 翻转 PA5 的状态
EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断标志位
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 使能 GPIOA 和 GPIOB 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 配置 PA5 为输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 配置 PB5 为输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line5; // 配置 PB5 的中断
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 配置 PB5 的中断向量
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while (1)
{
// 主循环中不需要做任何事情
}
}
当 PB5 的电平从高电平变为低电平时,会触发 PB5 的下降沿中断,此时会执行 EXTI9_5_IRQHandler 函数。在该函数中,我们判断是否是 PB5 的中断,如果是,则翻转 PA5 的状态。最后,我们清除 PB5 的中断标志位,以便下一次中断能够被触发。在主循环中,我们不需要做任何事情,因为中断会自动触发。
阅读全文