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

1.E53_ST1擴展板及其驅動

關於E53標準接口

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

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

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

E53接口電氣特性

E53_ST1智慧消防擴展板

E53_ST1擴展板採用了E53標準接口,包含了一個GPS模塊L80-R,一個無源蜂鳴器,一個LED,其中無源蜂鳴器使用定時器輸出PWM信號控制,LED使用普通GPIO控制,GPS模塊的數據使用 USART 讀取。函數

E53_ST1擴展板

2. 移植E53_ST1驅動到LiteOS

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

本文中所使用的驅動文件,直接將用於產生PWM的定時器TIM16初始化配置代碼和ADC初始化配置代碼,因此無需複製其它底層文件。post

IoT-Studio中提供的默認工程已經包含了該驅動文件,無需再次添加,如圖:spa

E53_ST1擴展板驅動

添加驅動文件路徑

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

以前咱們都是在project.mk中直接添加,這裏咱們使用一種更加簡便有效的方法,直接在user_demo.mk中配置,只有當開啓了該demo後,纔會添加這些驅動文件路徑,不會形成衝突:3d

在user_demo.mk中添加以下代碼:code

#example for e53_st1_driver_demo
ifeq ($(CONFIG_USER_DEMO), "e53_st1_driver_demo")    
    user_hardware_src = ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_ST1/*.c} 
    user_hardware_inc = -I ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_ST1}
endif

添加位置以下:blog

user_demo.mk

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

3. E53_ST1裸機驅動的使用

初始化E53_ST1擴展板

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

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

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

操做E53_ST1擴展板

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

新建文件夾

文件夾名稱

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

建立Demo文件

編寫代碼:

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

/* 存放E53_ST1擴展板傳感器數據,可在E53_ST1.h中查看定義 */
E53_ST1_Data_TypeDef E53_ST1_Data;

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

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

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

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

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

/* 數據處理任務-高優先級 */
static int data_deal_task_entry()
{
    char longitude[9];
    char Latitude[9];

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

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

        /* 信號量等待,被喚醒,開始處理數據 */
        sprintf(longitude, "%.5f", E53_ST1_Data.Longitude);
        sprintf(Latitude,  "%.5f", E53_ST1_Data.Latitude);
        printf("Longitude: %s\r\n", longitude);
        printf("Latitude :%s\r\n", Latitude);
        LCD_ShowString(10, 100, 130, 16, 16, "Longitude Value:");
        LCD_ShowString(140, 100, 100, 16, 16, longitude);
        LCD_ShowString(10, 120, 130, 16, 16, "Latitude  Value:");
        LCD_ShowString(140, 120, 100, 16, 16, Latitude);

        /* 接收到GPS信號後,經緯度不爲0,LED亮起,蜂鳴器報警1s */
        if(E53_ST1_Data.Longitude != 0 && E53_ST1_Data.Latitude != 0)
        {
            HAL_GPIO_WritePin(ST1_LED_GPIO_Port, ST1_LED_Pin, GPIO_PIN_RESET);
            E53_ST1_Beep_StatusSet(ON);
            printf("Beep and Light ON!\r\n");
            osal_task_sleep(1000);
            E53_ST1_Beep_StatusSet(OFF);
            printf("Beep 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 中將E53_ST1_driver_demo.c文件添加到makefile中,加入編譯:

user_demo.mk

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

.sdkconfig

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

LCD屏幕上顯示當前GPS採集的經緯度,而且每2s更新一次。

當精度值和緯度值都爲0時,說明還未成功定位,E53_ST1擴展板的LED燈處於熄滅狀態,蜂鳴器處於關閉狀態:

未定位狀態

當精度值和緯度值不爲0時,說明定位成功,E53_ST1擴展板的LED燈亮起,蜂鳴器每2s鳴叫一次:

定位成功狀態

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

linkmain:V1.2.1 AT 17:18:25 ON Dec  8 2019 

Longitude: 0.00000
Latitude :0.00000
WELCOME TO IOT_LINK SHELL

LiteOS:/>Longitude: 0.00000
Latitude :0.00000
Longitude: 0.00000
Latitude :0.00000

……

Longitude: 0.00000
Latitude :0.00000
Longitude: 103.95028
Latitude :36.32555
Beep and Light ON!
Beep OFF!
Longitude: 103.95028
Latitude :36.32555
Beep and Light ON!
Beep OFF!
Longitude: 103.95028
Latitude :36.32555
Beep and Light ON!
Beep OFF!
……
相關文章
相關標籤/搜索