若PAS 连接一LED指示灯(PA5 为0时灯亮,为1时灯灭),PB5 连接一按钮开关(开关闭合时为低电平)。现欲实现开关每按一次,LED 的状态翻转一次。请用中断方式编写实现该功能的代码。
时间: 2023-05-14 12:06:18 浏览: 77
以下是实现该功能的代码:
```c
#include "stm32f10x.h"
void EXTI9_5_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line5) != RESET) {
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)));
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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
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;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while (1) {
}
}
```
该代码使用了外部中断来检测按钮的状态变化,当按钮被按下时,中断服务程序会被调用,然后翻转 LED 的状态。在主循环中,程序不做任何事情,只是等待中断的发生。