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

这篇具有很好参考价值的文章主要介绍了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型号上使用。

HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例,STM32CubeMX自动配置工程系列,stm32,嵌入式硬件,I2C DMA,ssd1306/sh1106

📑字体大小说明

  • 🌿该驱动程序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:
    HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例,STM32CubeMX自动配置工程系列,stm32,嵌入式硬件,I2C DMA,ssd1306/sh1106

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

HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例,STM32CubeMX自动配置工程系列,stm32,嵌入式硬件,I2C DMA,ssd1306/sh1106

  • 🌿中断(NVIC)列表勾选I2C1 event interrupt,优先级配置,根据个人使用环境配置。
    HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例,STM32CubeMX自动配置工程系列,stm32,嵌入式硬件,I2C DMA,ssd1306/sh1106

📝测试代码

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

🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。文章来源地址https://www.toymoban.com/news/detail-836146.html

到了这里,关于HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP8266基于Lua开发使用U8g2模块驱动 i2c ssd1306 OLED显示

    📍相关篇《ESP8266基于Lua开发点灯示例》 📖U8g2对应的API接口函数: https://nodemcu.readthedocs.io/en/release/modules/u8g2/ 📺驱动显示效果: 🔖官方U8g2驱动Demo : https://github.com/nodemcu/nodemcu-firmware/blob/release/lua_examples/u8g2/graphics_test.lua ✨在使用U8g2时,可能会出现上传过程中报错的问题:

    2024年02月06日
    浏览(20)
  • 【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

    📌相关篇《【WCH】CH32F203基于内部RTC时钟+I2C SSD1306 OLED显示》 📺显示效果: ✨主要是在其基础 上增加温度显示,温度数据来源于DS18B20,更换了OLED驱动显示字体相关内容。 🔰仅作为功能演示,内部RTC精度不高,长时间运行需要依赖第三方数据校准才行。 🔖代码是从STM32工

    2023年04月26日
    浏览(19)
  • iMX6ULL驱动开发 | OLED显示屏SPI驱动实现(SH1106,ssd1306)

    周日业余时间太无聊,又不喜欢玩游戏,大家的兴趣爱好都是啥?我觉得敲代码也是一种兴趣爱好。正巧手边有一块儿0.96寸的OLED显示屏,一直在吃灰,何不把玩一把?于是说干就干,最后在我的imax6ul的linux开发板上使用spi用户态驱动成功点亮。这里总结下过程,分享给有需

    2024年02月14日
    浏览(14)
  • 【STM32 CubeMX】I2C中断方式与DMA方式

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需

    2024年02月20日
    浏览(17)
  • STM32 HAL库函数学习 I2C篇

    本篇内容讲述STM32的硬件IIC功能。硬件IIC的使用在F1系列上可能会有问题。本次使用的测试平台是H7,用于AT24C02芯片的读写正常,暂不清楚在其他芯片上使用是否正常。 1、HAL_StatusTypeDef HAL_I2C_Init (I2C_HandleTypeDef * hi2c) I2C初始化函数,使用CubeMx生成。需要选中I2C硬件指定的IO口。

    2023年04月08日
    浏览(13)
  • STM32 HAL FreeRTOS 硬件I2C 使用

    因为某个项目想要颜色识别,去识别球的颜色,但是又不想多来个摄像头,所以想尝试一下颜色传感器的方案。但是经过尝试,HAL库生成的 FreeRTOS 硬件 I2C 读写一直在报错。 刚好手头上有九轴陀螺仪的例程代码。最后用FreeRTOS 硬件 I2C 读取数据。 这里提到了阻塞式 HAL 函数(

    2024年02月20日
    浏览(19)
  • STM32 HAL库 STM32CubeMX -- I2C(IIC)

    I2C 通讯协议(Inter - Integrated Circuit) 也就是IIC; 由Phiilps 公司开发的,它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN 等通讯协议的外部收发设备。 I2C协议分为物理层和协议层。 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输

    2023年04月16日
    浏览(18)
  • STM32之I2C总线知识和HAL库函数

    一、 I2C总线知识 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接

    2024年02月21日
    浏览(19)
  • STM32基于CubeMX与HAL库的I2C应用

    1.1 物理层         I2C协议和摩托罗拉公司的SPI协议一样,是一种通讯协议。串行外围设备接口,是一种高速全双工的通信总线,是由 Phiilps 公司开发的。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内

    2024年02月21日
    浏览(24)
  • STM32设置为I2C从机模式(HAL库版本)

    我之前出过一篇关于STM32设置为I2C从机的博客,现在应粉丝要求,出一篇HAL库版本的I2C从机编程。 基于官方库版本的可以看下我之前发的文章:STM32设置为I2C从机模式 测试芯片:STM32F103RCT6 测试方法:用一个USB转I2C的工具接到STM32的I2C引脚上,通过上位机工具进行读写操作。如

    2024年02月12日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包