小熊派華爲物聯網操做系統LiteOS裸機驅動移植04-E53_IA1擴展板驅動及使用

1.E53_IA1擴展板及其驅動

關於E53標準接口

E53接口標準的E取自擴展(Expansion)的英文首字母,板子的尺寸爲5×3cm,故採用E53做爲前綴來命名尺寸爲 5×3cm 類型的案例擴展板,任何一款知足標準設計的開發板都可直接適配E53擴展板。數據結構

E53擴展板是根據不一樣的應用場景來設計的,以最大的程度在擴展板上還原真實應用場景,不一樣案例的擴展板根據不一樣的應用場景來命名後綴。例如:E53_SC1,SC是智慧城市(Smart City)的縮寫,SC1表示的是智慧城市中的智慧路燈,再好比SC2則表示的是智慧城市中的智慧井蓋。app

E53擴展接口在電氣特性上,包含了經常使用的物聯網感知層傳感器通訊接口,好比5V、3.3V、GND、SPI、UART、IIC、ADC、DAC等等,能夠適配各類傳感器,還留有4個普通GPIO,如圖:函數

E53接口電氣特性

E53_IA1智慧農業擴展板

E53_IA1擴展板採用了E53標準接口,包含了一個補光燈,一個BH1750光照強度傳感器,一個小的貼片電機,一個溫溼度傳感器SHT30,一個其中補光燈和貼片電機使用普通GPIO控制,BH1750和SHT30使用IIC接口通訊。post

E53_IA1擴展板

若是你對該擴展闆闆載的BH1750光照強度和溫溼度傳感器驅動不熟悉,請先閱讀嵌入式基礎教程spa

2. 移植E53_IA1驅動到LiteOS

複製裸機驅動文件到LiteOS工程

E53_IA1擴展板上的 BH1750 光照強度傳感器和SHT30溫溼度傳感器使用的是 IIC 通訊接口,因此除了複製 STM32CubeMX 生成的i2c.hi2c.h文件,還須要在此基礎上覆制包含了 BH1750 傳感器驅動和SHT30傳感器驅動的 E53_IA1 擴展板驅動文件。設計

在複製文件的時候,按照上一篇文章中所說的,複製i2c.h到Inc 文件夾,複製i2c.c到 Src 文件夾,再複製本身編寫的驅動文件E53_IA1.cE53_IA1.h到 Hardware文件夾。3d

IoT-Studio中提供的默認工程已經複製好了這些文件,無需再次添加,如圖:code

E53_IA1擴展板驅動

添加驅動文件路徑

由於 LiteOS 的整個項目工程使用 make 構建,因此複製驅動文件以後,須要添加驅動文件的路徑到 makefile 中,加入編譯。blog

project.mk文件指明瞭工程中全部文件的路徑:教程

project.mk文件

在該文件中:

  • C文件路徑

    • HARDWARE_SRC:對應Hardware文件夾下的Src文件夾
    • USER_SRC:對應Src文件夾
  • 頭文件路徑

    • HARDWARE_INC:對應Hardware文件夾下的Inc文件夾
    • USER_INC:對應Inc文件夾

以下,E53_IA1 驅動的底層 I2C 接口代碼i2c.c路徑添加到USER_SRC中:

I2C驅動代碼

E53_IA1 驅動的底層 I2C 接口代碼i2c.h路徑添加到USER_INC中:

I2C驅動頭文件路徑

由於SC1和IA1的驅動中都包含BH1750的驅動,因此添加的時候須要注意去掉E53_SC1 的驅動文件 E53_SC1.cE53_SC1.h,不然會引發衝突。

基於 I2C 驅動的 E53_IA1 驅動文件E53_IA1.c添加到HARDWARE_SRC中(默認未添加,須要手動添加):

E53_IA1驅動文件

基於 I2C 驅動的 E53_IA1 驅動文件E53_IA1添加到 HARDWARE_INC 中(默認未添加,須要手動添加):

E53_IA1驅動頭文件路徑

至此,複製文件到LiteOS工程中,並將新複製的文件路徑添加到makefile中,加入工程編譯,就完成了驅動的移植。

3. E53_IA1裸機驅動的使用

初始化E53_IA1擴展板

在第一篇文章中詳細的講述了在LiteOS中初始化設備的兩種方式:

  • 在系統啓動調度以前初始化:設備在系統中隨時可被任意任務使用
  • 在任務中初始化:設備通常只在該任務中被使用

