赞
踩
(小熊派IoT开发套件全部教程 ↑点击启阅↑)
▷01 | 物联网一站式开发工具 IoT-Studio
▷02 | Hello World
▷03 | 任务管理
▷04 | 信号量(任务同步)
▷05 | 互斥锁(共享资源保护)
▷06 | 内存管理
▷01 | 以LED为例说明裸机驱动移植方法
▷02 | LCD驱动移植及使用
▷03 | E53_SC1智慧路灯扩展板驱动及使用
▷04 | E53_IA1智慧农业扩展板驱动及使用
E53接口标准的E取自扩展(Expansion)的英文首字母,板子的尺寸为5×3cm,故采用E53作为前缀来命名尺寸为 5×3cm 类型的案例扩展板,任何一款满足标准设计的开发板均可直接适配E53扩展板。
E53扩展板是根据不同的应用场景来设计的,以最大的程度在扩展板上还原真实应用场景,不同案例的扩展板根据不同的应用场景来命名后缀。例如:E53_SC1,SC是智慧城市(Smart City)的缩写,SC1表示的是智慧城市中的智慧路灯,再比如SC2则表示的是智慧城市中的智慧井盖。
E53扩展接口在电气特性上,包含了常用的物联网感知层传感器通信接口,比如5V、3.3V、GND、SPI、UART、IIC、ADC、DAC等等,可以适配各种传感器,还留有4个普通GPIO,如图:
E53_SF1扩展板采用了E53标准接口,包含了一个可燃气体传感器MQ-2,一个无源蜂鸣器,一个LED,其中无源蜂鸣器使用定时器输出PWM信号控制,LED使用普通GPIO控制,可燃气体传感器的数据使用ADC读取。
如果你对该扩展板板载的MQ-2传感器和无源蜂鸣器的驱动不熟悉,请先阅读嵌入式基础教程:E53扩展板实验 —— 使用ADC读取气体传感器数据(MQ-2)、E53扩展板实验 —— 使用通用定时器产生PWM驱动蜂鸣器。
如果你对移植裸机驱动到LiteOS的方法还不了解,请先阅读这篇文章:LiteOS裸机驱动移植教程01 | 以LED为例说明裸机驱动移植方法。
本文中所使用的驱动文件,直接将用于产生PWM的定时器TIM16初始化配置代码和ADC初始化配置代码,所以无需复制其它底层文件。
IoT-Studio中提供的默认工程已经包含了该驱动文件,无需再次添加,如图:
因为 LiteOS 的整个项目工程使用 make 构建,所以复制驱动文件之后,需要添加驱动文件的路径到 makefile 中,加入编译。
之前我们都是在project.mk
中直接添加,这里我们使用一种更加简便有效的方法,直接在user_demo.mk
中配置,只有当开启了该demo后,才会添加这些驱动文件路径,不会造成冲突:
在user_demo.mk中添加如下代码:
#example for e53_sf1_driver_demoifeq ($(CONFIG_USER_DEMO), "e53_sf1_driver_demo") user_hardware_src = ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_SF1/*.c} user_hardware_inc = -I ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_SF1}endif
添加位置如下:
至此,复制文件到LiteOS工程中,并将新复制的文件路径添加到makefile中,如果开启了该demo,则加入工程编译,就完成了驱动的移植。
在第一篇文章中详细的讲述了在LiteOS中初始化设备的两种方式:
在系统启动调度之前初始化:设备在系统中随时可被任意任务使用
在任务中初始化:设备一般只在该任务中被使用
本文中移植的 E53_SF1 扩展板驱动,不需要多个任务去操作,只需要传感器数据采集任务操作即可,所以初始化放在数据采集任务中。
接下来首先创建一个文件夹(如果已有,不用再次创建),用于存放本系列教程实验的代码:
在该文件夹中创建一个文件:
编写代码:
#include #include "lcd.h"#include "E53_SF1.h"/* 存放E53_SF1扩展板传感器数据,可在E53_SF1.h中查看定义 */E53_SF1_Data_TypeDef E53_SF1_Data;/* 用于数据采集和数据处理任务间同步的信号量 */osal_semp_t sync_semp;/* 数据采集任务-低优先级 */static int data_collect_task_entry(){ /* 初始化扩展板 */ Init_E53_SF1(); while (1) { /* 读取扩展板板载数据,存到数据结构体E53_SF1_Data中 */ E53_SF1_Read_Data(); /* 数据读取完毕,释放信号量,唤醒数据处理任务 */ osal_semp_post(sync_semp); /* 任务睡眠2s */ osal_task_sleep(2*1000); }}/* 数据处理任务-高优先级 */static int data_deal_task_entry(){ /* smoke_value- 当次数据,old-smoke_value-上次数据 */ int smoke_value = 0, old_smoke_value = 0; /* LCD清屏,防止干扰显示 */ LCD_Clear(WHITE); while (1) { /* 等待信号量,未等到说明数据还未采集,阻塞等待 */ osal_semp_pend(sync_semp, cn_osal_timeout_forever); /* 信号量等待,被唤醒,开始处理数据 */ old_smoke_value = smoke_value; smoke_value = (int)E53_SF1_Data.Smoke_Value; printf("Smoke Value is %d\r\n", smoke_value); LCD_ShowString(10, 100, 200, 16, 16, "Smoke Value is:"); LCD_ShowNum(140, 100, smoke_value, 5, 16); /* 阈值为100,自动打开或关闭LED和蜂鸣器 */ if(old_smoke_value 100 && smoke_value > 100) { E53_SF1_LED_StatusSet(ON); E53_SF1_Beep_StatusSet(ON); printf("Beep and Light ON!\r\n"); } else if(old_smoke_value > 100 && smoke_value 100) { E53_SF1_LED_StatusSet(OFF); E53_SF1_Beep_StatusSet(OFF); printf("Beep and Light 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_sf1_driver_demo.c
文件添加到makefile中,加入编译:
最后在.sdkconfig
中配置开启宏定义:
编译,烧录,即可看到实验现象。
LCD屏幕上显示当前传感器采集的烟感值,并且每2s更新一次。
当烟感值高于100时,E53_SF1扩展板的LED灯自动点亮,蜂鸣器开始鸣叫:
当烟感值低于100时,E53_SF1扩展板的LED灯自动熄灭,蜂鸣器关闭鸣叫:
另外,打开IoT-Studio自带的串口终端,可以查看到串口输出的工作信息:
linkmain:V1.2.1 AT 09:31:53 ON Dec 8 2019 Smoke Value is 0WELCOME TO IOT_LINK SHELLLiteOS:/>Smoke Value is 0Smoke Value is 0Smoke Value is 0Smoke Value is 0Smoke Value is 279Beep and Light ON!Smoke Value is 103Smoke Value is 88Beep and Light OFF!Smoke Value is 0Smoke Value is 278Beep and Light ON!Smoke Value is 27Beep and Light OFF!……
推荐阅读
《物联网创意大赛1.0》万元大奖等你来拿!!!
《物联网创意大赛1.0》一阶段:创意表达
《物联网创意大赛1.0》二阶段:动手实践
《物联网创意大赛1.0》三阶段:风采展示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。