AiPi-Eyes-S1是安信可開源團(tuán)隊(duì)專門為Ai-M61-32S設(shè)計(jì)的一款開發(fā)板,支持WiFi6、BLE5.3。所搭載的Ai-M61-32S 模組具有豐富的外設(shè)接口,具體包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太網(wǎng) (EMAC)、SD/MMC(SDH)、SPI、UART、I2C、I2S、PWM、GPDAC、GPADC、ACOMP 和 GPIO 等。
AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。
產(chǎn)品資料:https://docs.ai-thinker.com/eyes
從零開始學(xué)習(xí)小安派:
1、零基礎(chǔ)開發(fā)小安派-Eyes-S1【入門篇】——初識小安派-Eyes-S1
2、零基礎(chǔ)開發(fā)小安派-Eyes-S1【入門篇】——安裝VMware與Ubuntu
3、入門篇:零基礎(chǔ)開發(fā)小安派-Eyes-S1——新建工程并燒錄調(diào)試
4、零基礎(chǔ)開發(fā)小安派-Eyes-S1入門篇——Win下SSH連接Linux
5、零基礎(chǔ)開發(fā)小安派-Eyes-S1【入門篇】——Samba共享文件夾
6、零基礎(chǔ)開發(fā)小安派-Eyes-S1【入門篇】——工程文件架構(gòu)
7、零基礎(chǔ)開發(fā)小安派-Eyes-S1【外設(shè)篇】——GPIO 輸入輸出
上期的 GPIO 輸入輸出編程是基于在 main 函數(shù)中設(shè)置 while 循環(huán)不斷的改變 IO0 的電平,同時(shí)打印 IO1 的電平狀態(tài)。本期了解關(guān)于中斷編程的概念方法。
一、中斷概念了解
我們在常規(guī)的程序中,都是在 main 函數(shù)中設(shè)置 While 函數(shù)不斷運(yùn)行代碼。而中斷的概念則是打斷當(dāng)前的程序,并保護(hù)現(xiàn)場,執(zhí)行另外的程序,而后回到最初打斷的位置,舉個(gè)恰當(dāng)?shù)睦?,比如我們在敲代碼,忽然外賣小哥敲門說外賣到了,于是我們先 ctrl+s 保存,然后去拿完外賣順便吃了回來繼續(xù)敲代碼。敲代碼就是我們的常規(guī)程序(發(fā)量危),中斷源就是外賣小哥的敲門聲,而拿外賣吃外賣的過程就是中斷服務(wù)函數(shù)。這就是中斷的基本概念。
為什么要使用中斷?中斷是為了應(yīng)對各種突發(fā)事件,如敲代碼的時(shí)候忽然有人敲門送外賣。正如使用按鍵掃描檢測和外部中斷的區(qū)別來說,按鍵掃描會一直在循環(huán)中持續(xù)掃描按鍵在狀態(tài),正如我們在敲代碼時(shí),因?yàn)椴恢劳赓u什么時(shí)候送來,還要時(shí)不時(shí)看看有沒有人敲門,注意力都用在盯著門上了,怎么能認(rèn)真敲代碼。而中斷正如我們已經(jīng)設(shè)置好了耳朵,我們可以認(rèn)真敲代碼,當(dāng)有人敲門時(shí)我們再自然而然的去開門即可,不需要一直盯著門看。
1.中斷源
在上面的例子中,中斷源就是外賣小哥的敲門聲。我們在開門之后他就會停止敲門,但是實(shí)際上我們還是需要手動的告訴 MCU 不用敲門了,這也就是要清除中斷源的操作。
2.中斷服務(wù)函數(shù)
中斷服務(wù)函數(shù),也就是我們觸發(fā)中斷后需要執(zhí)行的操作,這里的吃外賣過程就是中斷服務(wù)函數(shù)的執(zhí)行過程。一般會在中斷服務(wù)函數(shù)內(nèi)清除中斷源,也就是讓外賣小哥別敲門了。
二、中斷的配置函數(shù)
1.bflb_gpio_int_init
說明: gpio 外部中斷初始化
void bflb_gpio_int_init(struct bflb_device_s *dev, uint8_t pin, uint8_t trig_mode);
2.bflb_gpio_int_mask
說明:gpio 外部中斷屏蔽開關(guān)
void bflb_gpio_int_mask(struct bflb_device_s *dev, uint8_t pin, bool mask);
3.bflb_gpio_get_intstatus
說明: 獲取 gpio 外部中斷是否觸發(fā)的標(biāo)志
bool bflb_gpio_get_intstatus(struct bflb_device_s *dev, uint8_t pin);
4.bflb_gpio_int_clear
說明: 清除 gpio 中斷標(biāo)志
void bflb_gpio_int_clear(struct bflb_device_s *dev, uint8_t pin);
5.bflb_irq_attach
說明:設(shè)置觸發(fā)中斷后進(jìn)入的回調(diào)函數(shù)
int bflb_irq_attach(int irq, irq_callback isr, void *arg)
6.bflb_irq_enable
說明:中斷使能
void bflb_irq_enable(int irq)
其他:bflb_gpio_uart_init
說明: gpio 配置成 uart 的某一個(gè)功能,可配置的可能參考上一期的 gpio uart function
void bflb_gpio_uart_init(struct bflb_device_s *dev, uint8_t pin, uint8_t uart_func);
三、示例講解
這里還是對 SDK 的中斷示例稍作修改
main
#include "bflb_gpio.h"
#include "bflb_mtimer.h"
#include "board.h"
struct bflb_device_s *gpio; //設(shè)置控制的外設(shè)句柄,取名gpio
void gpio_isr(int irq, void *arg) //中斷服務(wù)函數(shù)
{
bool intstatus = bflb_gpio_get_intstatus(gpio, GPIO_PIN_0);//檢測中斷是否發(fā)生
if (intstatus) { //前面的instatus是bool類型,為true,也就是中斷發(fā)生
bflb_gpio_int_clear(gpio, GPIO_PIN_0);//清除中斷源,也就是例子里的敲門聲
printf("Finished eatingrn");//輸出信息,“吃完了”
}
}
int main(void)
{
board_init();
gpio = bflb_device_get_by_name("gpio"); //給外設(shè)句柄復(fù)位gpio句柄
printf("gpio interruptrn");
bflb_gpio_int_init(gpio, GPIO_PIN_0, GPIO_INT_TRIG_MODE_SYNC_LOW_LEVEL);//第三個(gè)參數(shù)設(shè)置為低電平觸發(fā)
bflb_gpio_int_mask(gpio, GPIO_PIN_0, false);//是否屏蔽中斷,設(shè)置為false
bflb_irq_attach(gpio->irq_num, gpio_isr, gpio);//第二個(gè)參數(shù)為中斷服務(wù)函數(shù)的函數(shù)名
bflb_irq_enable(gpio->irq_num);//中斷使能
while (1) {
printf("I am typing the codern");//在常規(guī)的while程序中輸出“我在敲代碼”
bflb_mtimer_delay_ms(2000);
}
}
效果
當(dāng)正常識別串口信息時(shí),只會每兩秒打印一次“I am typing the code”
當(dāng)我用 IO0 去碰一下 TTL 的 GND 腳,也就是拉低,觸發(fā)了中斷,每進(jìn)入一次中斷會打印一次“Finished eating”
這里打印了許多次,說明我觸發(fā)了多次中斷,畢竟只是使用杜邦線碰一下地,程序的運(yùn)行和檢測是十分快的,所以及時(shí)碰一下還是觸發(fā)了許多次中斷,實(shí)際上使用按鍵會更加靈敏,需要注意的是,不要在中斷中使用 delay 延遲函數(shù)!中斷是為了應(yīng)對突發(fā)狀況,處理的越快越好,而延遲會讓整個(gè)系統(tǒng)暫停在中斷里等待,相當(dāng)于堵塞在這里,直到延遲結(jié)束。
審核編輯 黃宇
-
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52091 -
中斷編程
+關(guān)注
關(guān)注
0文章
5瀏覽量
7392 -
零基礎(chǔ)
+關(guān)注
關(guān)注
0文章
13瀏覽量
2916
發(fā)布評論請先 登錄
相關(guān)推薦
評論