FTHR-G0001按键触发中断点灯
任务:通过按键触发FTHR-G0001下降沿中断,在中断服务函数中控制LED亮灭。硬件原理图如下。
LED原理图
按键原理图
代码详细解:
#include "exti_interrupt.h"
#include "main.h" //首先调用必要的函数包
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // 定义GPIO初始化结构体变量,用于存储GPIO配置参数
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); // 使能GPIOA外设的时钟
GPIO_StructInit(&GPIO_InitStruct); // 用默认值填充GPIO初始化结构体
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; // 配置GPIO引脚:选择GPIOA的第11号引脚
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 配置IO口工作模式,推挽输出可以输出高、低电平
GPIO_Init(GPIOA, &GPIO_InitStruct);//从这里开始,就可以设置PA11输出高低电平了
GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_SET);
}
void EXTI2_Configure()
{
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//注意这里官方历程是GPIO_Mode_IPD,默认下拉电阻,导致无法检测按键传来的下降沿
GPIO_Init(GPIOA, &GPIO_InitStruct);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2);
EXTI_StructInit(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line = EXTI_Line2;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI2_3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0x01;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
int main(void)
{
GPIO_init();
EXTI2_Configure();
while (1)
{
}
}
/*
中断服务函数
*/
void EXTI2_3_IRQHandler(void)
{
if (RESET != EXTI_GetITStatus(EXTI_Line2))
{
GPIOA->ODR ^= GPIO_Pin_11; //ODR是GPIO的输出数据寄存器,直接对他改写,就是操控IO口
EXTI_ClearITPendingBit(EXTI_Line2);
}
}

