女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32移植U8g2圖形庫(kù)的方法 實(shí)現(xiàn)OLED圖形顯示

碼農(nóng)愛(ài)學(xué)習(xí) ? 來(lái)源:碼農(nóng)愛(ài)學(xué)習(xí) ? 作者:碼農(nóng)愛(ài)學(xué)習(xí) ? 2022-06-07 08:29 ? 次閱讀

之前的文章,介紹過(guò)ESP8266Arduino IDE環(huán)境中使用U8g2庫(kù),實(shí)現(xiàn)OLED上的各種圖形顯示。

本篇,介紹一下U8g2庫(kù)如何移植到STM32上,進(jìn)行OLED的圖形顯示。

本次的實(shí)驗(yàn)硬件為:

STM32:型號(hào)為最常見(jiàn)的STM32F103C8T6

OLED:0.96寸OLED,IIC接口(如果是SPI接口,文中也有對(duì)應(yīng)的修改介紹)

1 U8g2簡(jiǎn)介

U8g2 是一個(gè)用于嵌入式設(shè)備的單色圖形庫(kù)。U8g2支持單色OLED和LCD,并支持如SSD1306等多種類型的OLED驅(qū)動(dòng)。

U8g2源碼的開(kāi)源庫(kù)地址:https://github.com/olikraus/u8g2

pYYBAGKeIkWAbyNYAADKIaGINn0614.png

2 移植步驟

首先下載U8g2的源碼,因?yàn)镾TM32主要是使用C語(yǔ)言編程,所以只需關(guān)注源碼中的C源碼部分,即csrc文件夾下的文件。

2.1 精簡(jiǎn)c源碼

U8g2支持多種顯示驅(qū)動(dòng)的屏幕,因?yàn)樵创a中也包含了各個(gè)驅(qū)動(dòng)對(duì)應(yīng)的文件,為了減小整個(gè)工程的代碼體積,在移植U8g2時(shí),可以刪除一些無(wú)用的文件。

2.1.1 去掉無(wú)用的驅(qū)動(dòng)文件

這些驅(qū)動(dòng)文件通常是u8x8_d_xxx.c,xxx包括驅(qū)動(dòng)的型號(hào)和屏幕分辨率。ssd1306驅(qū)動(dòng)芯片的OLED,使用u8x8_ssd1306_128x64_noname.c這個(gè)文件,其它的屏幕驅(qū)動(dòng)和分辨率的文件可以刪掉。

pYYBAGKeIk6Afkk8AAEKVfzfGYc168.png

2.1.2 精簡(jiǎn)u8g2_d_setup.c

由于我的OLED是IIC接口,只留一個(gè)本次要用到的u8g2_Setup_ssd1306_i2c_128x64_noname_f就好(如果是SPI接口,需要使用u8g2_Setup_ssd1306_128x64_noname_f這個(gè)函數(shù)),其它的可以刪掉或注釋掉。

#include "u8g2.h"

/* ssd1306 f */
void u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
{
  uint8_t tile_buf_height;
  uint8_t *buf;
  u8g2_SetupDisplay(u8g2, u8x8_d_ssd1306_128x64_noname, u8x8_cad_ssd13xx_fast_i2c, byte_cb, gpio_and_delay_cb);
  buf = u8g2_m_16_8_f(&tile_buf_height);
  u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
}

注意,與這個(gè)函數(shù)看起來(lái)十分相似的函數(shù)的有:

u8g2_Setup_ssd1306_128x64_noname_1

u8g2_Setup_ssd1306_128x64_noname_2

u8g2_Setup_ssd1306_128x64_noname_f

u8g2_Setup_ssd1306_i2c_128x64_noname_1

u8g2_Setup_ssd1306_i2c_128x64_noname_2

u8g2_Setup_ssd1306_i2c_128x64_noname_f

其中,前面3個(gè),是給SPI接口的OLED用的,函數(shù)最后的數(shù)字或字母,代表顯示時(shí)的buf大小:

1:128字節(jié)

2:256字節(jié)

f1024字節(jié)

