分享
收藏
返回
学海沙粒
关注
私信
【HarmonyOS HiSpark Wi-Fi IoT 套件试用连连载】第五篇、点亮LED及OLED屏
Harmony
`
本帖最后由 学海沙粒 于 2020-11-5 23:46 编辑
第一篇个人代码是参考鸿蒙官方教程编写调试的,本篇文章将在“Hello World”基础上,点亮LED和OLED屏。
一、点亮LED
官方源代码中已经写好LED驱动,用户只要稍加修改便可点亮LED,本小节目的在于梳理设备开发流程。
1、找到源代码中关于LED驱动文件。打开applica
ti
ons/sample/wifi-iot/app/iothardware/led_example.c文件,如下所示。
#include
#include
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#define LED_INTERVAL_TIME_US 300000 //延时时间
#define LED_TASK_STACK_SIZE 512 //申请堆空间
#define LED_TASK_PRIO 25 //LED任务优先级
//LED状态
enum LedState {
LED_ON = 0, //亮
LED_OFF, //灭
LED_SPARK, //闪烁
};
enum LedState g_ledState = LED_SPARK; //选择LED状态
static void *LedTask(const char *arg)
{
(void)arg;
while (1) {
switch (g_ledState) {
case LED_ON:
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
usleep(LED_INTERVAL_TIME_US);
break;
case LED_OFF:
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
usleep(LED_INTERVAL_TIME_US);
break;
case LED_SPARK:
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
usleep(LED_INTERVAL_TIME_US);
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
usleep(LED_INTERVAL_TIME_US);
break;
default:
usleep(LED_INTERVAL_TIME_US);
break;
}
}
return NULL;
}
static void LedExampleEntry(void)
{
osThreadAttr_t attr;
GpioInit(); //管脚初始化
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO); //配置9号管脚作为GPIO
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT); //配置9号管脚为输出
attr.name = "LedTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = LED_TASK_STACK_SIZE;
attr.priority = LED_TASK_PRIO;
if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
printf("[LedExample] Falied to create LedTask!
");
}
}
SYS_RUN(LedExampleEntry);
函数说明:
(1)unsigned int GpioSetOutputVal(WifiIotGpioIdx id, WifiIotGpioValue val)
功能:指定引脚输出高低电平
--id:引脚号
--val:输出电平
(2)unsigned int IoSetFunc(WifiIotIoName id, unsigned char val)
功能:设置GPIO引脚的复用功能。
--id:引脚号
--val:指示I / O复用功能
(3)unsigned int GpioSetDir(WifiIotGpioIdx id, WifiIotGpioDir dir)
功能:设置GPIO引脚的方向
--id:引脚号
--val:指示GPIO输入/输出方向
(4)osThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)
功能:线程管理函数,或理解为任务注册函数
2、打开applications/sample/wifi-iot/app/iothardware/BUILD.c
static_library("led_example") {
sources = [
"led_example.c"
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite",
]
}
static_library中指定业务模块的编译结果,为静态库文件led_example.a。
sources中指定静态库.a所依赖的.c文件及其路径,若路径中包含"//"则表示绝对路径(此处为代码根路径),若不包含"//"则表示相对路径。
include_dirs中指定source所需要依赖的.h文件路径。
3、打开applications/sample/wifi-iot/app/BUILD.gn文件
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"iothardware:led_example"
]
}
在features字段中增加索引,使目标模块参与编译。features字段指定业务模块的路径和目标,此处就填写"
iothardware:led_example"。
4、编译、烧录后,可以看见
开发板
LED闪烁。
二、点亮OLED屏
OLED的开发流程与点亮LED的流程大体是一致的,只是OLED需要用户自己编写驱动。
1、首先在applications/sample/wifi-iot/app下建立oled_demo文件夹,然后在applications/sample/wifi-iot/app/oled_demo下建立oled_demo.c(OLED驱动)、oled_demo.h(OLED头文件)、oled_font.h(OLED字库)、BUILD.gn(编译脚本)四个文件。
2、OLED采用I2C驱动,所以在编写驱动代码前要使能I2C。找到vender/hisi/hi3861/hi3861/app/wifiiot_app/init/app_io_init.c文件,修改I2C引脚定义,板卡上 引脚是GPIO13(I2C0_SDA)和GPIO14(I2C0_SCL),所以将I2C引脚修改如下。
然后再找到vendor/hisi/hi3861/hi3861/build/config/usr_config.mk文件,添加"CONFIG_I2C_SUPPORT=y",使能I2C功能,类似宏使能。至此3861可以使用I2C功能了。
3、开发板上oled屏驱动芯片为ssd1306,打开上面新建的oled_demo.c文件,开始编写oled驱动。
void oled_demo(void)
{
//I2C初始化
hi_i2c_init(HI_I2C_IDX_0, 100000); /* baudrate: 100000 */
oled_init();
OLED_ColorTurn(0); //0 正常显示;1 反色显示
OLED_DisplayTurn(0); //0 正常显示;1 屏幕翻转显示
OLED_ShowString(8,16,"hello world",16);
OLED_Refresh();
}
首先是I2C初始化——
hi_i2c_init(hi_i2c_idx id, hi_u32 baudrate),该函数由hi3861库提供;
oled_init(),oled初始化,通过I2C写函数对oled寄存器进行设置;
OLED_ColorTurn(0),设置屏幕背景色,实际也是通过I2C写函数对oled寄存器进行写数据;
OLED_DisplayTurn (0),设置显示是否翻转180度;
OLED_ShowString(8,16,"hello world",16),在指定位置显示字符;
OLED_Refresh(),刷新显示屏。
oled_demo.h文件用于存放各种宏以及c文件中要用到其他数据,用户可以自由设计;oled_font.h用于存放字符。
BUILD.gn文件用于设置编译脚本。
static_library("oled_demo") {
sources = [
"oled_demo.c"
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
]
}
以上是oled驱动的大体流程,实际代码很多,包括对I2C写函数封装、判断是输入数据还是输入指令,显示字符功能还需要编写画点函数、字符大小整理等,详细代码见附件(说明:代码来源于连志安老师)。
`
oled_demo.zip
(6.77 KB)
(下载次数: 1, 2020-11-5 23:39 上传)
更多回帖
rotate(-90deg);
回复
我也要说两句
回帖
回复评论
相关经验
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】
点亮
我的
OLED
屏
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】
试用
第三弹,
点亮
你的
OLED
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】基于
HiSpark
Wi-Fi
IoT
套件
_5-
OLED
中文显示
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】Hello
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】
点亮
OLED
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】
OLED
屏
驱动
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连连载
】
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连连载
】
HarmonyOS
实现
点亮
LED
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】鸿蒙
HiSpark
Wi-Fi
IoT
套件
使用感受(二)
【
HarmonyOS
HiSpark
Wi-Fi
IoT
套件
试用
连载
】基于
HiSpark
Wi-Fi
IoT
套件
_2-环境搭建
×
长按上方图片保存到相册
复制链接
长按二维码打开
发帖