HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例

HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例


  • 📍硬件I2C DMA驱动参考:https://blog.csdn.net/weixin_45065888/article/details/118225993

  • 🔖本工程基于STM32F103VCT6,驱动程序独立,可以移植到任意STM32型号上使用。

在这里插入图片描述

📑字体大小说明

  • 🌿该驱动程序ASCII字符集类型大小包含:6X8、8X16,12X6 三种。其中6X8和8X16共用一个API函数调用,形参不同。
//针对F6x8、F8X16字体
void OLED_show_char2(uint8_t row, uint8_t col, uint8_t chr, uint8_t size)
{
    uint8_t x ;
    uint8_t y;
    if(size == 8){
		x = col * 6;
        y = row * 8;
		}
    else {
		x = col * 8;
        y = row * 16;		
		}
    uint8_t temp, t, t1;
    uint8_t y0 = y;
    chr = chr - ' ';
    if(size == 16) {
           for(t = 0; t < 8; t++) {
            temp = F8X16[chr*16+t];
            for(t1 = 0; t1 < 8; t1++) {
                if(temp & 0x01)
                    OLED_draw_point(x, y, PEN_WRITE);
                else
                    OLED_draw_point(x, y, PEN_CLEAR);

                temp >>= 1;
                y++;
                if((y - y0) == 8) {
                    y = y0;
                    x++;
                    break;
                }
            }
					}
						for(t = 0; t < 8; t++) {
            temp = F8X16[chr*16+t+8];
            for(t1 = 0; t1 < 8; t1++) {
                if(temp & 0x01)
                    OLED_draw_point(x-8, y+8, PEN_WRITE);
                else
                    OLED_draw_point(x-8, y+8, PEN_CLEAR);

                temp >>= 1;
                y++;
                if((y - y0) == 8) {
                    y = y0;
                    x++;
                    break;
                }
            }
					} 
    
    } else {

        for(t = 0; t < 6; t++) {
            temp = F6x8[chr][t];
            for(t1 = 0; t1 < 8; t1++) {
                if(temp & 0x01)
                    OLED_draw_point(x, y, PEN_WRITE);
                else
                    OLED_draw_point(x, y, PEN_CLEAR);

                temp >>= 1;
                y++;
                if((y - y0) == 8) {
                    y = y0;
                    x++;
                    break;
                }
            }
        }

    }
}
//6X12字体
void OLED_show_char(uint8_t row, uint8_t col, uint8_t chr)
{

    uint8_t x = col * 6;
    uint8_t y = row * 12;
    uint8_t temp, t, t1;
    uint8_t y0 = y;
    chr = chr - ' ';

    for(t = 0; t < 12; t++) {
        temp = asc2_1206[chr][t];

        for(t1 = 0; t1 < 8; t1++) {
            if(temp & 0x80)
                OLED_draw_point(x, y, PEN_WRITE);
            else
                OLED_draw_point(x, y, PEN_CLEAR);

            temp <<= 1;
            y++;
            if((y - y0) == 12) {
                y = y0;
                x++;
                break;
            }
        }
    }
}

🛠 0.96" SSD1306和1.3" SH1106切换,代码调整

void OLED_set_pos(uint8_t x, uint8_t y)
{
    OLED_CMDbuf[y][0] = 0x00;
    OLED_CMDbuf[y][1] = 0xb0 + y;
    OLED_CMDbuf[y][2] = 0x10;
	OLED_CMDbuf[y][3] = 0x00; //ssd1306:0x00;sh1106:0x02

}

🔨STM32CubeMX配置

  • 🌿开启硬件硬件I2C:
    在这里插入图片描述

  • 🌿勾选I2C DMA 发送数据(TX):

在这里插入图片描述

  • 🌿中断(NVIC)列表勾选I2C1 event interrupt,优先级配置,根据个人使用环境配置。
    在这里插入图片描述

📝测试代码

