【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结
目錄
- SPI版
- OLED SPI 端口定義
- 七針OLED引腳定義
- 六針OLED引腳定義
- 軟件SPI
- 硬件SPI
- 啟用DMA
- 幀率測(cè)試
- I2C 版
- 軟件I2C
- 硬件I2C
- DMA
STM32F103VET6
STM32 Cube IDE
SPI版
OLED SPI 端口定義
本節(jié)引自STM32驅(qū)動(dòng)0.96寸OLED液晶屏(12864液晶屏) —— 小牧同學(xué)
兩種屏幕的引腳數(shù)不一樣,左邊的有7個(gè)引腳,而右邊的只有6個(gè)。其次,端口的標(biāo)號(hào)也不完全一樣,第一個(gè)分別標(biāo)為GND,VCC,D0,D1,RES,DC和CS第二個(gè)分別標(biāo)為GND,VCC,SCL,SDA,RST,D/C。
七針OLED引腳定義
GND — 接地端口
VCC — 接3.3V電源端口
D0 — CLK時(shí)鐘信號(hào)(等同于上面的SCL)
D1 — 數(shù)據(jù)端口(等同于上面的SDA)
RES — 復(fù)位端口(等同于上面的RST)
DC — 數(shù)據(jù)/命令選擇引腳(等同于上面的D/C)
CS — 片選引腳(低電平有效,也就是所需要接低電平,我實(shí)際試驗(yàn)過不接該引腳也是可以正常使用的)
六針OLED引腳定義
GND — 接地端口
VCC — 接3.3V電源端口
SCL — CLK時(shí)鐘信號(hào)端口
SDA — MOSI數(shù)據(jù)端口
RST — 復(fù)位端口
D/C — 數(shù)據(jù)/命令選擇引腳
軟件SPI
???????指令解讀見【51單片機(jī)快速入門指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制詳解
???????各引腳初始化如下,均為推挽輸出:
???????從【51單片機(jī)快速入門指南】5:軟件SPI獲取軟件SPI程序。
修改控制電平的函數(shù):
GPIOx->BSRR = GPIO_Pin;GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;由于我們需要的只是單向的、半雙工的SPI,只需修改部分函數(shù)即可
???????從SPI驅(qū)動(dòng)0.96/1.3寸 OLED屏幕,易修改為DMA控制獲取SPI版驅(qū)動(dòng)程序。
將51特色的code改為const
修改對(duì)應(yīng)引腳
修改延時(shí)函數(shù)
在主函數(shù)中添加測(cè)試程序:
如圖,屏幕已輕松點(diǎn)亮。
幀率為180(見后文)
使用虛擬顯存是時(shí)為46幀
硬件SPI
如圖,使用硬件SPI
移除軟件SPI的程序,修改OLED_WR_Byte函數(shù)
再次測(cè)試:
成功點(diǎn)亮
幀率為410
在oled.h中啟用虛擬顯存
修改OLED_Refresh_Gram函數(shù),實(shí)現(xiàn)1024 Byte 顯存連續(xù)寫入
再次測(cè)試,仍能成功點(diǎn)亮,幀率為969。
啟用DMA
再次修改OLED_Refresh_Gram函數(shù)
extern SPI_HandleTypeDef hspi1; void OLED_Refresh_Gram(void) { #if OLED_BUFFER_MODE // uint16_t i;OLED_Set_Pos(0, 128); // for (i = 0; i < Max_Row / 8 * Max_Column; i++) // { // OLED_WR_Byte(OLED_GRAM[0][i], OLED_DATA); // }OLED_CS_L();OLED_DC_H(); // HAL_SPI_Transmit(&hspi1, OLED_GRAM[0], Max_Row / 8 * Max_Column, 10);HAL_SPI_Transmit_DMA(&hspi1, OLED_GRAM[0], Max_Row / 8 * Max_Column);while(hspi1.State != HAL_SPI_STATE_READY);OLED_DC_H();OLED_CS_H(); #endif }幀率測(cè)試
幀率的顯示:
在1ms中斷中統(tǒng)計(jì)1s內(nèi)的幀數(shù)
在每次更新屏幕內(nèi)容時(shí)FPS_Count自加1
這個(gè)幀率已經(jīng)遠(yuǎn)遠(yuǎn)超過屏幕本身所能提供的刷新率了。
I2C 版
軟件I2C
將SCL設(shè)為推挽輸出,SDA設(shè)為開漏上拉輸出
從【51單片機(jī)快速入門指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制詳解和【51單片機(jī)快速入門指南】4: 軟件 I2C獲取控制程序。
修改對(duì)應(yīng)引腳,其他部分同SPI的步驟。
測(cè)試:
幀率約為60幀
硬件I2C
修改OLED_WR_Byte函數(shù)
此時(shí)幀率為49
開虛擬顯存模式,修改OLED_Refresh_Gram函數(shù)
發(fā)現(xiàn)會(huì)更慢
DMA
開中斷
再次修改OLED_Refresh_Gram函數(shù)
extern I2C_HandleTypeDef hi2c1; void OLED_Refresh_Gram(void) { #if OLED_BUFFER_MODE // uint16_t i;OLED_Set_Pos(0, 128); // for (i = 0; i < Max_Row / 8 * Max_Column; i++) // { // OLED_WR_Byte(OLED_GRAM[0][i], OLED_DATA); // } // HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS << 1, OLED_WriteData_Addr, I2C_MEMADD_SIZE_8BIT, OLED_GRAM[0], Max_Row / 8 * Max_Column, 1000);while(hi2c1.State != HAL_I2C_STATE_READY);HAL_I2C_Mem_Write_DMA(&hi2c1, OLED_ADDRESS << 1, OLED_WriteData_Addr, I2C_MEMADD_SIZE_8BIT, OLED_GRAM[0], Max_Row / 8 * Max_Column); #endif }如圖,瓶頸應(yīng)為400kHz的I2C速度
總結(jié)
以上是生活随笔為你收集整理的【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn: Can't open file
- 下一篇: 用JoyToKey使游戏手柄变键盘或鼠标