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

GD32VW553-IOT OLED移植

1.前言

本来想用他自身的硬件I2C实现的,但是不知道为啥跑demo一点波形都没有,改成推挽也没有波形,只有初始化的电平变化,而且I2C的驱动库好像有点复杂,起始信号结束信号都得单独发的,没有一个全部封装好的库直接往里填数据的就能发的那种,希望后续看看有没有更新啥的,或者大佬分享下经验。
所以本次项目用的软件模拟I2C实现啦,移植性也比较强。直接搬

2.硬件准备

GD32VW553-IOT开发板1个
CH340串口1个
0.96OLED屏幕一个
杜邦线若干

3.代码移植

本次项目是在官方驱动库的硬件I2C库改的,要字库驱动啥的可以评论区留言

main.c

oled屏幕从机的地址上0x78

#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"
#include "oled.h"
#include "OLED_Data.h"#define I2C_SLAVE_ADDRESS7   0x78void rcu_config(void)
{/* enable GPIOA clock */rcu_periph_clock_enable(RCU_GPIOA);
}void i2c_gpio_config(void)
{gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_2);gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_3);}int main(void)
{/* configure systick */systick_config();eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);gd_eval_com_init(EVAL_COM0);        //初始化串口,上一篇有讲/* 启用外设时钟 */rcu_config();/* 配置I2C GPIO端口 */i2c_gpio_config();/* 初始化OLED */OLED_Init();/*在(0, 0)位置显示字符'A',字体大小为8*16点阵*/OLED_ShowChar(0, 0, 'A', OLED_8X16);/*在(16, 0)位置显示字符串"Hello World!",字体大小为8*16点阵*/OLED_ShowString(16, 0, "Hello World!", OLED_8X16);/*在(0, 18)位置显示字符'A',字体大小为6*8点阵*/OLED_ShowChar(0, 18, 'A', OLED_6X8);/*在(16, 18)位置显示字符串"Hello World!",字体大小为6*8点阵*/OLED_ShowString(16, 18, "Hello World!", OLED_6X8);/*在(0, 28)位置显示数字12345,长度为5,字体大小为6*8点阵*/OLED_ShowNum(0, 28, 12345, 5, OLED_6X8);/*在(40, 28)位置显示有符号数字-66,长度为2,字体大小为6*8点阵*/OLED_ShowSignedNum(40, 28, -66, 2, OLED_6X8);/*在(70, 28)位置显示十六进制数字0xA5A5,长度为4,字体大小为6*8点阵*/OLED_ShowHexNum(70, 28, 0xA5A5, 4, OLED_6X8);/*在(0, 38)位置显示二进制数字0xA5,长度为8,字体大小为6*8点阵*/OLED_ShowBinNum(0, 38, 0xA5, 8, OLED_6X8);/*在(60, 38)位置显示浮点数字123.45,整数部分长度为3,小数部分长度为2,字体大小为6*8点阵*/OLED_ShowFloatNum(60, 38, 123.45, 3, 2, OLED_6X8);/*在(0, 48)位置显示英文和汉字串"Hello,世界。",支持中英文混写*/OLED_ShowString(0, 48, "Hello,世界。", OLED_8X16);/*在(96, 48)位置显示图像,宽16像素,高16像素,图像数据为Diode数组*/OLED_ShowImage(96, 48, 16, 16, Diode);/*在(96, 18)位置打印格式化字符串,字体大小为6*8点阵,格式化字符串为"[%02d]"*/OLED_Printf(96, 18, OLED_6X8, "[%02d]", 6);/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/OLED_Update();printf("booting\r\n");while(1) {printf("ing\r\n");}
}

oled.c

需要改的地方不多,就是IO口这里,其他照搬代码太多不写了,可以下载江协的代码修改下
这里用的PA2-SCL PA3-SDA硬件I2C也是对的上的

/*** 函    数:OLED写SCL高低电平* 参    数:要写入SCL的电平值,范围:0/1* 返 回 值:无* 说    明:当上层函数需要写SCL时,此函数会被调用*           用户需要根据参数传入的值,将SCL置为高电平或者低电平*           当参数传入0时,置SCL为低电平,当参数传入1时,置SCL为高电平*/
void OLED_W_SCL(uint8_t BitValue)
{/*根据BitValue的值,将SCL置高电平或者低电平*/gpio_bit_write(GPIOA, GPIO_PIN_2, BitValue);/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*///...
}/*** 函    数:OLED写SDA高低电平* 参    数:要写入SDA的电平值,范围:0/1* 返 回 值:无* 说    明:当上层函数需要写SDA时,此函数会被调用*           用户需要根据参数传入的值,将SDA置为高电平或者低电平*           当参数传入0时,置SDA为低电平,当参数传入1时,置SDA为高电平*/
void OLED_W_SDA(uint8_t BitValue)
{/*根据BitValue的值,将SDA置高电平或者低电平*/gpio_bit_write(GPIOA, GPIO_PIN_3, BitValue);/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*///...
}

4.实验现象

在这里插入图片描述

http://www.xdnf.cn/news/1383319.html

相关文章:

  • Intern-S1-mini模型结构
  • Python训练营打卡 DAY 50 预训练模型+CBAM模块
  • DQN(深度Q网络):深度强化学习的里程碑式突破
  • 【LeetCode每日一题】160.相交链表 206. 反转链表
  • 在Xcode中查看设备日志的完整指南
  • 消息队列核心问题解决方案:从丢失到重复消费的全方位保障
  • Windows 11 中 PowerShell 与 CMD 的深度对比:从定位到实战
  • Python DELL Logo
  • LCEDA电气规则
  • 整体设计 修订 之1 三“先”之“基” 与范畴重构:康德先验哲学的批判性程序化实现
  • MapStruct用法和实践
  • Vibe Coding到底是什么:什么是 Vibe Coding?AI编程?
  • 深度学习----卷积神经网络实现数字识别
  • 从0开始学习Java+AI知识点总结-27.web实战(Maven高级)
  • 漫谈《数字图像处理》之区域生长和区域分离聚合
  • CDN 临时下载链接
  • OpenCV 图像操作进阶:像素、边界与融合技术
  • 嵌入式学习日记(36)TCP并发服务器构建——epoll
  • 详细介绍Linux 内存管理 匿名页面和page cache页面有什么区别?
  • SplinePSF——应用于光学成像中的 PSF 建模
  • 详细介绍Linux 内存管理struct page数据结构中的_count和_mapcount有什么区别?
  • 图论好题推荐-逛公园
  • 【LInux】常用命令笔记
  • ArkUI框架之Canvas 画布
  • 什么是最小二乘法
  • 二、开关电源的EMC改善措施
  • CVPR2025丨VL2Lite:如何将巨型VLM的“知识”精炼后灌入轻量网络?这项蒸馏技术实现了任务专用的极致压缩
  • 虚幻基础:角色变换角色视角蒙太奇运动
  • 基于SpringBoot的老年人健康数据远程监控管理系统【2026最新】
  • 嵌入式开发学习———Qt软件环境下的C++学习(七)