FSMC工程 ILI9325驅(qū)動(dòng)LCD

開(kāi)發(fā)環(huán)境:

STM32F103ZET6? ? ? STM32CubeMX? ? ? Keil5

使用STM32CubeMx創(chuàng)建FSMC工程,生成后使用keil5創(chuàng)建TFT-LCD驅(qū)動(dòng)程序留搔,實(shí)現(xiàn)在LCD上顯示。

網(wǎng)上有一些配置FSMC的技掏,有驅(qū)動(dòng)TFT-LCD的程序,不過(guò)大多是標(biāo)準(zhǔn)庫(kù)的项鬼,有一些找到的驅(qū)動(dòng)程序可是試了試哑梳,沒(méi)有效果,所以自己修改绘盟。

現(xiàn)在有四塊屏鸠真,1602(顯示一些數(shù)字)悯仙,128604(顯示字符,簡(jiǎn)單圖片)吠卷,2.4寸TFT液晶屏(ili9325驅(qū)動(dòng)锡垄,可觸摸,240*320)祭隔,3.5寸TFT(hx8357驅(qū)動(dòng)货岭,可觸摸),此篇只寫(xiě)2.4寸TFT液晶屏疾渴,基本方法是修改廠(chǎng)家提供的使用FSMC的驅(qū)動(dòng)文件千贯,將標(biāo)準(zhǔn)庫(kù)文件修改為在HAL庫(kù)中可以運(yùn)行的文件,因?yàn)橹皩?2864的標(biāo)準(zhǔn)庫(kù)程序修改為HAL庫(kù)程序成功搞坝,所以可以借鑒搔谴。

1602


12864


12864


3.5TFT-LCD


圖片發(fā)自簡(jiǎn)書(shū)App


圖片發(fā)自簡(jiǎn)書(shū)App


圖片發(fā)自簡(jiǎn)書(shū)App

在網(wǎng)上使用STM32CubeMx配置FSMC的工程有一些,不過(guò)存在問(wèn)題

使用STM32CubeMx配置FSMC桩撮,GPIO

FSMC介紹

1. STM32CubeMx如何配置FSMC

按照上一篇的方法創(chuàng)建一個(gè)工程后敦第,在引腳設(shè)置頁(yè)面的左側(cè)有FSMC的配置,不過(guò)STM32CubeMx的版本不同距境,STM芯片的選擇不同申尼,F(xiàn)SMC配置選項(xiàng)也不同垮卓,


FSMC

FSMC(16位)主要配置的引腳為

? ? ? CS 液晶屏片選? ? NE4

? ? ? RS? 即LCD Register Select? PG0? (A10)

? ? ? WR? 寫(xiě)信號(hào)? ? PD5

? ? ? RD 讀信號(hào)? ? PD4

? ? ? 以及16位數(shù)據(jù)總線(xiàn)垫桂,高八位和第八位

不過(guò)液晶屏?xí)蠦L背光控制和RST復(fù)位引腳,需要在配置完FSMC后再添加兩個(gè)輸出引腳粟按。

那么問(wèn)題來(lái)了诬滩,F(xiàn)SMC配置中的內(nèi)存類(lèi)型怎么選,是選SRAM還是其他灭将?

? ? ? 我覺(jué)得選圖中所示可以直接選擇寄存器數(shù)據(jù)選擇信號(hào)引腳為A10即PG0,這符合我的彩屏的實(shí)際情況疼鸟,具體怎么選要先看一下自己彩屏正常工作時(shí)配置了那些引腳。

在配置了FSMC后再經(jīng)過(guò)一些小的修改就可以生成工程庙曙,添加自己的代碼空镜。

注意:

使用不同驅(qū)動(dòng)的彩屏在初始化時(shí)對(duì)寄存器的操作都是不同的,一定要找到可以在自己彩屏上正常運(yùn)行的程序捌朴,因?yàn)樵诔跏蓟瘮?shù)中都會(huì)對(duì)很多寄存器寫(xiě)入不同的值吴攒,錯(cuò)一個(gè)可能就無(wú)法初始化成功。

