国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS

這篇具有很好參考價(jià)值的文章主要介紹了【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

by xusiwei1236

本文將會(huì)分別介紹——使用軟件I2C和硬件I2C在PSoC開發(fā)板上點(diǎn)亮OLED屏,并進(jìn)行屏幕刷新率對(duì)比測(cè)試,最后還會(huì)在硬件I2C的基礎(chǔ)上繼續(xù)優(yōu)化屏幕刷新率。本文實(shí)驗(yàn)使用的OLED屏尺寸為0.96寸,分辨率為128x64,驅(qū)動(dòng)芯片為SSD1306。本文使用的開發(fā)環(huán)境為RT-Thread Studio,設(shè)備上運(yùn)行的是RT-Thread實(shí)時(shí)系統(tǒng)。本文主旨在于,介紹如何在PSoC開發(fā)板上使用軟件I2C和硬件硬件I2C驅(qū)動(dòng)外設(shè),以及對(duì)于屏幕刷新率優(yōu)化的一些思路。

一、準(zhǔn)備工作

開始之前,需要準(zhǔn)備實(shí)驗(yàn)所需的硬件和軟件,接下來(lái)分別介紹。

1.1 硬件準(zhǔn)備

本次實(shí)驗(yàn)需要用到的硬件有:

  • RTT&英飛凌PSoC6評(píng)估板
  • 0.96寸OLED屏(驅(qū)動(dòng)芯片SSD1306)
  • 杜邦線4根
  • USB Type-C數(shù)據(jù)線
  • 個(gè)人電腦(Windows 10)

1.2 軟件準(zhǔn)備

本次實(shí)驗(yàn)需要使用的軟件主要為:

  • RT-Thread Studio
  • MobaXterm(其他串口調(diào)試工具也可以)

假設(shè)你已經(jīng)成功在電腦上安裝了以上這些軟件。

1.3 硬件連接

硬件連接分為兩部分,一部分是PC和開發(fā)板,通過(guò)USB Type-C線連接;這個(gè)沒(méi)啥難度,不做過(guò)多介紹;需要注意的是,開發(fā)板一端接DAP口;否則無(wú)法正常下載程序。

另外一部分是,開發(fā)板和OLED屏幕之間的連接,具體如下表所示:

OLED屏引腳 開發(fā)板引腳
SDA SDA
SCL SCL
GND GND
VCC 3V3

開發(fā)板和OLED屏幕之間的硬件連接,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

二、原理分析

這么連接之后,如果主控芯片使用軟件I2C驅(qū)動(dòng)OLED屏,那么什么限制,對(duì)應(yīng)管腳只需要使用GPIO模擬I2C時(shí)序即可。如果想要讓主控芯片使用硬件I2C驅(qū)動(dòng)OLED屏,則需要檢查一下主控芯片對(duì)應(yīng)引腳可以設(shè)置為硬件I2C功能,接下來(lái)即為檢查的過(guò)程。

2.1 開發(fā)板原理圖

首先,檢查開發(fā)板原理圖的Arduino接口部分:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

這里只能看到標(biāo)號(hào),看不到主控芯片的引腳名稱。

所以,還需要繼續(xù)搜索這兩個(gè)引腳的標(biāo)號(hào),找到主控芯片對(duì)應(yīng)的引腳標(biāo)號(hào):

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

對(duì)照這兩處可以知道——Arduino接口I2C引腳和主控芯片直接的連接關(guān)系為:

  • SCL:P8.0
  • SDA:P8.1

2.2 芯片數(shù)據(jù)手冊(cè)

《PSoC 6 MCU: CY8C62x8, CY8C62xA Datasheet》文檔的 Pinouts 章節(jié),Table 8. Multiple Alternate Functions 引腳功能服用表,可以查到P8.0和P8.1的功能有:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

可以看到,有scb[4].i2c_scl和scb[4].i2c_sda功能。

也就是說(shuō),P8.0和P8.1可以設(shè)置為硬件I2C功能。

三、軟件I2C驅(qū)動(dòng)OLED

