一、前言
最近想用 3861 做個有意思的東西,記錄一下開發(fā)過程。今天使用 3861 的硬件 i2c 驅(qū)動 oled。
硬件平臺:Bearpi-Nano
軟件SDK:潤和sdk
二、搬一個 OLED輪子
我之前寫過一篇基于 stm32cubemx 快速使用iic 接口 oled 的過程,里面有現(xiàn)成的 oled 接口,我們只要直接拿過來替換掉底層接口就行。
STM32CubeMX驅(qū)動4腳OLED模塊 https://blog.csdn.net/qq_45396672/article/details/118272126
替換的接口位置如下位置:
三、Hi3861i2c 接口
SDK提供了兩層接口封裝,一層是芯片級的 driver 驅(qū)動,由原廠sdk提供:
另一層 open Harmony 級的驅(qū)動,是操作系統(tǒng)對原廠sdk的封裝,主要為了兼容不同芯片開發(fā):
原廠的 driver 接口更加細致,系統(tǒng)層的driver其實就是對原廠的一層封裝,簡單開發(fā)可以直接使用系統(tǒng)提供的driver接口,復雜開發(fā)則推薦研究一下原廠的接口,因為sdk不是很完善,不符合需求的可以直接改原廠的sdk。
我們簡單驅(qū)動個i2c,使用系統(tǒng)封裝的接口:
unsigned int IoTI2cInit(unsigned int id, unsigned int baudrate); unsigned int IoTI2cDeinit(unsigned int id); unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen); unsigned int IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen); unsigned int IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate); |
用上面的讀寫接口替換掉 oled 輪子里面的 i2c 接口
四、使用驅(qū)動代碼
在主函數(shù)中創(chuàng)建一個線程,調(diào)用 i2c、oled初始化接口,將初始化代碼注冊到系統(tǒng)運行回調(diào)中
#include #include "stdio.h" #include "ohos_init.h" #include "cmsis_os2.h" #include "hi_io.h" #include "hi_i2c.h" #include "iot_errno.h" #include "iot_i2c.h" #include "iot_gpio.h" #define OLED_I2C_BAUDRATE 400000 static void iot_i2c_init(void) { IoTGpioInit(HI_IO_NAME_GPIO_0); IoTGpioInit(HI_IO_NAME_GPIO_1); //將引腳功能設置為 I2C 引腳 hi_io_set_func(HI_IO_NAME_GPIO_0, HI_IO_FUNC_GPIO_0_I2C1_SDA); hi_io_set_func(HI_IO_NAME_GPIO_1, HI_IO_FUNC_GPIO_1_I2C1_SCL); //初始化 I2C0 uint32_t ret = IoTI2cInit(HI_I2C_IDX_1, OLED_I2C_BAUDRATE); if (ret != IOT_SUCCESS) { printf("[OLED_TASK] Init i2c Fail. ret = %d ", ret); } printf("[OLED_TASK] Init i2c succ. "); } void oled_i2c_init(void) { iot_i2c_init(); OLED_Init(); OLED_Clear(); } void *oled_demo(const char *arg) { (void)arg; char i = 0; char dat[10] = { 0 }; oled_i2c_init(); while (1) { printf("[OLED_TASK] i = %d! ", i); OLED_ShowNum(10, 10, i++, 1, 8); osDelay(100); } } void oled_demo_init(void) { osThreadAttr_t attr; attr.name = "OLED_Task"; attr.attr_bits = 0U; attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = 2048; attr.priority = 26; if (osThreadNew((osThreadFunc_t)oled_demo, NULL, &attr) == NULL) { printf("[OLED_TASK] Falied to create OLED_TASK! "); } } SYS_RUN(oled_demo_init); |
審核編輯:湯梓紅
-
OLED
+關注
關注
119文章
6180瀏覽量
223825 -
接口
+關注
關注
33文章
8496瀏覽量
150834 -
操作系統(tǒng)
+關注
關注
37文章
6737瀏覽量
123190 -
SDK
+關注
關注
3文章
1026瀏覽量
45776 -
stm32cubemx
+關注
關注
5文章
280瀏覽量
14751 -
Hi3861
+關注
關注
1文章
59瀏覽量
6449
原文標題:五、調(diào)試現(xiàn)象
文章出處:【微信號:嵌入式Share,微信公眾號:嵌入式Share】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論