2.1.3 精簡(jiǎn)u8g2_d_memory.c

由于用到的u8g2_Setup_ssd1306_i2c_128x64_noname_f函數(shù)中,只調(diào)用了u8g2_m_16_8_f這個(gè)函數(shù),所以留下這個(gè)函數(shù),其它的函數(shù)一定要?jiǎng)h掉或注釋掉,否則編譯時(shí)很可能會(huì)提示內(nèi)存不足!!!

#include "u8g2.h"

uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)
{
  #ifdef U8G2_USE_DYNAMIC_ALLOC
  *page_cnt = 8;
  return 0;
  #else
  static uint8_t buf[1024];
  *page_cnt = 8;
  return buf;
  #endif
}

2.2 編寫移植函數(shù)

精簡(jiǎn)源碼之后,還需要編寫如下的配置函數(shù)。

2.2.1 GPIO初始化

對(duì)OLED用到的IIC接口進(jìn)行GPIO的初始化配置:

#define SCL_Pin GPIO_Pin_6
#define SDA_Pin GPIO_Pin_7
#define IIC_GPIO_Port GPIOB
void IIC_Init(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	
	   
	GPIO_InitStructure.GPIO_Pin = SCL_Pin|SDA_Pin;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(IIC_GPIO_Port, &GPIO_InitStructure);
}

如果是SPI接口,則初始化對(duì)應(yīng)的SPI接口即可。

2.2.2 u8x8_gpio_and_delay

這個(gè)函數(shù)也需要自己寫,主要的修改包括:

賦予U8g2相應(yīng)的延時(shí)函數(shù),比如下面的delay_ms和delay_us

為U8g2提供IIC接口的高低電平調(diào)用:

U8X8_MSG_GPIO_I2C_CLOCK:IIC的SCL

U8X8_MSG_GPIO_I2C_DATA:IIC的SDA

uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch (msg)
    {
    case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
        __NOP();
        break;
    case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
        for (uint16_t n = 0; n < 320; n++)
        {
            __NOP();
        }
        break;
    case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
        delay_ms(1);
        break;
    case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
        delay_us(5);
        break;                    // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
    case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
		if(arg_int == 1) 
		{
			GPIO_SetBits(IIC_GPIO_Port, SCL_Pin);
		}
		else if(arg_int == 0)
		{
			GPIO_ResetBits(IIC_GPIO_Port, SCL_Pin);  
		}  
        break;                    // arg_int=1: Input dir with pullup high for I2C clock pin
    case U8X8_MSG_GPIO_I2C_DATA:  // arg_int=0: Output low at I2C data pin
        if(arg_int == 1) 
		{
			GPIO_SetBits(IIC_GPIO_Port, SDA_Pin);
		}
		else if(arg_int == 0)
		{
			GPIO_ResetBits(IIC_GPIO_Port, SDA_Pin);  
		} 
        break;                    // arg_int=1: Input dir with pullup high for I2C data pin
    case U8X8_MSG_GPIO_MENU_SELECT:
        u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
        break;
    case U8X8_MSG_GPIO_MENU_NEXT:
        u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
        break;
    case U8X8_MSG_GPIO_MENU_PREV:
        u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
        break;
    case U8X8_MSG_GPIO_MENU_HOME:
        u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
        break;
    default:
        u8x8_SetGPIOResult(u8x8, 1); // default return value
        break;
    }
    return 1;
}

如果是SPI接口,可以參考如下寫法:

uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch (msg)
    {
        case U8X8_MSG_GPIO_SPI_DATA:
            lcd_sdin((uint8_t)arg_int); //SPI - MOSI
            break;
        case U8X8_MSG_GPIO_SPI_CLOCK: //SPI - CLK
            lcd_sclk(arg_int);
            break;
        case U8X8_MSG_GPIO_AND_DELAY_INIT:
            oled_init(); //OLED初始化
            Delay(1);
            break;
        case U8X8_MSG_DELAY_MILLI:
            Delay(arg_int); //延時(shí)
            break;
        case U8X8_MSG_GPIO_CS: //SPI - CS
            lcd_cs((uint8_t)arg_int);
        case U8X8_MSG_GPIO_DC:
            lcd_dc((uint8_t)arg_int); //SPI - MISO
            break;
        case U8X8_MSG_GPIO_RESET:
            break;
    }
    return 1;
}