int main(void)
{
    /* USER CODE BEGIN 1 */
//    float num = 3.14;
    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_I2C1_Init();
    MX_USART1_UART_Init();
    /* USER CODE BEGIN 2 */

    OLED_init(); //OLED初始化
    OLED_operate_gram(PEN_CLEAR);//清缓存

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while(1) {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        OLED_operate_gram(PEN_CLEAR);//清缓存
        OLED_showString(0, 2, (uint8_t*)"China Loong",16);
        OLED_show_string(2, 3, (uint8_t*)"perseverance");

        OLED_refresh_gram();//全局刷新
        HAL_Delay(1500);
        OLED_operate_gram(PEN_CLEAR);//清缓存
        OLED_show_string(3, 3, (uint8_t*)"Hello World");
        OLED_show_string(4, 3, (uint8_t*)"DISPLAY China");
        OLED_refresh_gram();//全局刷新
        HAL_Delay(1500);

		

    }
    /* USER CODE END 3 */
}

📚测试例程

链接:https://pan.baidu.com/s/1jkwfS7BmxVZHrDrhvrBWJw?pwd=h6s3 
提取码:h6s3

🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/401316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理

一、缓存穿透 1、概念 缓存穿透&#xff08;查不到数据&#xff09;&#xff0c;是指当用户想要查询数据的时候&#xff0c;会先去Redis中取命中&#xff0c;如果Redis中没有该数据&#xff0c;那么就会向数据库中去查找数据。如果数据库中也没有&#xff0c;则该次查询结果失…

(done) 什么是正定矩阵?Positive Definite Matrices

正定矩阵的定义&#xff1a;https://baike.baidu.com/item/%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/11030459 正定矩阵的作用、验证视频&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c…

网络安全相关证书有哪些?

网络安全相关证书有哪些呢&#xff1f;了解一下&#xff01; 1. CISP &#xff08;国家注册信息安全专业人员&#xff09; 说到CISP&#xff0c;安全从业者基本上都有所耳闻&#xff0c;算是国内权威认证&#xff0c;毕竟有政府背景给认证做背书&#xff0c;如果想在政府、国企…

使用Outlook邮箱保护您的隐私

在数字时代&#xff0c;我们的电子邮件地址就像是我们的数字身份证&#xff0c;它连接着我们的个人信息和网络世界。无论是注册新服务、购物还是预订餐桌&#xff0c;电子邮件地址都是我们身份的关键部分。然而&#xff0c;这也使我们容易受到垃圾邮件和隐私泄露的影响。但是&a…

SkyWalking之APM无侵入可观测原理分析

一、 简介&#xff08;为什么需要用到可观测能力&#xff09; 随着微服务的开发模式的兴起&#xff0c;早期的单体架构系统已拆分为很多的子系统&#xff0c;各个子系统封装为微服务&#xff0c;各服务间通过HTTP协议RESET API或者RPC协议进行调用。 在单体服务或者微服务较少的…

Halcon set_origin_pose变换的原理

为什么要对标定好的坐标系原点进行变换? 在Halcon相机标定的过程中&#xff0c;总是要用到set_origin_pose对世界坐标系进行变换&#xff0c;如果不使用set_origin_pose函数来显式设置坐标系的原点和姿态&#xff0c;默认情况下使用的是第一张图的位姿。这对于不需要进行复杂…

Spring Boot中的@Scheduled注解:定时任务的原理与实现

1. 前言 本文将详细探讨Spring Boot中Scheduled注解的使用&#xff0c;包括其原理、实现流程、步骤和代码示例。通过本文&#xff0c;读者将能够了解如何在Spring Boot应用中轻松创建和管理定时任务。 2. Scheduled注解简介 在Spring框架中&#xff0c;Scheduled注解用于标记…

【网站项目】167校园失物招领小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

ChatGPT在数据分析OKR计划中的应用