接下來(lái),將使用RT-Thread Studio創(chuàng)建項(xiàng)目,并通過(guò)添加軟件包和修改配置的方式,實(shí)現(xiàn)使用軟件I2C驅(qū)動(dòng)OLED屏幕。

3.1 創(chuàng)建RT-Thread項(xiàng)目

在RT-Thread Studio中,打開“文件”→“新建”→”RT-Thread項(xiàng)目”菜單,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

在彈出的創(chuàng)建項(xiàng)目界面中,Project name中填入psoc6_oled,選中基于開發(fā)板的項(xiàng)目,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

點(diǎn)擊“完成”,即可創(chuàng)建名為psoc6_oled的項(xiàng)目。

3.2 添加ssd1306軟件包

創(chuàng)建項(xiàng)目后,雙擊項(xiàng)目資源管理器視圖中,項(xiàng)目下方的“RT-Thread Settings”,主編輯區(qū)如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

點(diǎn)擊其中的“添加軟件包”,彈出的軟件包搜索界面,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

按照?qǐng)D中標(biāo)注的操作順序,即可將ssd1306軟件包添加到當(dāng)前項(xiàng)目。

添加完成后,主編輯區(qū)如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

此時(shí),按Ctrl+S快捷鍵,保存對(duì)項(xiàng)目配置的修改。如果網(wǎng)絡(luò)通常,則會(huì)在控制臺(tái)窗口中看到ssd1306軟件包正常下載的日志:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

這樣,ssd1306軟件包就成功添加到項(xiàng)目中了,位于packages子目錄下:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

3.3 配置軟件I2C和ssd1306軟件包

接下來(lái),在RT-Thread Studio主編輯器,點(diǎn)擊詳細(xì)配置按鈕,按鈕位置如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

主編輯器將會(huì)顯示詳細(xì)配置:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

切換到“硬件”標(biāo)簽頁(yè),找到“Enable Software I2C”選項(xiàng),并打開該選項(xiàng),如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

接著,打開“使能I2C1 BUS”,并將scl和sda中分別改為64和65,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

然后,在搜索框輸入ssd1306,彈出懸浮菜單后,單擊該懸浮菜單,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

勾選“Enable debug log output”和“Enable ssd1306 sample”,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

最后,按Ctrl+S保存對(duì)所有配置項(xiàng)的修改。

3.4 編譯和下載程序

首先,點(diǎn)擊工具欄的錘子圖標(biāo),或者按Ctrl+B快捷鍵,觸發(fā)項(xiàng)目構(gòu)建(全部編譯):

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

項(xiàng)目構(gòu)建完成后,可以在控制臺(tái)窗口看到生成了elf文件,以及預(yù)計(jì)Flash和RAM占用情況:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

接著,點(diǎn)擊工具欄上的下載圖標(biāo),或者Ctrl+Alt+D快捷鍵,觸發(fā)下載程序二進(jìn)制文件到開發(fā)板上,如下圖:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

下載過(guò)程中以及下載完成后,控制臺(tái)窗都可以看到日志輸出:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

PS:開始下載之前,需要確認(rèn)開發(fā)板以及和PC正確連接了(開發(fā)板要連在DAP口上,并能夠正常識(shí)別)。

3.5 運(yùn)行和測(cè)試程序

為了方便在串口中進(jìn)行命令控制,運(yùn)行之前,需要先打開MobaXterm(或者其他串口調(diào)試工具):

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

如上圖所示,選中對(duì)應(yīng)的COM號(hào),串口參數(shù)設(shè)置為:

  • 波特率 115200
  • 數(shù)據(jù)位 8
  • 停止位 1
  • 校驗(yàn) None
  • 流控 None

之后,點(diǎn)OK確認(rèn)連接。

連接成功后,按開發(fā)板的復(fù)位鍵,可以看到串口連接中輸出:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

此時(shí)輸入help命令并回車:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

可以看到,有ssd1306_TestAll命令。

輸入ssd1306_TestAll命令并回車,如無(wú)意外,將會(huì)看到OLED屏幕上已經(jīng)有畫面顯示了:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

但是此時(shí)的幀率較低,測(cè)試顯示僅有2幀每秒:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

