Clion开发STM32之OLED屏(软件i2c测试)

前言

  1. 本篇内容需要参考之前的文章:
    1. Clion开发stm32之微妙延迟(采用nop指令实现)
    2. Clion开发STM32之日志模块(参考RT-Thread)
    3. Clion开发STM32之I2C驱动(参考RT-Thread)
    4. Clion开发STM32之HAL库硬件I2C驱动OLED
  2. 使用的是0.96寸OLED屏

测试文件

c 复制代码
/*******************************************************************************
 Copyright (c) [scl]。保留所有权利。
 ******************************************************************************/
#include "app_conf_test.h"

#define APP_CONF_ENABLE_OLED (1)
#if APP_CONF_ENABLE_OLED
#define DBG_ENABLE
#define DBG_SECTION_NAME "OLED"
#define DBG_LEVEL DBG_LOG // DBG_LOG DBG_INFO DBG_WARNING DBG_ERROR

#include "sys_dbg.h"
#include "oled/module_oled.h"

static soft_i2c_cnf_t I2C_Gpio_Cnf;
static i2c_bit_ops_t bit_ops = {
        .option={.delay_us =1,.timeout=100},
        .us_delay = bsp_us_delay_nop
};
static struct i2c_bus_device i2c_device;

/*-********************************************OLED变量定义******************************************-*/


void oled_send(uint8_t device_addr, uint8_t cmd_type, uint8_t *data, uint16_t data_len) {
    rt_i2c_msg msgs[2];
    msgs[0].addr = device_addr;
    msgs[0].flags = RT_I2C_WR;
    msgs[0].buf = &cmd_type;
    msgs[0].len = 1;
    msgs[1].addr = device_addr;
    msgs[1].flags = RT_I2C_WR | RT_I2C_NO_START;
    msgs[1].buf = data;
    msgs[1].len = data_len;
    if (i2c_device.master_xfer(i2c_device.bit_ops, msgs, 2) <= 0) {
        LOG_D("oled_send err");
    }
}

/*-********************************************OLED_pre_init******************************************-*/
static void OLED_pre_init() {
    I2C_Gpio_Cnf.scl = stm_get_pin(PB6);
    I2C_Gpio_Cnf.sda = stm_get_pin(PB7);
}

sys_pre_init_export(OLED, OLED_pre_init);

/*-********************************************OLED_init******************************************-*/
static void OLED_init() {
    i2c_bus_init(&i2c_device, &bit_ops, &I2C_Gpio_Cnf);
    LOG_D("OLED MODULE TEST");
    OLed_Registry_SendCall(oled_send);
}

sys_init_export(OLED, OLED_init);

/*-***********************************************OLED_after_init***************************************-*/
static void OLED_after_init() {
    OLed_Soft_Init();
    OLed_Cls();
    char msg[10] = "as:";
    size_t len = strlen(msg);
    for (int i = 0; i < 100; ++i) {
        sprintf(msg + len, "%d", i);
        OLED_ShowStr(0, 0, msg, 1);
        HAL_Delay(1000);
    }
}

sys_after_init_export(OLED, OLED_after_init);
/*-**************************************OLED内部使用************************************************-*/
#endif //APP_CONF_ENABLE_OLED
相关推荐
准测仪器5 小时前
6项提高电机制造质量的电气测试方案
单片机·嵌入式硬件·制造·电机·电气·放电测试·局部放电测试
ACP广源盛139246256736 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
hazy1k6 小时前
51单片机基础-IO扩展(并转串 74HC165)
stm32·单片机·嵌入式硬件·fpga开发·51单片机·1024程序员节
Tony小周6 小时前
使用QKeyEvent keyPress(QEvent::KeyPress, key模拟键盘发送事件,会导致主程序卡死
嵌入式硬件·qt
普中科技9 小时前
【普中STM32F1xx开发攻略--标准库版】-- 第 13 章 STM32 位带操作
stm32·单片机·嵌入式硬件·arm·gpio·普中科技·位带操作
河南博为智能科技有限公司10 小时前
RS485转以太网串口服务器-串口设备联网的理想选择
大数据·服务器·人工智能·单片机·嵌入式硬件·物联网
国科安芯11 小时前
抗辐照MCU芯片在无人叉车领域的性能评估与选型建议
网络·人工智能·单片机·嵌入式硬件·安全
国科安芯11 小时前
抗辐照MCU芯片在激光雷达领域的适配性分析
网络·人工智能·单片机·嵌入式硬件·fpga开发
日更嵌入式的打工仔12 小时前
<RT1176系列14>CCM(Clock Controller Module)解读
单片机·嵌入式硬件
云山工作室12 小时前
基于单片机的环境监测智能报警系统的设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设