/*
中断方式按键点灯实验
按键,A口0脚输入
led,B口0脚输出
开机led灯亮
按一下灭再按一下亮
*/
#include "stm32f10x.h"
void EXTI0_IRQHandler(void) //中断处理函数
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //确实中断事件
{
if (!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)) //检测led亮
GPIO_SetBits(GPIOB,GPIO_Pin_0);//关闭led
else GPIO_ResetBits(GPIOB,GPIO_Pin_0);//打开led
EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志
}
}
int main(void)
{
GPIO_InitTypeDef gpiojiegouti;//定义输入输出结构体
EXTI_InitTypeDef extijiegouti;//定义外部中断结构体
NVIC_InitTypeDef nvicjiegouti;//定义中断控制结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//打开AB端口外部中断时钟
//端口输入输出配置
gpiojiegouti.GPIO_Pin=GPIO_Pin_0;//0号引脚
gpiojiegouti.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
gpiojiegouti.GPIO_Speed=GPIO_Speed_10MHz;//输出速度
GPIO_Init(GPIOB, &gpiojiegouti);//设置B端口
gpiojiegouti.GPIO_Mode=GPIO_Mode_IN_FLOATING;//悬浮输入
GPIO_Init(GPIOA, &gpiojiegouti);//设置A端口
//外部中断事件配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//A口0脚中断源
extijiegouti.EXTI_Line = EXTI_Line0;//0号外部中断线
extijiegouti.EXTI_Mode = EXTI_Mode_Interrupt;//外部中断模式
extijiegouti.EXTI_Trigger = EXTI_Trigger_Rising;//上升中断
extijiegouti.EXTI_LineCmd = ENABLE;//外部中断线开通
EXTI_Init(&extijiegouti);//设置中断寄存器
//中断控制器配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//第一组优先级
nvicjiegouti.NVIC_IRQChannel = EXTI0_IRQn;//中断通道
nvicjiegouti.NVIC_IRQChannelPreemptionPriority = 1;//配置抢先优先级
nvicjiegouti.NVIC_IRQChannelSubPriority = 1;//配置子优先级
nvicjiegouti.NVIC_IRQChannelCmd = ENABLE;//打开通道
NVIC_Init(&nvicjiegouti); //设置中断控制器
while(1) //这个不要漏掉
{
}
} |