这是一个学习作品,新手学习,多多指教。
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)
有不妥之处,欢迎指正。
|