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的程序,不過大多是標(biāo)準(zhǔn)庫的,有一些找到的驅(qū)動(dòng)程序可是試了試,沒有效果,所以自己修改。
現(xiàn)在有四塊屏,1602(顯示一些數(shù)字),128604(顯示字符,簡(jiǎn)單圖片),2.4寸TFT液晶屏(ili9325驅(qū)動(dòng),可觸摸,240*320),3.5寸TFT(hx8357驅(qū)動(dòng),可觸摸),此篇只寫2.4寸TFT液晶屏,基本方法是修改廠家提供的使用FSMC的驅(qū)動(dòng)文件,將標(biāo)準(zhǔn)庫文件修改為在HAL庫中可以運(yùn)行的文件,因?yàn)橹皩?2864的標(biāo)準(zhǔn)庫程序修改為HAL庫程序成功,所以可以借鑒。
1602
12864
12864
3.5TFT-LCD
圖片發(fā)自簡(jiǎn)書App
圖片發(fā)自簡(jiǎn)書App
圖片發(fā)自簡(jiǎn)書App
在網(wǎng)上使用STM32CubeMx配置FSMC的工程有一些,不過存在問題
使用STM32CubeMx配置FSMC,GPIOFSMC介紹
1. STM32CubeMx如何配置FSMC
按照上一篇的方法創(chuàng)建一個(gè)工程后,在引腳設(shè)置頁面的左側(cè)有FSMC的配置,不過STM32CubeMx的版本不同,STM芯片的選擇不同,F(xiàn)SMC配置選項(xiàng)也不同,
FSMC
FSMC(16位)主要配置的引腳為
? ? ? CS 液晶屏片選? ? NE4
? ? ? RS? 即LCD Register Select? PG0? (A10)
? ? ? WR? 寫信號(hào)? ? PD5
? ? ? RD 讀信號(hào)? ? PD4
? ? ? 以及16位數(shù)據(jù)總線,高八位和第八位
不過液晶屏?xí)蠦L背光控制和RST復(fù)位引腳,需要在配置完FSMC后再添加兩個(gè)輸出引腳。
那么問題來了,F(xiàn)SMC配置中的內(nèi)存類型怎么選,是選SRAM還是其他?
? ? ? 我覺得選圖中所示可以直接選擇寄存器數(shù)據(jù)選擇信號(hào)引腳為A10即PG0,這符合我的彩屏的實(shí)際情況,具體怎么選要先看一下自己彩屏正常工作時(shí)配置了那些引腳。
在配置了FSMC后再經(jīng)過一些小的修改就可以生成工程,添加自己的代碼。
注意:
使用不同驅(qū)動(dòng)的彩屏在初始化時(shí)對(duì)寄存器的操作都是不同的,一定要找到可以在自己彩屏上正常運(yùn)行的程序,因?yàn)樵诔跏蓟瘮?shù)中都會(huì)對(duì)很多寄存器寫入不同的值,錯(cuò)一個(gè)可能就無法初始化成功。
使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11,A10作為數(shù)據(jù)命令區(qū)分線,注意設(shè)置時(shí)STM32內(nèi)部會(huì)右移一位對(duì)其! 111110=0X3E。
因?yàn)樵跇?biāo)準(zhǔn)庫中和HAL庫中數(shù)據(jù)類型本質(zhì)相同,但表示不同,比如在標(biāo)準(zhǔn)庫中為u16,不過在HAL庫中卻是uint16_t,需要注意。
在標(biāo)準(zhǔn)庫中GPIO和FSMC相關(guān)結(jié)構(gòu)體具體定義是不同的,也需要修改。
基本步驟:修改向寄存器地址寫數(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)庫中和在HAL庫中FSMC的配置有不小的不同,首先是FSMC相關(guān)結(jié)構(gòu)體和標(biāo)準(zhǔn)庫中不同,有一些在標(biāo)準(zhǔn)庫中可以配置的選項(xiàng)在HAL庫中并不存在,還有FSMC配置完成后初始化FSMC的函數(shù)和標(biāo)準(zhǔn)庫中也有很大不同,如果使用了兩個(gè)FSMC_NORSRAM_TimingTypeDef,則要使用HAL_SRAM_Init()函數(shù)進(jìn)行初始化。還需要注意的是要使能BANK1。
修改復(fù)位函數(shù)
還有其他一些修改,改動(dòng)不大
rebuild工程,如果沒有錯(cuò)誤,在main函數(shù)中調(diào)用LCD初始化函數(shù),就可以直接使用標(biāo)準(zhǔn)庫中可以使用的繪制函數(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();
評(píng)論
查看更多