一. 学习中断原理
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中进行编译,再烧录进板子当中,就实现了结果