四、硬件I2C驅(qū)動(dòng)OLED

方便起見,接下來(lái)將不再創(chuàng)建新項(xiàng)目,而是在剛剛創(chuàng)建的RT-Thread Studio項(xiàng)目上進(jìn)行修改,通過(guò)修改配置的方式,實(shí)現(xiàn)使用硬件I2C驅(qū)動(dòng)OLED屏幕。

4.1 增加I2C4配置和代碼

RT-Thread Studio默認(rèn)創(chuàng)建的項(xiàng)目不支持I2C4,不能實(shí)現(xiàn)硬件I2C驅(qū)動(dòng)OLED。因此,需要先添加I2C4配置和代碼,才能進(jìn)行后續(xù)操作。

首先,修改 board/Kconfig 文件,在config BSP_USING_HW_I2C6之前添加如下代碼行:

            config BSP_USING_HW_I2C4
                bool "Enable I2C4 Bus (Arduino I2C)"
                default n
                if BSP_USING_HW_I2C4
                    comment "Notice: P8_0 --> 64; P8_1 --> 65"
                    config BSP_I2C4_SCL_PIN
                        int "i2c4 SCL pin number"
                        range 1 113
                        default 64
                    config BSP_I2C4_SDA_PIN
                        int "i2c4 SDA pin number"
                        range 1 113
                        default 65
                endif

接著,修改 libraries/HAL_Drivers/SConscript 文件,找到 src += [‘drv_i2c.c’] 前一行,添加一個(gè)條件:

if GetDepend('BSP_USING_HW_I2C3') or GetDepend('BSP_USING_HW_I2C4') or GetDepend('BSP_USING_HW_I2C6'):

最后,修改 libraries/HAL_Drivers/drv_i2c.c 文件,具體修改內(nèi)容為:

--- a/libraries/HAL_Drivers/drv_i2c.c
+++ b/libraries/HAL_Drivers/drv_i2c.c
@@ -11,7 +11,7 @@
 #include "board.h"

 #if defined(RT_USING_I2C)
-#if defined(BSP_USING_HW_I2C3) || defined(BSP_USING_HW_I2C6)
+#if defined(BSP_USING_HW_I2C3) || defined(BSP_USING_HW_I2C4) || defined(BSP_USING_HW_I2C6)
 #include <rtdevice.h>

 #ifndef I2C3_CONFIG
@@ -22,7 +22,16 @@
         .sda_pin = BSP_I2C3_SDA_PIN, \
     }
 #endif /* I2C3_CONFIG */
-#endif
+
+#ifndef I2C4_CONFIG
+#define I2C4_CONFIG                  \
+    {                                \
+        .name = "i2c4",              \
+        .scl_pin = BSP_I2C4_SCL_PIN, \
+        .sda_pin = BSP_I2C4_SDA_PIN, \
+    }
+#endif /* I2C4_CONFIG */
+
 #ifndef I2C6_CONFIG
 #define I2C6_CONFIG                  \
     {                                \
@@ -32,11 +41,16 @@
     }
 #endif /* I2C6_CONFIG */

