STM32F407-外部中断

中断控制器

STM32的中断控制器是NVIC,可嵌套式中断控制。
中断优先级。一共有四位来表示,且这四位又被分为 组优先级和子优先级

外部中断

stm32中存在外部中断,管理着所有GPIO口的中断响应,有外部中断0-15,对应着GPIOX的 0-15端口。即外部中断线0 可以是PA0、PB0、PC0.。。。。,使用时进行配置,告诉外部中断使用的是哪个GPIO的哪个口。
外部中断 exti 在总线APB2上,使用时要先打开APB2总线时钟。

代码

使用四个按键来触发中断;按键连接在 PF9/8/7 PE6

void my_exti_init(void)
{
		//使能外部中断,外部中断 EXTI 在APB2总线上
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	
	//配置EXTI,告诉外部中断,哪些端口要开启中断
	
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource9);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource8);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource6);
	
	//配置 F9 F8 F7 E6,这四个按键所在的GPIO口的中断,这样按下按键就会触发中断
	
	//配置NVIC 中断相关的参数
	
	//1)配置NVIC的分组方式
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//2)调用NVIC的初始化函数	
	NVIC_InitTypeDef Nvic_Value;
	Nvic_Value.NVIC_IRQChannel = EXTI9_5_IRQn;//选择中断号
	Nvic_Value.NVIC_IRQChannelCmd = ENABLE;//使能该中断
	Nvic_Value.NVIC_IRQChannelPreemptionPriority = 2;//配置组优先级的级别
	Nvic_Value.NVIC_IRQChannelSubPriority = 2;//配置子优先级的级别
	NVIC_Init(&Nvic_Value);//按照上述配置初始化NVIC控制器
	
	
	//配置EXTI相关的初始化参数
	EXTI_InitTypeDef Exti_Value;
	Exti_Value.EXTI_Line = EXTI_Line9 | EXTI_Line8 | EXTI_Line7 | EXTI_Line6;//选择外部中断号
	Exti_Value.EXTI_LineCmd = ENABLE;//使能外部中断
	Exti_Value.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断模式
	Exti_Value.EXTI_Trigger = EXTI_Trigger_Falling;//选择下降沿触发
	EXTI_Init(&Exti_Value);	
}

中断触发时的响应函数

void EXTI9_5_IRQHandler(void)
{
	//判断具体是哪个端口触发了中断,读取每个中断标志位;处理完之后要手动清除中断标志位
	
	if(EXTI_GetITStatus(EXTI_Line9) == SET)//判断是否是由EXTI9触发的中断
	{
		handler0();//调用处理函数
		EXTI_ClearITPendingBit(EXTI_Line9);//清除EXTI9的中断标志位
	}
	if(EXTI_GetITStatus(EXTI_Line8) == SET)
	{
		handler1();
		EXTI_ClearITPendingBit(EXTI_Line8);
	}
	if(EXTI_GetITStatus(EXTI_Line7) == SET)
	{
		handler2();
		EXTI_ClearITPendingBit(EXTI_Line7);
	}
	if(EXTI_GetITStatus(EXTI_Line6) == SET)
	{
		handler3();
		EXTI_ClearITPendingBit(EXTI_Line6);
	}
		
}

handler 为自定义的响应函数,由main函数传递过来

typedef void (*my_callback_func)(void);


void my_exti_set_callback_func(my_callback_func func0, \
my_callback_func func1,\
my_callback_func func2,\
my_callback_func func3)
{
	handler0 = func0;
	handler1 = func1;
	handler2 = func2;
	handler3 = func3;
}

main函数

int main(void)
{
	my_led_init();
	key_init();
	my_systemclk_init();
	my_exti_init();
	
	my_exti_set_callback_func(func0,func1,func2,func3);
	while(1) ;
	
}


void func0(void)
{
	my_led_on_num(0);
}
void func1(void)
{
	my_led_on_num(1);
}
void func2(void)
{
	my_led_on_num(2);
}
void func3(void)
{
	my_led_off();
}
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值