本文中移植的 E53_IA1 擴展板驅動,不須要多個任務去操做,只須要傳感器數據採集任務操做便可,因此初始化放在數據採集任務中

操做E53_IA1擴展板

接下來首先建立一個文件夾(若是已有,不用再次建立),用於存放本系列教程實驗的代碼:

新建文件夾

文件夾名稱

在該文件夾中建立一個文件:

建立Demo文件

編寫代碼:

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

/* 存放E53_IA1擴展板傳感器數據,可在E53_IA1.h中查看定義 */
E53_IA1_Data_TypeDef E53_IA1_Data;

/* 用於數據採集和數據處理任務間同步的信號量 */
osal_semp_t sync_semp;

/* 數據採集任務-低優先級 */
static int data_collect_task_entry()
{
    /* 初始化擴展板 */
    Init_E53_IA1();

    while (1)
    {
        /* 讀取擴展闆闆載數據,存到數據結構體E53_IA1_Data中 */
        E53_IA1_Read_Data();

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

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

/* 數據處理任務-高優先級 */
static int data_deal_task_entry()
{
    /* lux- 當次數據,old-lux-上次數據 */
    int lux = 0, old_lux = 0;
    int temperature = 0, old_temperature = 0;;
    int humidity;

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

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

        /* 信號量等待,被喚醒,開始處理數據 */
        //處理光照強度
        old_lux = lux;
        lux = (int)E53_IA1_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(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
            printf("Light OFF!\r\n");
        }
        else if(old_lux > 1000 && lux < 1000)
        {
            HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
            printf("Light ON!\r\n");
        }

        //處理溼度數據
        humidity = E53_IA1_Data.Humidity;
        printf("Humidity is %d\r\n", humidity);
        LCD_ShowString(10, 120, 200, 16, 16, "Humidity: ");
        LCD_ShowNum(140, 120, humidity, 5, 16);

        //處理溫度數據
        old_temperature = temperature;
        temperature = E53_IA1_Data.Temperature;
        printf("Temperature is %d\r\n", temperature);
        LCD_ShowString(10, 140, 200, 16, 16, "Temperature: ");
        LCD_ShowNum(140, 140, temperature, 5, 16);

        /* 溫度閾值爲30,自動開啓或者關閉電機 */
        if(old_temperature < 30 && temperature >= 30)
        {
            HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
            printf("Motor ON!\r\n");
        }
        else if(old_temperature >= 30 && temperature < 30)
        {
            HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
            printf("Motor OFF!\r\n");
        }
    }
}

/* 標準demo啓動函數,函數名不要修改,不然會影響下一步實驗 */
int standard_app_demo_main()
{
    /* 建立信號量 */
    osal_semp_create(&sync_semp, 1, 0);

    /* 數據處理任務的優先級應高於數據採集任務 */
    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 中將e51_ia1_driver_demo.c文件添加到makefile中,加入編譯:

user_demo.mk文件

最後在.sdkconfig中配置開啓宏定義:

.sdkconfig文件

編譯,燒錄,便可看到實驗現象。

LCD屏幕上顯示當前傳感器採集的亮度值,溫度值,溼度值,而且每2s更新一次。

當亮度值低於1000時,E53_IA1擴展板的補光燈自動點亮:

補光燈自動點亮

當亮度值高於1000時,E53_IA1擴展板的補光燈自動熄滅:

補光燈自動熄滅

在調節溫度的時候,能夠用手按着SHT30溫溼度傳感器,天乾物燥,務必提早觸摸一下金屬物體,釋放靜電,防止靜電破壞傳感器!

當溫度上升到30°的時候,電機自動啓動,當溫度下降到30°如下時,電機自動關閉。

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

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

BH1750 Value is 237
Humidity is 19
Temperature is 28
WELCOME TO IOT_LINK SHELL

LiteOS:/>BH1750 Value is 1074
Light OFF!
Humidity is 19
Temperature is 29
BH1750 Value is 14086
Humidity is 20
Temperature is 30
Motor ON!
BH1750 Value is 284
Light ON!
Humidity is 21
Temperature is 30
BH1750 Value is 303
Humidity is 21
Temperature is 29
Motor OFF!
……
相關文章
相關標籤/搜索