使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11砂蔽,A10作為數(shù)據(jù)命令區(qū)分線(xiàn)洼怔,注意設(shè)置時(shí)STM32內(nèi)部會(huì)右移一位對(duì)其! 111110=0X3E。

因?yàn)樵跇?biāo)準(zhǔn)庫(kù)中和HAL庫(kù)中數(shù)據(jù)類(lèi)型本質(zhì)相同左驾,但表示不同镣隶,比如在標(biāo)準(zhǔn)庫(kù)中為u16,不過(guò)在HAL庫(kù)中卻是uint16_t极谊,需要注意。

在標(biāo)準(zhǔn)庫(kù)中GPIO和FSMC相關(guān)結(jié)構(gòu)體具體定義是不同的安岂,也需要修改轻猖。

基本步驟:

修改向寄存器地址寫(xiě)數(shù)據(jù)和命令的函數(shù)

注意是否在STM32CUBEMX中配置好時(shí)鐘,時(shí)鐘配置是很重要的

修改LCD的初始化函數(shù)

修改GPIO初始化函數(shù)嗜闻,還要使能相關(guān)引腳時(shí)鐘

注意除了FSMC相關(guān)引腳配置為復(fù)用推挽輸出外蜕依,PB0和PC5需要配置為推挽輸出

修改FSMC初始函數(shù),需要使能FSMC時(shí)鐘

需要注意的是在標(biāo)準(zhǔn)庫(kù)中和在HAL庫(kù)中FSMC的配置有不小的不同琉雳,首先是FSMC相關(guān)結(jié)構(gòu)體和標(biāo)準(zhǔn)庫(kù)中不同样眠,有一些在標(biāo)準(zhǔn)庫(kù)中可以配置的選項(xiàng)在HAL庫(kù)中并不存在,還有FSMC配置完成后初始化FSMC的函數(shù)和標(biāo)準(zhǔn)庫(kù)中也有很大不同翠肘,如果使用了兩個(gè)FSMC_NORSRAM_TimingTypeDef檐束,則要使用HAL_SRAM_Init()函數(shù)進(jìn)行初始化。還需要注意的是要使能BANK1束倍。

修改復(fù)位函數(shù)

還有其他一些修改被丧,改動(dòng)不大

rebuild工程,如果沒(méi)有錯(cuò)誤绪妹,在main函數(shù)中調(diào)用LCD初始化函數(shù)甥桂,就可以直接使用標(biāo)準(zhǔn)庫(kù)中可以使用的繪制函數(shù)了。

修改后的GPIO初始化函數(shù)

void LCD_GPIOInit(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

//FSMC_NORSRAM_InitTypeDef? FSMC_NORSRAMInitStructure;

FSMC_NORSRAM_TimingTypeDef? readWriteTiming;

FSMC_NORSRAM_TimingTypeDef? writeTiming;

hsram2.Instance = FSMC_NORSRAM_DEVICE;

hsram2.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;

__HAL_RCC_FSMC_CLK_ENABLE();//ê1?üFSMCê±?ó

//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); //ê1?üFSMCê±?ó

__HAL_RCC_GPIOC_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_RCC_GPIOG_CLK_ENABLE();

__HAL_RCC_GPIOE_CLK_ENABLE();

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);//ê1?üPORTB,D,E,Gò??°AFIO?′ó?1|?üê±?ó

/*Configure GPIO pin : PC5 */

GPIO_InitStruct.Pin = GPIO_PIN_5;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/*Configure GPIO pin : PB0 */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* GPIO_InitStruct */

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_12;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

/* GPIO_InitStruct */

GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10

|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14

|GPIO_PIN_15;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

/* GPIO_InitStruct */

GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14

|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4

|GPIO_PIN_5;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

readWriteTiming.AddressSetupTime = 0x01; //μ??·?¨á¢ê±??£¨ADDSET£??a2??HCLK 1/36M=27ns

