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
相关推荐
楼台的春风1 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
Moonnnn.1 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
LS_learner2 小时前
小智机器人CMakeLists编译文件解析
嵌入式硬件·机器人
小鸡岛保安3 小时前
学习笔记-8MQTT-韦东山
stm32·物联网
暗碳3 小时前
stm32 74hc238流水灯
stm32·单片机·嵌入式硬件
1101 11013 小时前
STM32-温湿度上传OneNET项目
stm32·单片机·嵌入式硬件
余衫马4 小时前
ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析
驱动开发·单片机·嵌入式硬件
文军的烹饪实验室7 小时前
处理器架构、单片机、芯片、光刻机之间的关系
单片机·嵌入式硬件·架构
Leiditech__8 小时前
人工智能时代电子机器人静电问题及电路设计防范措施
人工智能·嵌入式硬件·机器人·硬件工程
jmlinux8 小时前
STM32 HAL库USART串口DMA IDLE中断编程:避坑指南
stm32·单片机·嵌入式硬件