中断是一种机制,通过这种机制,I/O或指令可以暂停处理器的正常执行,并像具有最高优先级一样先执行自己的任务。也就是说,当外部中断发生时(比如来自某个传感器),处理器暂停其正在执行,首先提供中断服务,然后继续其正常执行。
为了了解 STM32F103C8 中的中断,我们将使用按钮作为外部中断。在这里,我们让一个变量从 0 开始每秒增1,并将其显示在16x2 LCD上,每当按下按钮时,LED 亮起,LCD 显示屏会显示 INTERRUPT。
中断类型和 ISR(中断服务程序)
中断大致可以分为两类:
1.硬件中断: 如果到处理器的信号来自某些外部设备,例如按钮或传感器,或者来自其他信号并告诉处理器执行 ISR 中存在的特定任务的硬件设备,则称为硬件中断。
2.软件中断: 由软件指令产生的中断。
ISR 中断服务程序:
中断服务程序或中断处理程序是其中包含少量指令的事件,当发生中断时,处理器首先执行 ISR 中的这些代码,然后再继续执行中断之前正在执行的任务。
STM32中的中断语法
在Arduino IDE中,启用ISR具有以下语法attachInterrupt (digitalPinToInterrupt(pin), ISR, mode),同样可以在 STM32 中使用,因为本文正是使用 arduino IDE 上传代码。
digitalPinToInterrupt(pin)
在STM32F103C8中,任何GPIO引脚都可以用于中断。我们只需要指定用于中断的输入引脚。但是,当同时使用多个中断时,我们可能需要遵循一些限制。
ISR 中断子程序
它是一个在发生外部中断时调用的中断处理函数。它没有参数和返回值。
mode:触发中断的方式条件
上升沿触发:当引脚从 低电平变为 高电平时触发中断。
下降沿触发:当引脚从 高电平变为 低电平时触发中断。
双边沿触发:当引脚从 低电平变为 高电平或 高电平变为 低电平时触发中断(即,当引脚电平发生变化时)。
使用中断注意事项
中断服务程序功能 (ISR) 必须尽可能短。
避免在ISR中使用delay函数。
威廉希尔官方网站 图和连接说明
按钮引脚的一侧连接到 STM32 的 3.3V,另一侧通过下拉电阻连接到 STM32 的输入引脚(PA0)。
关于使用下拉电阻器,当按下或释放按钮时,微控制器只会在其输入端获得高电平或低电平。如果没有下拉电阻,按钮没有按下,输入端状态不确定(不是高也不是低),并且容易受外界影响,输入端电平可能是浮动随机值(忽高忽低)。
STM32F103C8与LCD的连接
下表显示了 LCD (1602) 和 STM32F103C8 微控制器之间的引脚连接。
STM32F103C8中断编程
程序很简单,使用Arduino IDE编程。
我们将一个变量从 0 开始每秒自增1并将其显示在 1602 LCD 上,每当按下按钮时,LED亮起,LCD 显示屏会显示“Interrupt”,松开按钮LED熄灭。
//声明LCD 引脚连接到STM32 的哪个引脚
const int rs= PB10,en= PB11,d4= PB0,d5= PB1,d6= PC13,d7= PC14;
#include //LCD 库
LiquidCrystal lcd (rs,en,d4,d5,d6,d7);//初始化LCD
volatile boolean ledOn = false; //LED状态标识
void setup()
{
lcd.begin(16,2);// 将 LCD 设置为 16x2 类型
lcd.print("Hello World"); //LCD 显示 Hello World!
delay(2000); //延时2秒
lcd.clear(); //清屏
pinMode(PA1,OUTPUT); //将引脚 PA1 设置为输出
pinMode(PA0,INPUT); //将引脚 PA0 设置为输入
int i = 0;
attachInterrupt(PA0,buttonPressed,CHANGE);// 创建外部中断
}
void loop()
{
lcd.clear();//清屏
lcd.print("NUMBER:"); //LCD显示NUMBER:
lcd.print(i);//LCD 显示“i”值
++i; //“i” 自增 1
delay(1000); //延时1秒
}
void buttonPressed() //ISR中断子函数
{
//松开按钮
if(ledOn) //当发生中断时判断LED 状态标识,如果LED是亮起状态
{
ledOn=false; //则设置LED状态标识为熄灭
digitalWrite(PA1,LOW); //同时把PA1设置为低电平,熄灭LED
}
//按下按钮
else // 否则(即如果LED状态标识为熄灭)
{
ledOn = true; //则设置LED状态标识为亮起
digitalWrite(PA1,HIGH); //同时把PA1设置为高电平,点亮LED
lcd.setCursor(0,1); //将光标设置在第一列和第二行
lcd.print("Interrupt"); //LCD显示Interrupt
}
}
全部0条评论
快来发表一下你的评论吧 !