可以看出,對(duì)于IIC與SPI接口,只有分別進(jìn)行對(duì)應(yīng)的配置即可。

2.2.3 u8g2Init

U8g2的初始化,需要調(diào)用下面這個(gè)u8g2_Setup_ssd1306_128x64_noname_f函數(shù),該函數(shù)的4個(gè)參數(shù)含義:

u8g2:傳入的U8g2結(jié)構(gòu)體

U8G2_R0:默認(rèn)使用U8G2_R0即可(用于配置屏幕是否要旋轉(zhuǎn))

u8x8_byte_sw_i2c:使用軟件IIC驅(qū)動(dòng),該函數(shù)由U8g2源碼提供

u8x8_gpio_and_delay:就是上面我們寫的配置函數(shù)

void u8g2Init(u8g2_t *u8g2)
{
	u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay);  // 初始化 u8g2 結(jié)構(gòu)體
	u8g2_InitDisplay(u8g2); // 根據(jù)所選的芯片進(jìn)行初始化工作,初始化完成后,顯示器處于關(guān)閉狀態(tài)
	u8g2_SetPowerSave(u8g2, 0); // 打開(kāi)顯示器
	u8g2_ClearBuffer(u8g2);
}

2.2.4 顯示測(cè)試函數(shù)

使用U8g2提供的測(cè)試函數(shù),用于查看顯示效果

void draw(u8g2_t *u8g2)
{
    u8g2_SetFontMode(u8g2, 1); /*字體模式選擇*/
    u8g2_SetFontDirection(u8g2, 0); /*字體方向選擇*/
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf); /*字庫(kù)選擇*/
    u8g2_DrawStr(u8g2, 0, 20, "U");
    
    u8g2_SetFontDirection(u8g2, 1);
    u8g2_SetFont(u8g2, u8g2_font_inb30_mn);
    u8g2_DrawStr(u8g2, 21,8,"8");
        
    u8g2_SetFontDirection(u8g2, 0);
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf);
    u8g2_DrawStr(u8g2, 51,30,"g");
    u8g2_DrawStr(u8g2, 67,30,"xb2");
    
    u8g2_DrawHLine(u8g2, 2, 35, 47);
    u8g2_DrawHLine(u8g2, 3, 36, 47);
    u8g2_DrawVLine(u8g2, 45, 32, 12);
    u8g2_DrawVLine(u8g2, 46, 33, 12);
  
    u8g2_SetFont(u8g2, u8g2_font_4x6_tr);
    u8g2_DrawStr(u8g2, 1,54,"github.com/olikraus/u8g2");
}

2.3 源碼加入到MDK編譯

在一個(gè)STM32的基礎(chǔ)例程上進(jìn)行修改。

2.3.1添加u8g2源碼到工程

左側(cè)工程目錄添加U8g2源碼,然后再添加U8g2的頭文件搜尋目錄,如下:

pYYBAGKeIlqAS42_AAG_sD-BLpY254.png

2.3.2 主函數(shù)

主函數(shù)中,首先是IIC的初始化和U8g2的初始化,然后就可以測(cè)試U8g2的圖形顯示功能了:

#include "delay.h"
#include "sys.h"
#include "u8g2.h"

int main(void)
{	
	delay_init();
	IIC_Init();
	 
    u8g2_t u8g2;
	u8g2Init(&u8g2);

	while(1)
	{
       u8g2_FirstPage(&u8g2);
       do
       {
			draw(&u8g2);
       } while (u8g2_NextPage(&u8g2));
    }
}

3 測(cè)試效果

pYYBAGKeImaAbklYAAES8Ep9QH8703.png

4 總結(jié)

本篇介紹了如何將U8g2圖形庫(kù)移植到STM32中,其中主要的修改包括:

