一位萌新为参加robomaster所做的前期准备–stm32基础(二)(按键中断)

一位萌新为参加robomaster所做的前期准备–stm32基础(二)(按键中断)


一、实验目的:同过外部的按键产生外部中断来控制led灯的暗亮。
二、方案:
①实验要用到led,故要运用到初始化gpio等函数(打开led端口时钟,配置gpio等)
②需要运用led相关函数,熄灭led,点亮led
③需要配置按键引脚(初始化,开启时钟,上拉电阻等)
④需要配置外部中断的相关信息及中断优先级
⑤编写中断服务函数
3.流程图:
在这里插入图片描述
3.主要实验代码


```c
int main(){
leds_init();    //配置led相应的引脚
	led_off(LED_1);  //关闭led
	
	exit_Init();    //外部中断函数
  while(1){;
	}

}

//初始化按键的引脚函数
void key_init(void){ 
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);	//打开时钟
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;	//配置IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//设置为上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);}

//初始化led引脚
void leds_init(void){
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG, ENABLE);	//打开时钟
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;	//配置IO口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_Init(GPIOG, &GPIO_InitStructure);	}

//初始化中断函数及优先级配置
void exit_Init(void){
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
//定义结构体
	key_init();
	//调用按键的初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//打开时钟	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
	将按键的引脚与中断线连接(设置IO口与中断线的映射关系)

	EXTI_InitStructure.EXTI_Line=EXTI_Line4;
//中断线配置
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
//中断触发事件
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
//中断触发条件
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//使能中断 
	EXTI_Init(&EXTI_InitStructure);
	//对中断进行配置

	NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

//中断服务函数
void EXTI4_IRQHandler(void){

			sw_delay_ms(10);
			if( EXTI_GetITStatus(EXTI_Line4)==SET){
				  led_toggle(LED_1); 
//若中断触发则翻转led灯
				}
					EXTI_ClearITPendingBit(EXTI_Line4);
			}

4.按键检测相关知识
①上拉电阻就是将不确定的信号通过一个电阻钳位在高电平,输入电流,电阻同时起到限流的作用。它的主要功能还是为集电极开路输出型电路输出电流通道。使一个原来不确定电平变高的叫上拉电阻,否则就是下拉电阻.
②开漏输出:实现电平转换,实现”线与“逻辑(I2C等接口总线应用中),利用外电路提高驱动能力,利用上拉电阻提供高电平,显然,没有上拉电阻只能输出低电平。
推挽输出:可以吸电流也可以灌电流,相对于开漏,输出电平取决于IC电源。使输出保持在持续稳定电压值上。
③通用可编程I/O端口”,也就是GPIO。一个GPIO端口至少需要两个寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是通过控制寄存器设置的,通过控制寄存器可以设置每一位引脚的数据流向。
④按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。(该实验中按键消抖的措施就是添加一个延时函数,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。)
⑤所有端口的Pin_0对应着EXTI0,所有端口的Pin_1对应着EXTI1,依次类推
这个EXTI0—EXTI15我们叫做它外部中断线,同一时间内只能有一个IO口映射到外部中断线上面,即在同一时间内,PA0-PG0只能有一个引脚映射到EXTI0上面,但是各个中断线之间不受影响。同时,每一个外部中断线我们都可以单独配置它的触发方式(上升沿、下降沿、双边沿)
在这里插入图片描述
⑥中断服务函数列表:
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数。

EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
外部中断线5~9分配一个中断向量,共用一个服务函数。
外部中断线10~15分配一个中断向量,共用一个中断服务函数。
⑦外部中断常用库函数
⑴void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
设置IO口与中断线的映射关系

⑵void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
初始化中断线:触发方式等

⑶ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
判断中断线中断状态,是否发生

⑸void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
清除中断线上的中断标志位

触发方式,可以是下降沿触发 EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发EXTI_Trigger_Rising_Falling
数字电路中,数字电平从高电平(数字"1")变为低电平(数字"0")的那一瞬间叫作下降沿。
⑧STM32 的所有 GPIO 都引入到 EXTI 外部中断线上,使得所有的 GPIO 都能作为外部中断的输入源。所以如果把 GPIO 用作 EXTI 外部中断时,还需要开启 AFIO 时钟。

5.总结
本次实验通过按键触发中断进而对led灯进行控制,本次重点为对外部中断函数的配置,(打开复用时钟,IO口与中断线的映射,中断相关信息的配置,优先级等),以及中断服务函数的编写
外部中断的步骤:
1、初始化IO口为输入。
GPIO_Init();
2、开启IO口复用时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3、设置IO口与中断线的映射关系。
void GPIO_EXTILineConfig();
4、初始化线上中断,设置触发条件等。
EXTI_Init();
5、配置中断分组(NVIC),并使能中断。
NVIC_Init();
6、编写中断服务函数。
EXTIx_IRQHandler();
7、清除中断标志位
EXTI_ClearITPendingBit();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值