readWriteTiming.AddressHoldTime = 0x00; //μ??·±£3?ê±??£¨ADDHLD£??£ê?A?′ó?μ?

readWriteTiming.DataSetupTime = 0x0f; // êy?Y±£′?ê±???a16??HCLK,òò?aòo?§?y?ˉICμ??áêy?Yμ?ê±oò£??ù?è2??üì??ì£?óè????1289?a??IC?£

readWriteTiming.BusTurnAroundDuration = 0x00;

readWriteTiming.CLKDivision = 0x00;

readWriteTiming.DataLatency = 0x00;

readWriteTiming.AccessMode = FSMC_ACCESS_MODE_A; //?£ê?A

writeTiming.AddressSetupTime = 0x02; //0x01 μ??·?¨á¢ê±??£¨ADDSET£??a1??HCLK

writeTiming.AddressHoldTime = 0x00; //μ??·±£3?ê±??£¨A

writeTiming.DataSetupTime = 0x05; ////0x03 êy?Y±£′?ê±???a4??HCLK

writeTiming.BusTurnAroundDuration = 0x00;

writeTiming.CLKDivision = 0x00;

writeTiming.DataLatency = 0x00;

writeTiming.AccessMode = FSMC_ACCESS_MODE_A; //?£ê?A

hsram2.Init.NSBank = FSMC_NORSRAM_BANK4;//? ?aà??ò??ê1ó?NE4 £?ò2?í??ó|BTCR[6],[7]?£

hsram2.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; // 2??′ó?êy?Yμ??·

hsram2.Init.MemoryType =FSMC_MEMORY_TYPE_SRAM;// FSMC_MemoryType_SRAM;? //SRAM

hsram2.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;//′?′¢?÷êy?Y?í?è?a16bit

hsram2.Init.BurstAccessMode =FSMC_BURST_ACCESS_MODE_DISABLE;// FSMC_BurstAccessMode_Disable;

hsram2.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;

hsram2.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;

hsram2.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;

hsram2.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;

hsram2.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; //? ′?′¢?÷D′ê1?ü

hsram2.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;

hsram2.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE; // ?áD′ê1ó?2?í?μ?ê±Dò

hsram2.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;

//FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //?áD′ê±Dò

//FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;? //D′ê±Dò

if (HAL_SRAM_Init(&hsram2, &readWriteTiming, &writeTiming) != HAL_OK)

{

_Error_Handler(__FILE__, __LINE__);

}

__FSMC_NORSRAM_ENABLE(FSMC_NORSRAM_DEVICE,FSMC_NORSRAM_BANK4);

}

修改后的LCD初始化函數(shù)

void LCD_Init(void)

{

LCD_GPIOInit();

LCD_RESET();

//************* Start Initial Sequence **********//

LCD_WriteReg(0x00E5,0x78F0);

LCD_WriteReg(0x0001,0x0100);

LCD_WriteReg(0x0002,0x0700);

LCD_WriteReg(0x0003,0x1030);

LCD_WriteReg(0x0004,0x0000);

LCD_WriteReg(0x0008,0x0202);

LCD_WriteReg(0x0009,0x0000);

LCD_WriteReg(0x000A,0x0000);

LCD_WriteReg(0x000C,0x0000);

LCD_WriteReg(0x000D,0x0000);

LCD_WriteReg(0x000F,0x0000);

//power on sequence VGHVGL

LCD_WriteReg(0x0010,0x0000);

LCD_WriteReg(0x0011,0x0007);

LCD_WriteReg(0x0012,0x0000);

LCD_WriteReg(0x0013,0x0000);

LCD_WriteReg(0x0007,0x0000);

//vgh

LCD_WriteReg(0x0010,0x1690);

LCD_WriteReg(0x0011,0x0227);

//delay_ms(100);

//vregiout

LCD_WriteReg(0x0012,0x009D); //0x001b

//delay_ms(100);

//vom amplitude

LCD_WriteReg(0x0013,0x1900);

//delay_ms(100);

//vom H

LCD_WriteReg(0x0029,0x0025);

LCD_WriteReg(0x002B,0x000D);

//gamma

LCD_WriteReg(0x0030,0x0007);

LCD_WriteReg(0x0031,0x0303);

LCD_WriteReg(0x0032,0x0003);// 0006

LCD_WriteReg(0x0035,0x0206);

LCD_WriteReg(0x0036,0x0008);

LCD_WriteReg(0x0037,0x0406);

LCD_WriteReg(0x0038,0x0304);//0200

LCD_WriteReg(0x0039,0x0007);

LCD_WriteReg(0x003C,0x0602);// 0504

LCD_WriteReg(0x003D,0x0008);

//ram

LCD_WriteReg(0x0050,0x0000);

LCD_WriteReg(0x0051,0x00EF);

LCD_WriteReg(0x0052,0x0000);

LCD_WriteReg(0x0053,0x013F);

LCD_WriteReg(0x0060,0xA700);

LCD_WriteReg(0x0061,0x0001);

LCD_WriteReg(0x006A,0x0000);

//

LCD_WriteReg(0x0080,0x0000);

LCD_WriteReg(0x0081,0x0000);

LCD_WriteReg(0x0082,0x0000);

LCD_WriteReg(0x0083,0x0000);

LCD_WriteReg(0x0084,0x0000);

LCD_WriteReg(0x0085,0x0000);

//

LCD_WriteReg(0x0090,0x0010);

LCD_WriteReg(0x0092,0x0600);

LCD_WriteReg(0x0007,0x0133);

LCD_WriteReg(0x00,0x0022);//

LCD_SetParam();//éè??LCD2?êy

//LCD_LED=1;//μ?áá±31a

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

LCD_Clear(WHITE);

}

修改后在main函數(shù)中使用繪圖函數(shù)時(shí)要注釋掉原有的GPIO和FSMC初始化函數(shù)邮旷。

測(cè)試結(jié)果:


圖片發(fā)自簡(jiǎn)書(shū)App


圖片發(fā)自簡(jiǎn)書(shū)App


修改后即可以在STM32CubeMX中配置后就可以將之前修改好的文件直接添加到工程中使用黄选,這樣即可在LCD上顯示其他功能的狀態(tài)信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婶肩,一起剝皮案震驚了整個(gè)濱河市办陷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌律歼,老刑警劉巖民镜,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異险毁,居然都是意外死亡制圈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)畔况,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鲸鹦,“玉大人,你說(shuō)我怎么就攤上這事问窃『蓿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵域庇,是天一觀(guān)的道長(zhǎng)嵌戈。 經(jīng)常有香客問(wèn)我覆积,道長(zhǎng),這世上最難降的妖魔是什么熟呛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任宽档,我火速辦了婚禮,結(jié)果婚禮上庵朝,老公的妹妹穿的比我還像新娘吗冤。我一直安慰自己,他們只是感情好九府,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布椎瘟。 她就那樣靜靜地躺著,像睡著了一般侄旬。 火紅的嫁衣襯著肌膚如雪肺蔚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天儡羔,我揣著相機(jī)與錄音宣羊,去河邊找鬼。 笑死汰蜘,一個(gè)胖子當(dāng)著我的面吹牛仇冯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播族操,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼苛坚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坪创?” 一聲冷哼從身側(cè)響起炕婶,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姐赡,失蹤者是張志新(化名)和其女友劉穎莱预,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體项滑,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡依沮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枪狂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片危喉。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖州疾,靈堂內(nèi)的尸體忽然破棺而出辜限,到底是詐尸還是另有隱情,我是刑警寧澤严蓖,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布薄嫡,位于F島的核電站氧急,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毫深。R本人自食惡果不足惜吩坝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哑蔫。 院中可真熱鬧钉寝,春花似錦、人聲如沸闸迷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腥沽。三九已至疹瘦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巡球,已是汗流浹背言沐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酣栈,地道東北人险胰。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矿筝,于是被迫代替她去往敵國(guó)和親起便。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容