+#endif /* defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) */
+
 enum
 {
 #ifdef BSP_USING_HW_I2C3
     I2C3_INDEX,
 #endif
+#ifdef BSP_USING_HW_I2C4
+    I2C4_INDEX,
+#endif
 #ifdef BSP_USING_HW_I2C6
     I2C6_INDEX,
 #endif
@@ -63,6 +77,10 @@ static struct ifx_i2c_config i2c_config[] =
         I2C3_CONFIG,
 #endif

+#ifdef BSP_USING_HW_I2C4
+        I2C4_CONFIG,
+#endif
+
 #ifdef BSP_USING_HW_I2C6
         I2C6_CONFIG,
 #endif
@@ -145,8 +163,7 @@ void HAL_I2C_Init(struct ifx_i2c *obj)

 int rt_hw_i2c_init(void)
 {
-    rt_err_t result;
-    cyhal_i2c_t mI2C;
+    rt_err_t result = RT_EOK;

     for (int i = 0; i < sizeof(i2c_config) / sizeof(i2c_config[0]); i++)
     {
@@ -157,8 +174,6 @@ int rt_hw_i2c_init(void)
         i2c_objs[i].mI2C_cfg.address = 0;
         i2c_objs[i].mI2C_cfg.frequencyhal_hz = (400000UL);

-        i2c_objs[i].mI2C = mI2C;
-
         i2c_objs[i].i2c_bus.ops = &i2c_ops;

         HAL_I2C_Init(&i2c_objs[i]);
@@ -171,4 +186,4 @@ int rt_hw_i2c_init(void)
 }
 INIT_DEVICE_EXPORT(rt_hw_i2c_init);

-#endif /* defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) */
+#endif /* RT_USING_I2C */

4.1 修改I2C和ssd1306軟件包配置

首先,打開RT-Thread Settings的詳細(xì)配置,切換到硬件標(biāo)簽頁(yè),關(guān)閉“Enable Software I2C Bus”配置項(xiàng),如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

接著,打開“Enable Hardware I2C Bus”配置項(xiàng),再打開其中的“Enable I2C4 Bus (Arduino I2C)”配置項(xiàng),如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

最后,再次搜索ssd1306,點(diǎn)擊懸浮菜單,跳回到ssd1306配置,修改I2C bus name為 i2c4 ,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

完成修改后,按Ctrl+S保存配置。

4.2 編譯、下載、運(yùn)行

重新Ctrl+B編譯,Ctrl+Alt+D下載,按RESET鍵復(fù)位之后,重新運(yùn)行 ssd1306_TestAll 命令,可以看到,OLED屏幕成功顯示畫面了。

并且,這一次測(cè)得的幀率為7fps,如下圖所示:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

這次顯示畫面快了很多,之前只有2fps,現(xiàn)在已經(jīng)7fps了;但還是不夠高,還可以繼續(xù)優(yōu)化。

接下來(lái)繼續(xù)優(yōu)化,提高幀率,提高幀率的思路:

  • 提高I2C時(shí)鐘信號(hào)頻率
  • 減少一幀畫面發(fā)送數(shù)據(jù)量

4.3 提高I2C時(shí)鐘信號(hào)頻率

接下來(lái),分別從這兩方面嘗試提升幀率。

首先是提升I2C頻率,默認(rèn)的速度寫在drv_i2c.c代碼里面:

i2c_objs[i].mI2C_cfg.frequencyhal_hz = (400000UL); // 400K

查閱芯片手冊(cè),可以知道CY8C624ABZI芯片I2C最高支持1Mbps:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

將drv_i2c.c里面的默認(rèn)I2C頻率改為1M之后,測(cè)試顯示的幀率為12fps:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

4.5 減少一幀畫面發(fā)送數(shù)據(jù)量

查看ssd1306.c文件,發(fā)現(xiàn)可以優(yōu)化的代碼:

// Send data
void ssd1306_WriteData(uint8_t* buffer, size_t buff_size) 
{
#if PKG_USING_SSD1306_HW_I2C
    HAL_I2C_Mem_Write(&SSD1306_I2C_PORT, SSD1306_I2C_ADDR, 0x40, 1, buffer, buff_size, HAL_MAX_DELAY);
#else
   for (int i = 0; i < buff_size; i++)
   {
       uint8_t buf[2] = {SSD1306_CTRL_DATA, buffer[i]};
       rt_i2c_master_send(i2c_bus, SSD1306_I2C_ADDR, RT_I2C_WR, buf, 2);
   }
#endif
}

這段代碼中,PKG_USING_SSD1306_HW_I2C 宏內(nèi)部的分支是STM32的代碼,不用關(guān)系,主要看下面的分支;

下面的分支,使用了一個(gè)for循環(huán),調(diào)用rt_i2c_master_send接口,每次卻只發(fā)送兩個(gè)字節(jié),存在重復(fù)的大量的SSD1306_CTRL_DATA字節(jié)。

查詢SSD1306數(shù)據(jù)手冊(cè),可以知道,它是支持在一個(gè)數(shù)據(jù)標(biāo)記字節(jié)之后,連續(xù)發(fā)送數(shù)據(jù)的:

相應(yīng)的可以優(yōu)化為:

// Send data
void ssd1306_WriteData(uint8_t* buffer, size_t buff_size) 
{
    uint32_t len = buff_size + 1;
    uint8_t* data = rt_malloc(len); // 申請(qǐng)一個(gè)更大的緩沖
    RT_ASSERT(data);

    // 準(zhǔn)備數(shù)據(jù)
    data[0] = SSD1306_CTRL_DATA;
    rt_memcpy(&data[1], buffer, buff_size);

    // 發(fā)送
    rt_i2c_master_send(i2c_bus, SSD1306_I2C_ADDR, RT_I2C_WR, data, len);

    rt_free(data); // 釋放
}

這段代碼修改之后,再次運(yùn)行,測(cè)得幀率為45fps:

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

更進(jìn)一步檢查,發(fā)現(xiàn)還有優(yōu)化空間:

void ssd1306_UpdateScreen(void) 
{
    // Write data to each page of RAM. Number of pages
    // depends on the screen height:
    //
    //  * 32px   ==  4 pages
    //  * 64px   ==  8 pages
    //  * 128px  ==  16 pages
    for(uint8_t i = 0; i < SSD1306_HEIGHT/8; i++) 
    {
        ssd1306_WriteCommand(0xB0 + i); // Set the current RAM page address.
        ssd1306_WriteCommand(0x00);
        ssd1306_WriteCommand(0x10);
        ssd1306_WriteData(&SSD1306_Buffer[SSD1306_WIDTH*i],SSD1306_WIDTH);
    }
}

這個(gè)函數(shù)里面,從注釋可以知道,對(duì)于128x64分辨率的屏,會(huì)分為8頁(yè)進(jìn)行發(fā)送;每個(gè)頁(yè)面發(fā)送開始的時(shí)候,會(huì)調(diào)用三次ssd1306_WriteCommand函數(shù)。

實(shí)際上可以不需要重復(fù)調(diào)用ssd1306_WriteCommand函數(shù):

void ssd1306_UpdateScreen(void) 
{
    uint8_t cmd[] = {
        0X21,   // 設(shè)置列起始和結(jié)束地址
        0X00,   // 列起始地址 0
        0X7F,   // 列終止地址 127
        0X22,   // 設(shè)置頁(yè)起始和結(jié)束地址
        0X00,   // 頁(yè)起始地址 0
        0X07,   // 頁(yè)終止地址 7
    };
    uint32_t count = 0;
    uint8_t data[2 * sizeof(cmd) + 1 + SSD1306_BUFFER_SIZE ] = {};

    // copy cmd
    for (uint32_t i = 0; i < sizeof(cmd)/sizeof(cmd[0]); i++) {
        data[count++] = SSD1306_CTRL_CMD | SSD1306_MASK_CONT;
        data[count++] = cmd[i];
    }

    // copy frame data
    data[count++] = SSD1306_CTRL_DATA;
    memcpy(&data[count], SSD1306_Buffer, sizeof(SSD1306_Buffer));
    count += sizeof(SSD1306_Buffer);

    // send to i2c bus
    rt_i2c_master_send(i2c_bus, SSD1306_I2C_ADDR, RT_I2C_WR, data, count);
}

【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飛凌,嵌入式

非??炝耍呀?jīng)是最初2fps的25倍。

最終達(dá)到的幀率并沒(méi)有達(dá)到OLED屏幕的物理極限,可能還存在一些優(yōu)化空間,感興趣的讀者還可以在此基礎(chǔ)上繼續(xù)探索。

文章就到這里,感謝閱讀,下次再會(huì)~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-599815.html

五、參考鏈接

  1. RTT PSoC開發(fā)板原理圖:IFX-PSoC6-RT-Thread-sch.pdf (gitee.com)
  2. CY8C624A 芯片數(shù)據(jù)手冊(cè):Infineon-PSOC_6_MCU_CY8C62X8_CY8C62XA-DataSheet-v18_00-EN.pdf
  3. CY8C624A 架構(gòu)參考手冊(cè): Infineon-PSoC_6_MCU_CY8C6xx8_CY8C6xxA_Architecture_Technical_Reference_Manual_(TRM)-AdditionalTechnicalInformation-v08_00-EN.pdf
  4. CY8C624A 寄存器參考手冊(cè): Infineon-PSoC_6_MCU_CY8C62x8_CY8C62xA_Registers_Technical_Reference_Manual-AdditionalTechnicalInformation-v06_00-EN.pdf
  5. Cypress HAL接口參考: Redirecting to Infineon GitHub (cypresssemiconductorco.github.io)

到了這里,關(guān)于【英飛凌PSoC 6】使用軟件和硬件I2C點(diǎn)亮OLED屏,幀率從2FPS提升到51FPS的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32硬件I2C通信外設(shè)

    STM32硬件I2C通信外設(shè)

    本文主要介紹stm32自帶的I2C通信外設(shè),對(duì)比與軟件模擬I2C,硬件I2C可以自動(dòng)生成時(shí)序,時(shí)序的操作更加及時(shí)規(guī)范,可以實(shí)現(xiàn)更加高性能的IIC通信。 本文內(nèi)容與I2C軟件通信有諸多類似之處,I2C軟件通信可見:https://blog.csdn.net/qq_53922901/article/details/136662006?spm=1001.2014.3001.5501 在8位指

    2024年04月08日
    瀏覽(27)
  • 基于英飛凌MCU PSoC? 6的 Matter智能家居解決方案

    基于英飛凌MCU PSoC? 6的 Matter智能家居解決方案

    本文轉(zhuǎn)載自:英飛凌官微 2019年底,中國(guó)已成為全球最大的物聯(lián)網(wǎng)市場(chǎng),全球15億臺(tái)蜂窩網(wǎng)絡(luò)連接設(shè)備中9.6億臺(tái)來(lái)自中國(guó),占比64%。國(guó)內(nèi)智能家居產(chǎn)品和解決方案的普及程度不斷提高,消費(fèi)者對(duì)智能家居設(shè)備的需求也不斷增加。根據(jù)預(yù)測(cè),到2025年,中國(guó)智能家居市場(chǎng)的規(guī)模將

    2024年01月19日
    瀏覽(18)
  • Hi3861 硬件 i2c 驅(qū)動(dòng) oled

    Hi3861 硬件 i2c 驅(qū)動(dòng) oled

    最近想用 3861 做個(gè)有意思的東西,記錄一下開發(fā)過(guò)程。今天使用 3861 的硬件 i2c 驅(qū)動(dòng) oled。 硬件平臺(tái):Bearpi-Nano 軟件SDK:潤(rùn)和sdk 我之前寫過(guò)一篇基于 stm32cubemx 快速使用 iic 接口 oled 的過(guò)程,里面有現(xiàn)成的 oled 接口,我們只要直接拿過(guò)來(lái)替換掉底層接口就行。 ?STM32CubeMX驅(qū)動(dòng)4腳

    2023年04月23日
    瀏覽(27)
  • 【科普貼】I2C接口詳解——偏硬件解析

    【科普貼】I2C接口詳解——偏硬件解析

    I2C最早是Philips公司開發(fā)的一款簡(jiǎn)單的雙向總線,實(shí)現(xiàn)有效的IC控制。把這個(gè)總線寫成Inter IC 簡(jiǎn)稱IIC或I2C(PS:說(shuō)白了2就是兩個(gè)“I”的意思。) I2C總線一些特征: 1、 只有兩根線分別是串行數(shù)據(jù)線(SDA),串行時(shí)鐘線(SCL)。 2、 每個(gè)連接到總線的器件有唯一一個(gè)地址。 3、

    2024年02月07日
    瀏覽(22)
  • 【文末福利】我用英飛凌的PSoC? 62搞了點(diǎn)智能家居的創(chuàng)意

    【文末福利】我用英飛凌的PSoC? 62搞了點(diǎn)智能家居的創(chuàng)意

    概要 本文給大家介紹一個(gè)Infineon和ChatGPT的人工智能語(yǔ)音小管家項(xiàng)目,該項(xiàng)目是博主架構(gòu)師李肯參加由RT-Thread與英飛凌聯(lián)合舉辦的2023英飛凌創(chuàng)意創(chuàng)客大賽的參賽項(xiàng)目,旨在探索智能硬件+智能音箱+ChatGPT的超級(jí)組合在C端市場(chǎng)的潛在應(yīng)用,希望能給大家?guī)?lái)幫助和啟發(fā)。 如今,智

    2024年02月16日
    瀏覽(19)
  • 【STM32】入門(七):I2C硬件控制方式

    【STM32】入門(七):I2C硬件控制方式

    之所以叫“I2C硬件控制方式”是與“軟件控制方式”相對(duì)。I2C軟件控制,就是寫程序直接操作兩個(gè)GPIO引腳,分別作為時(shí)鐘線SCL和數(shù)據(jù)線SDA,按照I2C協(xié)議的時(shí)序要求,操作GPIO輸入、輸出、高電平、低電平。 聽著就很復(fù)雜,好在STM32中有I2C的硬件實(shí)現(xiàn),即通過(guò)簡(jiǎn)單的操作寄存器

    2023年04月08日
    瀏覽(26)
  • GD32 單片機(jī) 硬件I2C死鎖解決方法

    GD32 單片機(jī) 硬件I2C死鎖解決方法

    在I2C恢復(fù)函數(shù)下個(gè)斷點(diǎn)(檢測(cè)到I2C多次超時(shí)之后,應(yīng)該能跳轉(zhuǎn)到I2C恢復(fù)函數(shù)) 使用鑷子,將SCL與SDA短接,很快就能看到程序停到恢復(fù)函數(shù)的斷點(diǎn)上,此時(shí)再執(zhí)行恢復(fù)函數(shù),看能否正常走出(可在回復(fù)函數(shù)中寫個(gè)死循環(huán),只有I2C正常才跳出,檢測(cè)I2C正常的辦法,可以讀從設(shè)備的

    2024年02月05日
    瀏覽(46)
  • STM32F407系列硬件I2C筆記

    STM32F407系列有3個(gè)硬件I2C: I2C1:該接口位于GPIOB引腳上,包括PB6(I2C1_SCL)和PB7(I2C1_SDA)。 I2C2:該接口位于GPIOB引腳上,包括PB10(I2C2_SCL)和PB11(I2C2_SDA)。 I2C3:該接口位于GPIOA和GPIOC引腳上,包括PA8(I2C3_SCL)和PC9(I2C3_SDA)。 ? 硬件I2C的速度比軟件I2C更快,硬件I2C通??梢?/p>

    2024年02月04日
    瀏覽(33)
  • 【STM32】軟件I2C的使用 —— 看這一篇就夠了(附代碼)

    【STM32】軟件I2C的使用 —— 看這一篇就夠了(附代碼)

    歡迎來(lái)到我的博客。今天我想向大家介紹一下STM32軟件I2C功能。 首先,讓我們來(lái)了解一下I2C(Inter-Integrated Circuit)總線。I2C是一種串行通信總線,最初由Philips公司開發(fā)。它允許多個(gè)設(shè)備使用同一條總線進(jìn)行通信,并且每個(gè)設(shè)備都有唯一的地址。I2C通常用于連接微控制器、傳感

    2024年02月06日
    瀏覽(18)
  • STM32F030硬件I2C代碼及解析

    STM32F030硬件I2C代碼及解析

    剛接觸STM32的時(shí)候,第一個(gè)學(xué)習(xí)的就是I2C,當(dāng)時(shí)去網(wǎng)上學(xué)習(xí)別人寫得I2C代碼,雖然能用,但是當(dāng)時(shí)并不理解為什么要這么配置,特別希望有人把代碼掰碎了講講看,今天突然想起來(lái),就把以前寫的I2C代碼拿出來(lái)掰碎了捋捋,希望對(duì)新手有些幫助。 先說(shuō)說(shuō)STM32的I2C: ST的M3系列還

    2024年02月08日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包