精簡(jiǎn)源碼中的u8g2_d_setup.c和u8g2_d_memory.c

OLED所用IIC接口的GPIO初始化

編寫u8x8_gpio_and_delay和u8g2Init

其中,u8g2_d_memory.c文件一定要去掉無(wú)用的函數(shù),否則編譯時(shí)會(huì)提示內(nèi)存不足;對(duì)于SPI接口的OLED,參考IIC接口進(jìn)行類似的修改即可。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6061

    文章

    44871

    瀏覽量

    646083
  • 嵌入式
    +關(guān)注

    關(guān)注

    5133

    文章

    19501

    瀏覽量

    314280
  • OLED
    +關(guān)注

    關(guān)注

    119

    文章

    6263

    瀏覽量

    226953
  • STM32
    +關(guān)注

    關(guān)注

    2288

    文章

    10999

    瀏覽量

    361983
  • u8g2
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    2083
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Micro OLED 陽(yáng)極像素定義層制備方法及白光干涉儀在光刻圖形的測(cè)量

    ? 引言 ? Micro OLED 作為新型顯示技術(shù),在微型顯示領(lǐng)域極具潛力。其中,陽(yáng)極像素定義層的制備直接影響器件性能與顯示效果,而光刻圖形
    的頭像 發(fā)表于 05-23 09:39 ?42次閱讀
    Micro <b class='flag-5'>OLED</b> 陽(yáng)極像素定義層制備<b class='flag-5'>方法</b>及白光干涉儀在光刻<b class='flag-5'>圖形</b>的測(cè)量

    關(guān)于stm32u8g2菜單之間切換(三)用u8g2寫一個(gè)菜單無(wú)限左右循環(huán)

    u8g2_DrawXBMP();? 函數(shù)畫(huà)圖需要的是我們圖片的地址而不是整個(gè)圖片數(shù)組。 下面是源碼: ? int ui_run(int *a,int *a_tag,uint8_
    的頭像 發(fā)表于 03-11 09:10 ?394次閱讀

    關(guān)于stm32u8g2菜單之間切換(三)寫u8g2的一些必要函數(shù)

    要想stm應(yīng)用u8g2繪制界面需要對(duì)u8g2原函數(shù) u8g2_Setup_ssd1306_i2c_128x128_f (u8g2_t *u8g2
    的頭像 發(fā)表于 03-07 12:53 ?434次閱讀
    關(guān)于<b class='flag-5'>stm32</b>,<b class='flag-5'>u8g2</b>菜單之間切換(三)寫<b class='flag-5'>u8g2</b>的一些必要函數(shù)

    關(guān)于stm32u8g2菜單之間切換(1)

    移植U8g2庫(kù)
    的頭像 發(fā)表于 03-05 16:43 ?382次閱讀

    關(guān)于stm32u8g2菜單之間切換(二)u8g2移植

    移植是基于stm32cubeide,oled屏是1306驅(qū)動(dòng)128x64的。接口用iic軟件模擬,hal庫(kù)iic硬件貌似有bug。 1,先在網(wǎng)上下載
    的頭像 發(fā)表于 03-04 09:52 ?733次閱讀
    關(guān)于<b class='flag-5'>stm32</b>,<b class='flag-5'>u8g2</b>菜單之間切換(二)<b class='flag-5'>u8g2</b>的<b class='flag-5'>移植</b>

    深入了解U8g2與LVGL圖形庫(kù)

    在單片機(jī)開(kāi)發(fā)領(lǐng)域,圖形顯示功能變得越來(lái)越重要。無(wú)論是工業(yè)控制界面、智能家居設(shè)備,還是手持儀器儀表,都需要一個(gè)高效且易用的圖形庫(kù)來(lái)實(shí)現(xiàn)豐富的可
    的頭像 發(fā)表于 02-13 11:01 ?1569次閱讀

    【瑞薩RA2L1入門學(xué)習(xí)】開(kāi)箱+Keil環(huán)境搭建+點(diǎn)燈+點(diǎn)亮OLED

    I2C 的 SCL 和 SDA 這里使用 IO 模擬 I2C 通信 驅(qū)動(dòng)代碼如下: void OLED_SSD1306_Init(void) { u8 i
    發(fā)表于 01-25 12:10

    【RA-Eco-RA4E2-64PIN-V1.0開(kāi)發(fā)板試用】3D 圖形顯示

    前一篇點(diǎn)亮了 SSD1327 驅(qū)動(dòng)的 16 級(jí)灰階 OLED 屏 https://bbs.elecfans.com/jishu_2473968_1_1.html 這次使用這塊屏進(jìn)行 3D 顯示,效果
    發(fā)表于 01-20 01:23

    Stellaris圖形庫(kù)用戶指南

    電子發(fā)燒友網(wǎng)站提供《Stellaris圖形庫(kù)用戶指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-23 16:19 ?0次下載
    Stellaris<b class='flag-5'>圖形</b><b class='flag-5'>庫(kù)</b>用戶指南

    【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】開(kāi)箱+點(diǎn)燈+點(diǎn)亮OLED

    ME32G070 支持硬件 I2C,這里偷個(gè)懶,不想使用繁瑣的跳線,直接在開(kāi)發(fā)板上隨意插入 OLED 顯示屏的引腳,如下: 直接插上 OLED
    發(fā)表于 12-19 00:25

    芯原股份與開(kāi)源圖形庫(kù)LVGL達(dá)成戰(zhàn)略合作

    芯原股份 (芯原,股票代碼:688521.SH) 今日宣布與嵌入式系統(tǒng)領(lǐng)域領(lǐng)先的開(kāi)源圖形庫(kù)LVGL達(dá)成戰(zhàn)略合作,在LVGL庫(kù)中支持芯原的低功耗3D和VGLite 2.5D GPU技術(shù)。此次合作旨在
    的頭像 發(fā)表于 11-29 09:20 ?661次閱讀

    如何在低成本ARM平臺(tái)部署LVGL免費(fèi)圖形庫(kù),基于全志T113-i

    系統(tǒng)創(chuàng)建圖形用戶界面(GUI),采用C語(yǔ)言編寫,具有高效性和可定制性,在各種微控制器平臺(tái)和顯示硬件上開(kāi)發(fā)用戶界面時(shí)備受歡迎。LVGL具社區(qū)免費(fèi)開(kāi)源、控件資源豐富、跨平臺(tái)可移植等特點(diǎn)。 社區(qū)免費(fèi)開(kāi)源
    發(fā)表于 10-29 09:55

    使用MSP430圖形庫(kù)時(shí)的設(shè)計(jì)注意事項(xiàng)

    電子發(fā)燒友網(wǎng)站提供《使用MSP430圖形庫(kù)時(shí)的設(shè)計(jì)注意事項(xiàng).pdf》資料免費(fèi)下載
    發(fā)表于 09-03 10:49 ?0次下載
    使用MSP430<b class='flag-5'>圖形</b><b class='flag-5'>庫(kù)</b>時(shí)的設(shè)計(jì)注意事項(xiàng)

    【CH32V208開(kāi)發(fā)板】圖形庫(kù)u8g2oled顯示

    靈活配置),基于 32 位 RISC-V 指令集及架構(gòu)設(shè)計(jì),芯片內(nèi)部集成了ETH-10M(+PHY)以太網(wǎng)和藍(lán)牙。 本篇講述使用u8g2圖形庫(kù)驅(qū)動(dòng)oled
    發(fā)表于 07-29 23:11

    求助,請(qǐng)問(wèn)ESP32-S2-DevKitM-1開(kāi)發(fā)板的IIC引腳是哪些?

    購(gòu)買的ESP32-S2-DevKitM-1,說(shuō)是有兩路IIC,可是到處找的資料,都沒(méi)說(shuō)是哪些引腳,使用Arduino里的Adafruit_SSD1306或者U8g2庫(kù)對(duì)0.96吋OLED
    發(fā)表于 07-01 07:03