FSMC工程 ILI9325驅動LCD

開發環境:

STM32F103ZET6? ? ? STM32CubeMX? ? ? Keil5

使用STM32CubeMx創建FSMC工程,生成后使用keil5創建TFT-LCD驅動程序,實現在LCD上顯示。

網上有一些配置FSMC的,有驅動TFT-LCD的程序,不過大多是標準庫的,有一些找到的驅動程序可是試了試,沒有效果,所以自己修改。

現在有四塊屏,1602(顯示一些數字),128604(顯示字符,簡單圖片),2.4寸TFT液晶屏(ili9325驅動,可觸摸,240*320),3.5寸TFT(hx8357驅動,可觸摸),此篇只寫2.4寸TFT液晶屏,基本方法是修改廠家提供的使用FSMC的驅動文件,將標準庫文件修改為在HAL庫中可以運行的文件,因為之前將12864的標準庫程序修改為HAL庫程序成功,所以可以借鑒。

1602


12864


12864


3.5TFT-LCD


圖片發自簡書App


圖片發自簡書App


圖片發自簡書App

在網上使用STM32CubeMx配置FSMC的工程有一些,不過存在問題

使用STM32CubeMx配置FSMC,GPIO

FSMC介紹

1. STM32CubeMx如何配置FSMC

按照上一篇的方法創建一個工程后,在引腳設置頁面的左側有FSMC的配置,不過STM32CubeMx的版本不同,STM芯片的選擇不同,FSMC配置選項也不同,


FSMC

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

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

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

? ? ? WR? 寫信號? ? PD5

? ? ? RD 讀信號? ? PD4

? ? ? 以及16位數據總線,高八位和第八位

不過液晶屏會有BL背光控制和RST復位引腳,需要在配置完FSMC后再添加兩個輸出引腳。

那么問題來了,FSMC配置中的內存類型怎么選,是選SRAM還是其他?

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

在配置了FSMC后再經過一些小的修改就可以生成工程,添加自己的代碼。

注意:

使用不同驅動的彩屏在初始化時對寄存器的操作都是不同的,一定要找到可以在自己彩屏上正常運行的程序,因為在初始化函數中都會對很多寄存器寫入不同的值,錯一個可能就無法初始化成功。

使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11,A10作為數據命令區分線,注意設置時STM32內部會右移一位對其! 111110=0X3E。

因為在標準庫中和HAL庫中數據類型本質相同,但表示不同,比如在標準庫中為u16,不過在HAL庫中卻是uint16_t,需要注意。

在標準庫中GPIO和FSMC相關結構體具體定義是不同的,也需要修改。

基本步驟:

修改向寄存器地址寫數據和命令的函數

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

修改LCD的初始化函數

修改GPIO初始化函數,還要使能相關引腳時鐘

注意除了FSMC相關引腳配置為復用推挽輸出外,PB0和PC5需要配置為推挽輸出

修改FSMC初始函數,需要使能FSMC時鐘

需要注意的是在標準庫中和在HAL庫中FSMC的配置有不小的不同,首先是FSMC相關結構體和標準庫中不同,有一些在標準庫中可以配置的選項在HAL庫中并不存在,還有FSMC配置完成后初始化FSMC的函數和標準庫中也有很大不同,如果使用了兩個FSMC_NORSRAM_TimingTypeDef,則要使用HAL_SRAM_Init()函數進行初始化。還需要注意的是要使能BANK1。

修改復位函數

還有其他一些修改,改動不大

rebuild工程,如果沒有錯誤,在main函數中調用LCD初始化函數,就可以直接使用標準庫中可以使用的繪制函數了。

修改后的GPIO初始化函數

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初始化函數

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函數中使用繪圖函數時要注釋掉原有的GPIO和FSMC初始化函數。

測試結果:


圖片發自簡書App


圖片發自簡書App


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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容