最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【教程】STM32H743驅(qū)動(dòng)RGB屏幕并移植LVGL v8.0

2022-03-06 21:35 作者:捉住一只皮皮蝦  | 我要投稿
  • 硬件準(zhǔn)備

    正點(diǎn)原子H743開(kāi)發(fā)板+7寸?RGB LCD顯示屏 +?SDRAM (注意RGB屏幕必須外擴(kuò)顯存)


  • 軟件準(zhǔn)備

????????STM32cubeMX?6.1.2 + Keil 5

  • 創(chuàng)建cubeMX工程

  • 首先打開(kāi)STM32cubeMX軟件,選擇 ACCESS TO MCU SELECTOR


進(jìn)入MCU 選擇界面選中 STM32H743 然后開(kāi)始項(xiàng)目

進(jìn)入STM32cubeMX工程配置界面

首先切換選項(xiàng)卡到 Project Manager,我們注意到軟件標(biāo)題欄有個(gè) Untitled * ,帶星號(hào)表示當(dāng)前進(jìn)行過(guò)的操作未保存,按下ctrl + s 可以保存。我們每次操作完都盡量按下保存,防止cubeMX卡死導(dǎo)致沒(méi)保存工程。

首先填寫(xiě)項(xiàng)目名稱(chēng),已經(jīng)項(xiàng)目保存路徑,工具鏈IDE 我們選擇為 MDK-ARM (keil 5)。修改堆區(qū)和棧區(qū)空間大小為0x2000。因?yàn)楹竺嬉浦瞝vgl,默認(rèn)的堆區(qū)大小是不夠的,棧區(qū)我們也放大一點(diǎn)。

然后給我圈起來(lái)的地方打個(gè)√,這樣配置的外設(shè)都會(huì)單獨(dú)生成c和h文件,不會(huì)都擠在main.c里面。

然后我們切換到引腳配置界面,按下ctrl+S保存項(xiàng)目,這樣標(biāo)題欄的星號(hào)就消失了。

  • 配置SDRAM

?????一般的MCU接口屏,比如SPI屏,8080接口屏,IIC接口屏是可以不需要外置顯存的。這些屏幕可以通過(guò)發(fā)送命令當(dāng)方式告訴屏幕坐標(biāo),然后再發(fā)送對(duì)應(yīng)的像素值。但是RGB接口屏沒(méi)命令可以發(fā),一般是告訴LTDC一個(gè)內(nèi)存地址,由LTDC控制器去內(nèi)存拿像素值不斷去掃描刷新屏幕的。所以要用到SDRAM或者SRAM。我們這里用到的是?W9825G6KH 這顆SDRAM,容量32MByte。我們的屏幕是1024 * 600的,顏色格式RGB 565 ,所以需要 1024*600*2 =?1,228,800 字節(jié) = 1200 K字節(jié) 內(nèi)存作為 屏幕顯存。

  • SDRAM原理圖

首先在最左側(cè)欄目選中FMC,然后選擇SDRAM1,配置如下。如果你用的不是上面的原理圖,則需要根據(jù)具體硬件連接配置。

然后是下面部分時(shí)序的配置,這個(gè)是在 W9825G6KH?數(shù)據(jù)手冊(cè)里的。

GPIO settings 不用管,如果你用的是正點(diǎn)原子H743核心板。直接點(diǎn)右上角生成工程,然后打開(kāi)就可以了。

這里我們打開(kāi) fmc.c 文件,然后將SDRAM的初始化代碼加入到 我圈到的位置。SDRAM芯片內(nèi)部是有寄存器的,我們要通過(guò)fmc接口去發(fā)送命令配置這些寄存器然后才可以使用。

需要插入在/* USER CODE BEGIN 0 */注釋行和?/* USER CODE END 0 */?之間的代碼如下

extern SDRAM_HandleTypeDef hsdram1;

#define SDRAM_MODEREG_BURST_LENGTH_1 ? ? ? ? ? ? ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2 ? ? ? ? ? ? ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4 ? ? ? ? ? ? ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8 ? ? ? ? ? ? ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ? ? ?((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ? ? ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2 ? ? ? ? ? ? ?((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3 ? ? ? ? ? ? ?((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ? ?((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ? ? ((uint16_t)0x0200)

uint8_t SDRAM_Send_Cmd(uint8_t bankx,uint8_t cmd,uint8_t refresh,uint16_t regval)
{
 ? ?uint32_t target_bank=0;
 ? ?FMC_SDRAM_CommandTypeDef Command;
 ? ?
 ? ?if(bankx==0) target_bank=FMC_SDRAM_CMD_TARGET_BANK1; ? ? ? 
 ? ?else if(bankx==1) target_bank=FMC_SDRAM_CMD_TARGET_BANK2; ? 
 ? ?Command.CommandMode=cmd; ? ? ? ? ? ? ? ?
 ? ?Command.CommandTarget=target_bank; ? ? ?
 ? ?Command.AutoRefreshNumber=refresh; ? ? ?
 ? ?Command.ModeRegisterDefinition=regval; ?
 ? ?if(HAL_SDRAM_SendCommand(&hsdram1,&Command,0XFFFF)==HAL_OK)
 ? ?{
 ? ? ? ?return 0; ?
 ? ?}
 ? ?else return 1; ? ?
}

void SDRAM_Initialization_Sequence(void)
{
	uint32_t temp=0;


 ?SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0); 
 ?HAL_Delay(1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
	SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_PALL,1,0); ? ? ? 
 ?SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_AUTOREFRESH_MODE,8,0);
	temp=(uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 ? ? ? | \
 ? ? ? ? ? ? ?SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ? |	\
 ? ? ? ? ? ? ?SDRAM_MODEREG_CAS_LATENCY_2 ? ? ? ? ? |	\
 ? ? ? ? ? ? ?SDRAM_MODEREG_OPERATING_MODE_STANDARD | ?\
 ? ? ? ? ? ? ?SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
 ?SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_LOAD_MODE,1,temp);
	HAL_SDRAM_ProgramRefreshRate(&hsdram1,677);	
}

并在?MX_FMC_Init 中調(diào)用該初始化函數(shù)

編譯并進(jìn)入調(diào)試模式,我們?cè)?main 中的while(1) 前面加個(gè)斷點(diǎn),運(yùn)行到這里。然后在memory中訪(fǎng)問(wèn)?0XC0000000 地址,如果能看到一堆? FF ,就說(shuō)明SDRAM 已經(jīng)初始化成功了。如果是問(wèn)號(hào)? 則說(shuō)明初始化有問(wèn)題,這樣你就需要重新檢查一下了。

然后我們提升下主頻,這樣就能更快的訪(fǎng)問(wèn)SDRAM了。只需要更改 1. 處的時(shí)鐘到480Mhz 然后回車(chē),然后其它三處紅圈的頻率會(huì)自動(dòng)更改。由于我們配置了 SDRAM的頻率是 HCLK /2 ,所以此時(shí)SDRAM的運(yùn)行頻率是 120Mhz。W9825G6KH -6 這款芯片最快是到166Mhz,懶得配置了。

重新點(diǎn)擊右上方生成代碼,如果我們沒(méi)有關(guān)閉 MDK工程的話(huà)點(diǎn)擊 Close就可以了。

切換會(huì)Keil 會(huì)提示 文件被外部修改,需要重新載入。我們?nèi)x YES就可以了

重新下載程序,,然后進(jìn)入仿真檢查,SDRAM是否可以正確訪(fǎng)問(wèn)。此時(shí)SDRAM就算配置完畢。

  • RGB-LTDC配置

接下來(lái)進(jìn)入屏幕的配置。打開(kāi)LTDC 然后選擇RGB565模式,下面的配置如下

還需要配置層,一般我們用一層就可以了。層的幀緩存起始地址就是我們的SDRAM訪(fǎng)問(wèn)起始地址0XC0000000


接下來(lái)要配置GPIO, 這里需要改的引腳比較多。我們按照 LTDC_B??LTDC_G?LTDC_R的順序修改。如果按照RGB的順序修改你會(huì)發(fā)現(xiàn)有些引腳原本就被LTDC_B占了,如果你直接改cubeMX的 LTDC會(huì)自動(dòng)關(guān)閉,再次打開(kāi)你之前進(jìn)行的操作就沒(méi)了。(很坑)

需要改動(dòng)的引腳如下

LTDC_B3 ?--> PG11
LTDC_B4 ?--> PI4
LTDC_B5 ?--> PI5
LTDC_B6 ?--> PI6
LTDC_B7 ?--> PI7
LTDC_G2 ?--> PH13
LTDC_G3 ?--> PH14
LTDC_G4 ?--> PH15
LTDC_G5 ?--> PI0
LTDC_G6 ?--> PI1
LTDC_R3 ?--> PH9
LTDC_R4 ?--> PH10
LTDC_R5 ?--> PH11
LTDC_R6 ?--> PH12

直接搜索引腳,然后選中對(duì)應(yīng)功能就算完事了。

然后把所有引腳的輸出速度調(diào)到Hign,默認(rèn)是 Low和very LOW。如果你用的默認(rèn)引腳配置,那么你的屏幕速度只能到30Mhz,而且還閃爍。這款屏幕是可以到51.2Mhz的。

根據(jù)原理圖,還有個(gè)屏幕背光引腳 PB5,我們?cè)O(shè)置為推挽輸出,默認(rèn)是高電平就可以了。

再調(diào)整下LTDC主頻,到51.2Mhz。設(shè)置PLL3鎖相環(huán)的DIVR3 除頻器到 /5就可以了。

重新生成代碼,然后打開(kāi)KEIL5,編寫(xiě)屏幕測(cè)試代碼