ChatGPT在数据分析OKR计划中的应用 ​ 现在大多数公司引入了OKR&#xff08;objective & key result&#xff09;计划&#xff0c;数据分析师也需要定期制定和检查自己的OKR计划。我们不仅可以利用ChatGPT辅助制定OKR计划&#xff0c;也可以让其对OKR计划内容进行调整、优…

探索Go语言中的HTTP路由和中间件

在Go语言中&#xff0c;HTTP路由和中间件是实现Web应用程序核心功能的关键组件。路由负责将传入的HTTP请求分发到适当的处理函数&#xff0c;而中间件则提供了一种在请求处理过程中插入额外逻辑的机制。 HTTP路由 在Go中&#xff0c;net/http标准库提供了基本的路由功能&…

01 Linux简介

Linux背景 发展史 linux从哪来的&#xff1f;怎么发展的&#xff1f;得从UNIX说起 1968年&#xff0c;一些来自通用电气公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念1969-1970年&am…

Sora--首个大型视频生成模型

Sora--首个大型视频生成模型 胡锡进于2024年2月20日认为&#xff1a;台当局怂了 新的改变世界模拟器视觉数据转换视频压缩时空补丁&#xff08;Spacetime Laten Patches&#xff09;视频生成扩展变压器算法和模型架构结语 胡锡进于2024年2月20日认为&#xff1a;台当局怂了 **T…

《深入浅出 Spring Boot 3.x》预计3月份发版

各位&#xff0c;目前本来新书《深入浅出 Spring Boot 3.x》已经到了最后编辑排版阶段&#xff0c;即将在3月份发布。 目录&#xff1a; 现在把目录截取给大家&#xff1a; 主要内容&#xff1a; 本书内容安排如下。 ● 第 1 章和第 2 章讲解 Spring Boot 和传统 Spri…

C语言菜鸟入门·数组简介

目录 1. 简介 2. 声明数组 3. 初始化数组 3. 访问数组元素 4. 获取数组长度 5. 数组名 1. 简介 在 C 语言中&#xff0c;数组是一种用来存储相同类型数据元素的集合。数组提供了一种便捷的方式来管理一系列相同类型的数据&#xff0c;可以按照索引来访问和操作数组…

【免费雾锁王国】2024年新手搭建雾锁王国服务器教程

免费自建雾锁王国Enshrouded服务器&#xff0c;先领取阿里云300元无门槛代金券&#xff0c;然后在雾锁王国Enshrouded专题页一键部署&#xff0c;不需要基础&#xff0c;鼠标点选即可10秒钟创建一台雾锁王国游戏服务器&#xff0c;超简单&#xff0c;阿里云服务器网aliyunfuwuq…

Wireshark过滤DNS协议包语法实战

背景 现网DNS服务器发现CPU突增&#xff0c;发现有可能是客户恶意发起的随机子域名扫描&#xff0c;对服务器进行抓包分析&#xff0c;记录下当时的操作。 抓包 执行命令 tcpdump -iany port 53 and host $ip -nnv -w $ip.pcap进行抓包导出到本地&#xff0c;使用Wireshark进…

vue3中使用 tui-image-editor进行图片处理,并上传

效果图 下载包 pnpm i tui-image-editor pnpm i tui-color-picker调用组件 //html部分 <el-dialog v-model"imgshow" destroy-on-close width"40%" draggable align-center :show-close"true":close-on-click-modal"false">&l…

“成像光谱遥感技术中的AI革命:ChatGPT应用指南“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

Redis篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、Redis 的持久化机制是什么?各自的优缺点?二、Redis 常见性能问题和解决方案:三、redis 过期键的删除策略?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

h5网页和 Android APP联调,webview嵌入网页,网页中window.open打开新页面,网页只在webview中打开,没有重开一个app窗口

我是h5网页开发&#xff0c;客户app通过webview嵌入我的页面 点击标题window.open跳转到长图页面&#xff0c;客户的需求是在app里新开一个窗口展示长图页面&#xff0c;window.open打开&#xff0c;ios端是符合客户需求的&#xff0c;但是在安卓端他会在当前webview打开 这…
最新文章