EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20
个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿
检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为
中断或者事件,以及触发事件的属性。
目标:用按键控制小灯亮灭,按键1按第一下LED1亮,按第二下LED2亮,按第三下都灭;
按键2按一下两个灯都灭。
引脚连接
1.按键
KEY1-PA0
KEY2-PC13
2.LED
LED1-PB9
LED2-PB8
代码
1.main
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_exti.h"
#include "bsp_SysTick.h"
int main(void)
{
SysTick_Init();
/* LED 端口初始化 */
LED_GPIO_Config();
LED1(0);
LED2(0);
/* 初始化EXTI中断,按下按键会触发中断,
* 触发中断会进入stm32f10x_it.c文件中的函数
* KEY1_IRQHandler和KEY2_IRQHandler,处理中断.
*/
EXTI_Key_Config();
/* 等待中断,由于使用中断方式,CPU不用轮询按键 */
while(1)
{
}
}
2.Stm32f10x-it.c
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
int i=0;
void KEY1_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
// Delay_us( 10000 );
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
// while(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET);
i++;
if(i%4==2)
{
LED1(1);
}
else if(i%4==1)
{
LED2(1);
}
else if(i%4==0)
{
LED1(0);
LED2(0);
}
}
//清除中断标志位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
void KEY2_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
{
i=0;
LED1(0);
LED2(0);
//清除中断标志位
EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);
}
}
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20
个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿
检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为
中断或者事件,以及触发事件的属性。
目标:用按键控制小灯亮灭,按键1按第一下LED1亮,按第二下LED2亮,按第三下都灭;
按键2按一下两个灯都灭。
引脚连接
1.按键
KEY1-PA0
KEY2-PC13
2.LED
LED1-PB9
LED2-PB8
代码
1.main
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_exti.h"
#include "bsp_SysTick.h"
int main(void)
{
SysTick_Init();
/* LED 端口初始化 */
LED_GPIO_Config();
LED1(0);
LED2(0);
/* 初始化EXTI中断,按下按键会触发中断,
* 触发中断会进入stm32f10x_it.c文件中的函数
* KEY1_IRQHandler和KEY2_IRQHandler,处理中断.
*/
EXTI_Key_Config();
/* 等待中断,由于使用中断方式,CPU不用轮询按键 */
while(1)
{
}
}
2.Stm32f10x-it.c
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
int i=0;
void KEY1_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
// Delay_us( 10000 );
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
// while(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET);
i++;
if(i%4==2)
{
LED1(1);
}
else if(i%4==1)
{
LED2(1);
}
else if(i%4==0)
{
LED1(0);
LED2(0);
}
}
//清除中断标志位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
void KEY2_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
{
i=0;
LED1(0);
LED2(0);
//清除中断标志位
EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);
}
}
举报