STM32的中断及是如何使用

描述

中断是一种机制,通过这种机制,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
  }
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分