一、前言
這一講,我要講的是外部中斷,也不知道是太簡(jiǎn)單了還是沒有人用,我沒找到比較完整的關(guān)于RT-thread外部中斷的教程,只發(fā)現(xiàn)RT-thread文檔中心的PIN設(shè)備里面有提及中斷相關(guān)的函數(shù)。不管怎樣,我覺得外部中斷平常用的還是很多的,至少我在使用RT-thread之前是經(jīng)常會(huì)用到,好了,廢話不多說,馬上開始進(jìn)入我們的教程。
源碼鏈接
我發(fā)布的所有關(guān)于RT-thread的教程源代碼都在下面這個(gè)鏈接里面,隨著我教程的更新,新的代碼也會(huì)加入進(jìn)去。
教程源碼下載鏈接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取碼:7nsx
二、編程講解
第一步:配置外部中斷
從這個(gè)函數(shù)的描述我們可以很清楚的看到,只要調(diào)用上面這個(gè)函數(shù)就可以配置成外部中斷腳,中斷觸發(fā)的方式,以及回調(diào)函數(shù)(等同于中斷服務(wù)函數(shù)),而且回調(diào)函數(shù)的名稱我們還可以自由定義,不像我們用裸機(jī)程序的時(shí)候,中斷服務(wù)函數(shù)是已經(jīng)固定了的。
第二步:使能中斷
直接調(diào)用下面這個(gè)函數(shù)即可。
第三步:自己定義一個(gè)回調(diào)函數(shù)
因?yàn)镽T-thread的外部中斷沒有固定的中斷服務(wù)函數(shù),所以我們需要自己定義一個(gè),示例如下:
/* 自己定義一個(gè)回調(diào)函數(shù),相當(dāng)于中斷服務(wù)函數(shù) */
void IQR_HANDALE_KEY0(void *args)
{
rt_pin_write(LED0_PIN, PIN_LOW);//點(diǎn)亮LED0
}
三、項(xiàng)目實(shí)戰(zhàn)
因?yàn)檫@個(gè)兩個(gè)函數(shù)原本在pin.c里面就有定義,所以我們也不需要自己去寫,直接調(diào)用就行了。
我這里用兩個(gè)按鍵,KEY0按下,觸發(fā)外部中斷,點(diǎn)亮LED0,KEY1按下,熄滅LED0,示例代碼如下:
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define LED0_PIN GET_PIN(F, 9)
#define LED1_PIN GET_PIN(F, 10)
#define KEY0_PIN GET_PIN(E, 4)
#define KEY1_PIN GET_PIN(E, 3)
/* 自己定義KEY0的回調(diào)函數(shù),相當(dāng)于中斷服務(wù)函數(shù) */
void IQR_HANDALE_KEY0(void *args)
{
rt_pin_write(LED0_PIN, PIN_LOW);//點(diǎn)亮LED0
}
/* 自己定義KEY1的回調(diào)函數(shù),相當(dāng)于中斷服務(wù)函數(shù) */
void IQR_HANDALE_KEY1(void *args)
{
rt_pin_write(LED0_PIN, PIN_HIGH);//熄滅LED0
}
int main(void)
{
int i = 0;
/* 把LED引腳設(shè)置為輸出 */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
/* 先把兩個(gè)燈關(guān)掉 */
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_pin_write(LED1_PIN, PIN_HIGH);
/* 把KEY引腳設(shè)置為輸入 */
rt_pin_mode(KEY0_PIN, PIN_MODE_INPUT);
rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT);
/* 綁定中斷,下降沿模式,回調(diào)函數(shù)名為IQR_HANDALE_KEY0 */
rt_pin_attach_irq(KEY0_PIN, PIN_IRQ_MODE_FALLING, IQR_HANDALE_KEY0, RT_NULL);
/* 使能中斷 */
rt_pin_irq_enable(KEY0_PIN, PIN_IRQ_ENABLE);
/* 綁定中斷,下降沿模式,回調(diào)函數(shù)名為IQR_HANDALE_KEY1 */
rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, IQR_HANDALE_KEY1, RT_NULL);
/* 使能中斷 */
rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);
while (1)
{
rt_pin_write(LED1_PIN, PIN_LOW);//點(diǎn)亮LED1
rt_thread_mdelay(1000);
rt_pin_write(LED1_PIN, PIN_HIGH);//熄滅LED1
rt_thread_mdelay(1000);
}
}
四、結(jié)束語
好了,關(guān)于外部中斷的編程講解就到這里,如果還有什么問題可以私信給我。如果需要本文對(duì)應(yīng)的源碼的話可以在博文前言部分的鏈接下載。
如果覺得這篇文章對(duì)你有用,點(diǎn)贊+關(guān)注支持一下博主唄。
后續(xù)我會(huì)繼續(xù)更新RT-thread入門教程系列,如果感興趣的同學(xué)可以關(guān)注一下博主,謝謝!
RT-thread相關(guān)教程匯總:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891