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_ST1擴展板採用了E53標準接口,包含了一個GPS模塊L80-R,一個無源蜂鳴器,一個LED,其中無源蜂鳴器使用定時器輸出PWM信號控制,LED使用普通GPIO控制,GPS模塊的數據使用 USART 讀取。函數
本文中所使用的驅動文件,直接將用於產生PWM的定時器TIM16初始化配置代碼和ADC初始化配置代碼,因此無需複製其它底層文件。post
IoT-Studio中提供的默認工程已經包含了該驅動文件,無需再次添加,如圖:spa
由於 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
至此,複製文件到LiteOS工程中,並將新複製的文件路徑添加到makefile中,若是開啓了該demo,則加入工程編譯,就完成了驅動的移植。
在第一篇文章中詳細的講述了在LiteOS中初始化設備的兩種方式:
本文中移植的 E53_ST1 擴展板驅動,不須要多個任務去操做,只須要傳感器數據採集任務操做便可,因此初始化放在數據採集任務中。
接下來首先建立一個文件夾(若是已有,不用再次建立),用於存放本系列教程實驗的代碼:
在該文件夾中建立一個文件:
編寫代碼:
#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中,加入編譯:
最後在.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! ……