学习stm32中断原理和开发编程方法

一. 学习中断原理

1.什么是中断

STM32中断串口口是一种基于中断的串行通信接口,它可以在两个不同的系统之间传输数据。它的工作原理是:当STM32处理器检测到串口口接收到的数据时,它会触发一个中断,这个中断会被STM32处理器捕获,然后处理器会对接收到的数据进行处理,并将处理结果发送给串口口发送端。

2.中断的过程

1.中断源发出中断请求
2.保存现场
3.执行具体的中断处理函数
4.从中断中返回
5.恢复现场
在这里插入图片描述

3.中断类型

可屏蔽中断(maskable interrupt):这是硬件中断的一类。可通过中断屏蔽寄存器中设定位掩码来实现。
非可屏蔽中断(non-maskable interrupt,NMT):这也是硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。
处理器间中断(interprocessor interrupt):一种特殊的硬件中断。由处理器发出,被其他处理器接收。仅见于多处理器系统,以便于处理器之间通讯或同步。
伪中断(spurious interrupt):一类不希望被产生的硬件中断。发生的原因有很多种,比如中断线路上信号异常,或是中断请求设备本身有问题。
软件中断:是一条CPU指令,用于自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态的子例程,它常被用做实现系统调用。

二. 按键中断点亮LED灯

1.环境搭建

选择图示芯片
在这里插入图片描述
点击如图三色方块进行添加文件
在这里插入图片描述

2.代码实现

LED.c

//led.h
#ifndef __LED_H
#define __LED_H
 
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
 
#endif
 
//led.h
#include "stm32f10x.h"                 
 
 
void LED_Init(void)
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		
	
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						
	
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1);				
}
 
 
void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);		
}
 
void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);		
}
 
void LED1_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)		//获取输出寄存器的状态,如果当前引脚输出低电平
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);					
	}
	else													
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);					
	}
}
 

key

//key.h
#ifndef __KEY_H
#define __KEY_H
 
void Key_Init(void);
 
#endif
 
//key.c
#include "stm32f10x.h"                 
#include "Delay.h"
 
 
void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);						
	
	/*AFIO选择中断引脚*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
	
	/*EXTI初始化*/
	EXTI_InitTypeDef EXTI_InitStructure;						
	EXTI_InitStructure.EXTI_Line = EXTI_Line13;					
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		
	EXTI_Init(&EXTI_InitStructure);								
	
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);			
	
 
	NVIC_InitTypeDef NVIC_InitStructure;						
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			
	NVIC_Init(&NVIC_InitStructure);								
}
 

main.c

#include "stm32f10x.h"
#include "LED.h"
#include "exti_key.h"

//编写中断服务程序
void EXTI3_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line3) != RESET)
	{
		GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))));
		EXTI_ClearITPendingBit(EXTI_Line3);
	}
}

int main(void)
{
	LED_Init();
	GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	EXTI_Key_Init();
	while(1)
	{
	
	}
}

 

3.实物展示

在这里插入图片描述
在keil中进行编译,再烧录进板子当中,就实现了结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值