溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

發(fā)布時間:2021-12-29 10:25:12 來源:億速云 閱讀:137 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么”吧!

1.E53_SC1擴(kuò)展板及其驅(qū)動

關(guān)于E53標(biāo)準(zhǔn)接口

E53接口標(biāo)準(zhǔn)的E取自擴(kuò)展(Expansion)的英文首字母,板子的尺寸為5×3cm,故采用E53作為前綴來命名尺寸為 5×3cm 類型的案例擴(kuò)展板,任何一款滿足標(biāo)準(zhǔn)設(shè)計的開發(fā)板均可直接適配E53擴(kuò)展板。

E53擴(kuò)展板是根據(jù)不同的應(yīng)用場景來設(shè)計的,以最大的程度在擴(kuò)展板上還原真實應(yīng)用場景,不同案例的擴(kuò)展板根據(jù)不同的應(yīng)用場景來命名后綴。例如:E53_SC1,SC是智慧城市(Smart City)的縮寫,SC1表示的是智慧城市中的智慧路燈,再比如SC2則表示的是智慧城市中的智慧井蓋。

E53擴(kuò)展接口在電氣特性上,包含了常用的物聯(lián)網(wǎng)感知層傳感器通信接口,比如5V、3.3V、GND、SPI、UART、IIC、ADC、DAC等等,可以適配各種傳感器,還留有4個普通GPIO,如圖:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

E53_SC1智慧路燈擴(kuò)展板

E53_SC1擴(kuò)展板采用了E53標(biāo)準(zhǔn)接口,包含了一個路燈燈珠,一個BH1750光照強(qiáng)度傳感器,其中路燈燈珠使用普通GPIO控制,BH1750使用IIC接口通信。

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

如果你對該擴(kuò)展板或者BH1750光照強(qiáng)度的驅(qū)動不熟悉,請先閱讀嵌入式基礎(chǔ)教程

2. 移植E53_SC1驅(qū)動到LiteOS

復(fù)制裸機(jī)驅(qū)動文件到LiteOS工程

E53_SC1擴(kuò)展板上的 BH1750 光照強(qiáng)度傳感器使用的是 IIC 通信接口,所以除了復(fù)制 STM32CubeMX 生成的i2c.hi2c.h文件,還需要在此基礎(chǔ)上復(fù)制包含了 BH1750 傳感器驅(qū)動的 E53_SC1 擴(kuò)展板驅(qū)動文件。

在復(fù)制文件的時候,按照上一篇文章中所說的,復(fù)制i2c.h到Inc 文件夾,復(fù)制i2c.c到 Src 文件夾,再復(fù)制自己編寫的驅(qū)動文件E53_SC1.c、E53_SC1.h到 Hardware文件夾。

IoT-Studio中提供的默認(rèn)工程已經(jīng)復(fù)制好了這些文件,無需再次添加,如圖:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

添加驅(qū)動文件路徑

因為 LiteOS 的整個項目工程使用 make 構(gòu)建,所以復(fù)制驅(qū)動文件之后,需要添加驅(qū)動文件的路徑到 makefile 中,加入編譯。

project.mk文件指明了工程中所有文件的路徑:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

在該文件中:

  • C文件路徑

    • HARDWARE_SRC:對應(yīng)Hardware文件夾下的Src文件夾

    • USER_SRC:對應(yīng)Src文件夾

  • 頭文件路徑

    • HARDWARE_INC:對應(yīng)Hardware文件夾下的Inc文件夾

    • USER_INC:對應(yīng)Inc文件夾

如下,E53_SC1 驅(qū)動的底層 I2C 接口代碼i2c.c路徑添加到USER_SRC中:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

E53_SC1 驅(qū)動的底層 I2C 接口代碼i2c.h路徑添加到USER_INC中:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

基于 I2C 驅(qū)動的 E53_SC1 驅(qū)動文件E53_SC1.c添加到HARDWARE_SRC中(默認(rèn)未添加,需要手動添加):

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

基于 I2C 驅(qū)動的 E53_SC1 驅(qū)動文件E53_SC1.h添加到 HARDWARE_INC 中(默認(rèn)未添加,需要手動添加):

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

至此,復(fù)制文件到LiteOS工程中,并將新復(fù)制的文件路徑添加到makefile中,加入工程編譯,就完成了驅(qū)動的移植。

3. E53_SC1裸機(jī)驅(qū)動的使用

初始化E53_SC1擴(kuò)展板

在上一篇文章中詳細(xì)的講述了在LiteOS中初始化設(shè)備的兩種方式:

  • 在系統(tǒng)啟動調(diào)度之前初始化:設(shè)備在系統(tǒng)中隨時可被任意任務(wù)使用

  • 在任務(wù)中初始化:設(shè)備一般只在該任務(wù)中被使用

