当前位置: 首页 > news >正文

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、6X12、8X16,三种。其中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);elseOLED_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);elseOLED_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);elseOLED_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);elseOLED_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.lryc.cn/news/303333.html

相关文章:

  • grafana配置钉钉告警模版(一)
  • 佳能2580的下载手册
  • YOLO-World:实时开放词汇目标检测
  • Unity中关于群组的一些组件
  • 面向对象详解,面向对象的三大特征:封装、继承、多态
  • 【阿里云服务器的一些使用坑】都是无知的泪水呀
  • Docker的常用命令||Docker是个流行的容器化平台,它允许你打包、分发和运行应用程序。
  • 汽车电子论文学习--电动汽车电机驱动系统动力学特性分析
  • c++的一些陌生用法记录
  • Vue | (三)使用Vue脚手架(中)| 尚硅谷Vue2.0+Vue3.0全套教程
  • TenorFlow多层感知机识别手写体
  • Java基础(二十六):Java8 Stream流及Optional类
  • qt - 19种精美软件样式
  • vue 使用docx库生成word表格文档
  • ElementUI table表格组件实现双击编辑单元格失去焦点还原,支持多单元格
  • Java基于SpringBoot+Vue的图书管理系统
  • 【云安全】Hypervisor与虚拟机
  • JS文本加密方法探究
  • 推荐彩虹知识付费商城免授权7.0源码
  • 【天衍系列 04】深入理解Flink的ElasticsearchSink组件:实时数据流如何无缝地流向Elasticsearch
  • 一、ActiveMQ介绍
  • 【牛客】寒假训练营1 I-It‘s bertrand paradox. Again! 题解
  • 各种手型都合适,功能高度可定制,雷柏VT9PRO mini和VT9PRO游戏鼠标上手
  • sql建库,建表基础操作
  • 算法训练营day32,贪心算法6
  • CTR之行为序列建模用户兴趣:DIN
  • Java使用Redis实现分页功能
  • Qt标准对话框设置
  • 如何让Obsidian实现电脑端和安卓端同步
  • windows系统中jenkins构建报错提示“拒绝访问”