10.STM32外部中断实验

1.IO口外部中断

1.STM32的么一个IO口都可以作为外部中断输入
2.每个外部中断线都可以独立的配置触发方式(上升沿触发,下降沿触发,双边沿触发),触发/屏蔽,专用的状态位。
3.STM32供IO实验的中断线只有16个,但是有32系列的IO口通常有上百多个IO口。会有GPIO与中断线的映射。

2.IO口与中断线的映射

请添加图片描述
中断线选择的IO口有一个专用的寄存器,每四位控制一个中断线选择IO口,故1个中断线可以从16个IO口中选择其中一个IO口,例如外部中断0可以选择PA0-PI0其中一个IO口。
寄存器为SYSCFG_EXTIPx

2.中断向量表

IO口外部中断在中断向量表只分配了七个中断向量,也就是只能有七个中断服务函数。
请添加图片描述
中断服务函数列表
请添加图片描述

3.HAL库配置方法

1.中断线的映射
映射和触发方式都是在GPIO初始化函数中完成
请添加图片描述
设置了上升沿触发或者是下降沿触发就知道了是中断,该IO口作为中断
2.中断服务函数
请添加图片描述

请添加图片描述
和串口中断一样,中断产生后,进入通用函数,后判断是哪个中断引起的,然后才进行回调函数。

4.外部中断的一般配置方法

请添加图片描述

5.对应按键配置请添加图片描述

上拉下拉输入不用讲了,如何触发是看松开时候电平变化的。

6.具体代码

不同按键产生中断条件,然后改变灯
中断配置函数 EXTI.c

#include"EXTI.h"
#include"led.h"
#include"delay.h"
#include"key.h"
void EXTI_Init(void)
{
	   GPIO_InitTypeDef GPIO_Initure;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
    __HAL_RCC_GPIOH_CLK_ENABLE();           //开启GPIOH时钟
    
    GPIO_Initure.Pin=GPIO_PIN_0;            //PA0
    GPIO_Initure.Mode=GPIO_MODE_IT_RISING;      //上升沿触发
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    
    GPIO_Initure.Pin=GPIO_PIN_13;           //PC13
    GPIO_Initure.Mode=GPIO_MODE_IT_FALLING;      //下降沿触发
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);
    
    GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,3
    HAL_GPIO_Init(GPIOH,&GPIO_Initure);
	
		HAL_NVIC_EnableIRQ(EXTI0_IRQn);				//EXTI0
		HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);			
		
		HAL_NVIC_EnableIRQ(EXTI2_IRQn);				//EXTI2
		HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);			
		
		HAL_NVIC_EnableIRQ(EXTI3_IRQn);				//EXTI3
		HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);	

		HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);				//15_10_
		HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3);		
}
void EXTI2_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
}
void EXTI3_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
void EXTI0_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void EXTI15_10_IRQHandler (void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	delay_ms(100);
	switch(GPIO_Pin)
	{
		case GPIO_PIN_0:   //WK_UP
			if(WK_UP==1)
			{
				LED0 = !LED0;
				LED1 = !LED1;
			}
			break;
		case GPIO_PIN_13:  //KEY2
			if(KEY2==0)
			{
				LED0 =  1;
				LED1 =  1;
			}
			
			break;
		case GPIO_PIN_2: //KEY1
			if(KEY1==0)
			{
				LED1 =  1;
				LED0 =  1;
			}
			
			break;
		case GPIO_PIN_3: //KEY0
			if(KEY0==0)
			{
				LED1 =  0;
				LED1 =  0;
			}
			break;
	}
}

main函数

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "EXTI.h"


int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
		EXTI_Init();
    while(1)
    {
				printf("OK\r\n");
				delay_ms(1000);
    }
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值