本文中移植的 E53_SC1 擴(kuò)展板驅(qū)動,不需要多個任務(wù)去操作,只需要傳感器數(shù)據(jù)采集任務(wù)操作即可,所以初始化放在數(shù)據(jù)采集任務(wù)中

操作E53_SC1擴(kuò)展板

接下來首先創(chuàng)建一個文件夾(如果已有,不用再次創(chuàng)建),用于存放本系列教程實驗的代碼:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

在該文件夾中創(chuàng)建一個文件:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

編寫代碼:

#include <osal.h>
#include "lcd.h"
#include "E53_SC1.h"

/* 存放E53_SC1擴(kuò)展板傳感器數(shù)據(jù),可在E53_SC1.h中查看定義 */
E53_SC1_Data_TypeDef E53_SC1_Data;

/* 用于數(shù)據(jù)采集和數(shù)據(jù)處理任務(wù)間同步的信號量 */
osal_semp_t sync_semp;

/* 數(shù)據(jù)采集任務(wù)-低優(yōu)先級 */
static int data_collect_task_entry()
{
    /* 初始化擴(kuò)展板 */
    Init_E53_SC1();

    while (1)
    {
        /* 讀取擴(kuò)展板板載數(shù)據(jù),存到數(shù)據(jù)結(jié)構(gòu)體E53_SC1_Data中 */
        E53_SC1_Read_Data();

        /* 數(shù)據(jù)讀取完畢,釋放信號量,喚醒數(shù)據(jù)處理任務(wù) */
        osal_semp_post(sync_semp);

        /* 任務(wù)睡眠2s */
        osal_task_sleep(2*1000);
    }
}

/* 數(shù)據(jù)處理任務(wù)-高優(yōu)先級 */
static int data_deal_task_entry()
{
    /* lux- 當(dāng)次數(shù)據(jù),old-lux-上次數(shù)據(jù) */
    int lux = 0, old_lux = 0;

	/* LCD清屏,防止干擾顯示 */
    LCD_Clear(WHITE);

    while (1)
    {
        /* 等待信號量,未等到說明數(shù)據(jù)還未采集,阻塞等待 */
        osal_semp_pend(sync_semp, cn_osal_timeout_forever);

        /* 信號量等待,被喚醒,開始處理數(shù)據(jù) */
        old_lux = lux;
        lux = (int)E53_SC1_Data.Lux;
        printf("BH1750 Value is %d\r\n", lux);
        LCD_ShowString(10, 100, 200, 16, 16, "BH1750 Value is:");
        LCD_ShowNum(140, 100, lux, 5, 16);

        /* 閾值為1000,自動點亮或者熄滅路燈 */
        if(old_lux < 1000 && lux > 1000)
        {
            HAL_GPIO_WritePin(SC1_Light_GPIO_Port, SC1_Light_Pin, GPIO_PIN_RESET);
            printf("Street Light OFF!\r\n");
        }
        else if(old_lux > 1000 && lux < 1000)
        {
            HAL_GPIO_WritePin(SC1_Light_GPIO_Port, SC1_Light_Pin, GPIO_PIN_SET);
            printf("Street Light ON!\r\n");
        }
    }
}

/* 標(biāo)準(zhǔn)demo啟動函數(shù),函數(shù)名不要修改,否則會影響下一步實驗 */
int standard_app_demo_main()
{
    /* 創(chuàng)建信號量 */
    osal_semp_create(&sync_semp, 1, 0);

    /* 數(shù)據(jù)處理任務(wù)的優(yōu)先級應(yīng)高于數(shù)據(jù)采集任務(wù) */
    osal_task_create("data_collect",data_collect_task_entry,NULL,0x400,NULL,3);
    osal_task_create("data_deal",data_deal_task_entry,NULL,0x400,NULL,2);
    return 0;
}

然后按照之前的方法,在 user_demo.mk 中將lcd_driver_demo.c文件添加到makefile中,加入編譯:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

最后在.sdkconfig中配置開啟宏定義:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

編譯,燒錄,即可看到實驗現(xiàn)象。

LCD屏幕上顯示當(dāng)前傳感器采集的亮度值,并且每2s更新一次,當(dāng)亮度值低于1000時,E53_SC1擴(kuò)展板的路燈自動點亮:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

當(dāng)亮度值高于1000時,E53_SC1擴(kuò)展板的路燈自動熄滅:

LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么

另外,打開IoT-Studio自帶的串口終端,可以查看到串口輸出的工作信息:

linkmain:V1.2.1 AT 10:40:09 ON Dec  5 2019 

BH1750 Value is 220
WELCOME TO IOT_LINK SHELL

LiteOS:/>BH1750 Value is 612
BH1750 Value is 566
BH1750 Value is 14109
Street Light OFF!
BH1750 Value is 14814
BH1750 Value is 178
Street Light ON!
BH1750 Value is 179
……

到此,相信大家對“LiteOS裸機(jī)驅(qū)動移植03-E53_SC1擴(kuò)展板的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI