一、前言
最近想用 3861 做個有意思的東西,記錄一下開發過程。今天使用 3861 的硬件 i2c 驅動 oled。
硬件平臺:Bearpi-Nano
軟件SDK:潤和sdk
二、搬一個 OLED輪子
我之前寫過一篇基于 stm32cubemx 快速使用iic 接口 oled 的過程,里面有現成的 oled 接口,我們只要直接拿過來替換掉底層接口就行。
STM32CubeMX驅動4腳OLED模塊 https://blog.csdn.net/qq_45396672/article/details/118272126
替換的接口位置如下位置:
三、Hi3861i2c 接口
SDK提供了兩層接口封裝,一層是芯片級的 driver 驅動,由原廠sdk提供:
另一層 open Harmony 級的驅動,是操作系統對原廠sdk的封裝,主要為了兼容不同芯片開發:
原廠的 driver 接口更加細致,系統層的driver其實就是對原廠的一層封裝,簡單開發可以直接使用系統提供的driver接口,復雜開發則推薦研究一下原廠的接口,因為sdk不是很完善,不符合需求的可以直接改原廠的sdk。
我們簡單驅動個i2c,使用系統封裝的接口:
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 接口
四、使用驅動代碼
在主函數中創建一個線程,調用 i2c、oled初始化接口,將初始化代碼注冊到系統運行回調中
#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文章
6200瀏覽量
224207 -
接口
+關注
關注
33文章
8598瀏覽量
151156 -
操作系統
+關注
關注
37文章
6825瀏覽量
123331 -
SDK
+關注
關注
3文章
1036瀏覽量
45941 -
stm32cubemx
+關注
關注
5文章
283瀏覽量
14809 -
Hi3861
+關注
關注
1文章
59瀏覽量
6502
原文標題:五、調試現象
文章出處:【微信號:嵌入式Share,微信公眾號:嵌入式Share】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論