測(cè)試代碼

	#include <string.h>
	static uint16_t LCD_BUFFER[600][1024] __attribute__((at(0XC0000000)));
	while(1){
		memset(LCD_BUFFER,0xFF,sizeof(LCD_BUFFER));
		HAL_Delay(1000);
		memset(LCD_BUFFER,0xAA,sizeof(LCD_BUFFER));
		HAL_Delay(1000);
		memset(LCD_BUFFER,0xD0,sizeof(LCD_BUFFER));
		HAL_Delay(1000);
		memset(LCD_BUFFER,0x00,sizeof(LCD_BUFFER));
		HAL_Delay(1000);
	}

聲明一個(gè) 靜態(tài)數(shù)組,并且固定到 0XC0000000 地址(SDRAM)。

下載代碼并復(fù)位開(kāi)發(fā)板應(yīng)該可以看到屏幕在 白 --> 紅?-->紫 -->黑 四種顏色進(jìn)行切換。

至此屏幕的配置就算完成

  • LVGL 移植

打開(kāi)lvgl官網(wǎng)??https://github.com/lvgl/lvgl??

下載lvgl源碼,解壓放到我們的項(xiàng)目文件夾中

進(jìn)入lvgl-master文件夾,刪除多余沒(méi)用的文件,只剩下這些

修改lv_conf_template.h名稱(chēng)為 lv_conf.h

將examples文件夾內(nèi)的porting文件夾復(fù)制到lvgl_cong.h 同級(jí)目錄

進(jìn)入porting文件夾修改lv_port_disp_template.h 和對(duì)應(yīng)的c 文件名稱(chēng)

打開(kāi)KEIL5 修改添加幾個(gè)目錄 LV_CORE? LV_PORT LV_DEMO,分別存放lvgl源代碼,lvgl移植文件,lvgl 演示程序

將src 路徑下所有c文件添加到LVGL_CORE ,注意是?遞歸添加(大概幾百個(gè)文件。。。)

port里只添加 disp 的和 lv_conf.h 。這里我只演示移植顯示,不移植觸控

demo我們添加 demo/benchmark 下的文件,如果你想試試其它demo也可以都添加了

添加 lv-master 包含目錄

在Define里添加個(gè)全局宏??LV_CONF_INCLUDE_SIMPLE? 前面要有個(gè)英文逗號(hào)

打開(kāi)lv_conf.h lv_port_disp.c??lv_port_disp.h三個(gè)文件,開(kāi)頭有個(gè)if 0 ,把0 改成1,我畫(huà)圈的地方要注意。還有l(wèi)v_port_disp.h 在lv_port_disp.c中的名稱(chēng)

然后編譯一遍會(huì)有1個(gè)錯(cuò)誤和五百多個(gè)警告。警告不用管,我們解決下這個(gè)錯(cuò)誤。

就是找不到包含的文件,改成我圈起來(lái)的。被注釋掉的包含是之前的。

還有l(wèi)v_port_disp.h中的包含也要改

再次編譯還有3錯(cuò)誤

打開(kāi)lv_port_disp.c 注意兩個(gè)畫(huà)圈的地方。

修改這三個(gè)畫(huà)圈的地方

找到這個(gè)函數(shù),添加這行代碼。

回到main.c 添加兩個(gè)頭文件的包含

找到滴答定時(shí)器的中斷入口,添加這兩行代碼。

打開(kāi)lvgl_conf.h??LV_USE_DEMO_BENCHMARK 設(shè)置為1 ,才能用這個(gè)demo

再次回到 main 修改如下。其中第一個(gè)圈和第二個(gè)圈是固定的,以后就不要?jiǎng)恿?。中間的圈是啟動(dòng)演示程序,該程序會(huì)進(jìn)行一個(gè)圖形跑分測(cè)試。

編譯然后下載程序,不出意外,會(huì)進(jìn)行一個(gè)跑分程序

至此,所有移植就算完畢?。。?/p>

當(dāng)然還可以通過(guò) DMA2D 幫我們搬運(yùn)像素。這樣屏幕刷新會(huì)更快。

關(guān)于lvgl的學(xué)習(xí)請(qǐng)參考lvgl官方文檔,這里只教大家搭建好學(xué)習(xí)環(huán)境。

【教程】STM32H743驅(qū)動(dòng)RGB屏幕并移植LVGL v8.0的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
稷山县| 长岭县| 睢宁县| 维西| 九龙城区| 同心县| 香港 | 万源市| 晋江市| 金寨县| 青岛市| 灵璧县| 孝义市| 吐鲁番市| 荥经县| 武穴市| 温宿县| 镇康县| 宣恩县| 平阳县| 靖边县| 镇平县| 珲春市| 板桥市| 鹤峰县| 乃东县| 进贤县| 视频| 紫金县| 莱阳市| 温宿县| 兴和县| 仁怀市| 化德县| 阜平县| 钦州市| 西安市| 东海县| 修武县| 阿拉尔市| 武宁县|