以下文章來源于:公_眾_號開源電子網
讀取更多技術文章,請掃碼關注

如何使用FSMC讓OLED螢屏重繪率飛起來?
前言
這篇文章不過多描述OLED作業原理及驅動程序還有FSMC外設,僅從實用性出發,如何使用FSMC外設模擬8080時序驅動OLED螢屏,讓重繪率飛起來,這里我們以正點原子戰艦板OLED實驗例程為基礎,LCD例程為輔助,
使用FSMC模擬8080時序驅動OLED螢屏步驟如下:
1、確認IO連接關系
2、初始化IO口(配置為復用模式)
3、初始化FSMC
4、撰寫讀寫介面函式
5、撰寫OLED初始化函式
6、撰寫OLED畫點和讀點函式
第一步:確認IO連接關系
這時候我們并不是用戰艦板OLED專用的插槽,而是使用LCD插槽一部分,具體如下:

(注意:F1系列大容量且引腳數目在100腳以上的芯片才有FSMC,MINI板并沒有)
IO連接關系,可以通過查閱戰艦板原理圖知道相對應標號對應的IO口,具體情況如下:
OLED信號引腳 FSMC對應標號 MCU引腳 作用
RST RESET 復位引腳
CS FSMC_NE4 PG12 片選信號
RW FSMC_NWE PD5 寫信號
RD FSMC_NOE PD4 讀信號
DC(RS) FSMC_A10 PG0 資料/命令線
D[x] FSMC_Dx D[1:0]?PD[15:14]
D[3:2]?PD[1:0]
D[7:4]?PE[10:7] 資料線(8根)
第二步:初始化IO口(配置為復用模式)
這里可以借鑒一下LCD實驗中lcd.c檔案中的HAL_SRAM_MspInit函式,并對沒有用到的GPIO口進行刪減,例如FSMC_D8~15可以洗掉,具體代碼如下:

第三步:初始化FSMC
FSMC外設相關介紹可以參考LCD實驗章節教程,這里就不展開說明引數的意義,
首先定義SRAM的句柄
SRAM_HandleTypeDef g_oled_handle; /* SRAM句柄(用于控制OLED) */
其次還需要定義FSMC時序(讀時序和寫時序)相關的句柄
FSMC_NORSRAM_TimingTypeDef fsmc_write_handle;
FSMC_NORSRAM_TimingTypeDef fsmc_read_handle;
然后對以上句柄結構體成員進行賦值,代碼如下:

這里我們需要注意存盤器的資料寬度是8位,因為正點原子的OLED模塊的就是使用8根資料線,
通過HAL_SRAM_Init函式就可以完成FSMC的初始化,并且前面的HAL_SRAM_MspInit函式也會被執行,
第四步:撰寫讀寫介面函式
修改的函式就是OLED_WR_Byte函式,函式內部實作可以參考LCD例程,具體代碼如下:

這里我們需要解決兩個變數即FSMC_ADDR_DATA和FSMC_ADDR_CMD,這兩個變數其實就是代表著是寫資料還是寫命令,作用和OLED_RS引腳作用是一樣的,
怎么去確認這個地址呢?

這里跟LCD的地址有所區別,沒有地址的偏移,是因為這里HADDR是位元組地址,并且存盤器的資料寬度也是8位,就不像LCD需要再乘2,
這里還有一個讀介面函式,代碼如下:

第五步:撰寫OLED初始化函式
這里主要是要發送初始化序列進行配置,

這里唯一的修改點就是0xC0修改成0xC8,即COM掃描方向改變了,
第六步:撰寫OLED畫點和讀點函式
畫點函式,我們就不用大陣列OLED_GRAM,我們采用的方式是先讀取?修改?寫入,
這里并沒有實作讀點函式,而是實作讀頁函式,因為我們讀取的是一個頁即一個位元組,讀操作是8080時序支持的,在IIC或者SPI通信介面是不支持的,這里我們看一下代碼實作:

畫點函式的實作:

除此之外,還要修改一下OLED_Clear函式,代碼如下:

初始化OLED之后,進行清屏,
最后修改一下main函式,

緊接著就可以編譯一下,注意我們需要添加stm32f1xx_hal_sram.c和stm32xx_ll_fsmc.c檔案支持,最后你就會發現跟例程效果是一樣的,

使用定時器還可以測驗一下幀率,使用FSMC模擬8080時序驅動OLED,使用OLED_Clear函式測驗,幀率可以達到1800多幀,
大家有正點原子的OLED螢屏可以下載測驗一下,熟悉一下FSMC這個外設,附件也把工程提供給大家,后面更新一波如何在OLED上播放badapple的推文,帶領大家玩轉螢屏,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/397481.html
標籤:其他
