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
相关推荐
小白学电子_42 分钟前
proteus仿真51单片机通过定时器控制红绿灯
嵌入式硬件·51单片机·proteus
鲨辣椒100862 小时前
51单片机初相识
单片机·嵌入式硬件·51单片机
独处东汉2 小时前
freertos开发空气检测仪之完结_Air_check_App 工程概览与使用说明
stm32·单片机·嵌入式硬件·freertos
爱喝纯牛奶的柠檬4 小时前
基于STM32的4*4矩阵软键盘驱动
stm32·嵌入式硬件·矩阵
电子工程师成长日记-C514 小时前
51单片机低频信号发生器
单片机·嵌入式硬件·51单片机
望酹江月4 小时前
HNU-RFID与传感器原理实验
c语言·单片机
GodKK老神灭4 小时前
FOC中PLL的点乘法
单片机
逐步前行5 小时前
STM32_DMA_寄存器操作
stm32·单片机·嵌入式硬件
Funing76 小时前
无法打开 源 文件 “esp_err.h“
嵌入式硬件·esp32
Hello World . .7 小时前
51单片机基础外设:中断、定时器/计数器(PWM控制蜂鸣器、电机)
单片机·嵌入式硬件·51单片机