中断是一种机制,通过这种机制,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);//初始化lcdvolatile 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 }}
台积电将宣布日本第二座晶圆厂!
Crowbar经典应用电路分析
树莓派4每个引脚的作用
超音波3D映射为无人机应用铺路
一文看懂:机床企业积极探索智能制造
STM32的中断及是如何使用
全球汽车芯片供应呈现高度紧张状态
Flex电源模块推出BMR469系列产品双输出数字PoL稳压器的介绍
TTL电路管脚电路图
华为回应安全质疑:在美装机量为零不构成威胁
甲骨文2018全年财报:总营收398.31亿美元,与上一年相比增长6%
新能源重卡市场浪潮涌动,上汽红岩全面布局“三纵三横”
e络盟宣布携手TE Connectivity 推出面向运输应用的独特高压元件
新品|KMeterISO Unit 上线
新加坡电信M1和诺基亚完成了small cells试验下载速度接近1Gbps
索尼推出首款PD快充充电器 相较传统USB充电器五倍的电力
土壤肥料快速检测仪的用途是什么
思特威发布CMOS图像传感器SC038HGS
COLED推出海报屏系统解决方案
盘点工业4.0在医疗行业中的应用