1、FSMC初初了解:
FSMC 包括4個模塊:
(1)AHB接口(包括FSMC配置寄存器)
(2)NOR閃存和PSRAM控制器(驅動LCD的時候LCD就好像一個PSRAM的里面只有2個16位的存儲空間,一個是DATA RAM 一個是CMD RAM)
(3)NAND閃存和PC卡控制器
(4)外部設備接口
我們驅動TFT很明顯用的是第二個模塊:NOR閃存。
2、FSMC的外設地址選擇
FSMC _Bank 用來選擇外接存儲器的地址,FSMC所控制的外存儲器所映射的地址是0x6000 0000 ~ 0x9fff ffff
其中屬于NOR FLASH 的是0x6000 0000 ~ 0x6fff ffff ,然后這部分的地址空間又被分為四份,每份64MB, 編號是BANK1 ~ BANK 4 ,每個BANK 都有一個片選引腳。
而這四個分存儲塊的片選,則使用NE[4:1]來選擇。數據線/地址線/控制線是共享的。
NE1 ->Bank1 NE2->Bank2 NE3->Bank3 NE4->Bank4
第一塊:6000 0000h--63ff ffffh
第二塊:6400 0000h--67ff ffffh
第三塊:6800 0000h--6bff ffffh
第四塊:6c00 0000h--6fff ffffh
3、FSMC 驅動LCD
FSMC提供了所有的LCD控制器的信號:
FSMC_D[16:0]:16bit的數據總線
FSMC NEx:分配給NOR的256M,再分為4個區,每個區用來分配一個外設,這四個外設的片選分為是NE1-NE4,對應的引腳為:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4
FSMC NOE:輸出使能,連接LCD的RD腳。
FSMC NWE:寫使能,連接LCD的RW腳。
FSMC Ax:用在LCD顯示RAM和寄存器之間進行選擇的地址線,即該線用于選擇LCD的RS腳,該線可用地址線的任意一根線,范圍:FSMC_A[25:0]。
正如我們操作12864的命令/數據選擇端口RS一樣,對于FSMC驅動TFT :RS = 0時,表示讀寫寄存器;RS = 1表示讀寫數據RAM。
4、GPIO端口配置
由于是使用FSMC來驅動TFT的,所以除了背光用的PD13和復位用的PC1要設置為通用推挽輸出之外,其他引腳都必須設置為復用推挽輸出。然而,很奇怪的是。當我配置好PD13時,我發現程序下載進去后是一片漆黑的,后來再三檢查是背光的PD13的問題。必須把PD13置高才可以亮,否則默認低電平,就是一片黑了。
5、 具體程序
/*******************************************************************************
* FuncTIon Name : Lcd_ConfiguraTIon
* DescripTIon : Configures LCD Control lines
* Input : None
* Output : None
* Return : None
* AttenTIon : None
*******************************************************************************/
static void LCD_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOD and GPIOE clocks */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
/* PE.00(D0), PE.01(D1), PE.02(D2), PE.03(D3), PE.04(D4), PE.05(D5), PE.06(D6), PE.07(D7), PE.08(D8)
PE.09(D9), PE.10(D10), PE.11(D11), PE.12(D12), PE.13(D13), PE.14(D14), PE.15(D15) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* PD.13(RS), PD.14(WR), PD.15(RD) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* PD.12(CS)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : LCD_WriteReg
* Description : LCD控制器寄存器地址
* Input : - index: 寄存器地址
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
__inline void LCD_WriteIndex(uint16_t index)
{
Clr_Rs;
Set_nRd;
GPIOE->ODR = index; /* GPIO_Write(GPIOE,index); */
Clr_nWr;
Set_nWr;
}
/*******************************************************************************
* Function Name : LCD_WriteReg
* Description : LCD寄存器數據
* Input : - index: 寄存器數據
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
__inline void LCD_WriteData(uint16_t data)
{
Set_Rs;
GPIOE->ODR = data; /* GPIO_Write(GPIOE,data); */
Clr_nWr;
Set_nWr;
}
/*******************************************************************************
* Function Name : LCD_ReadData
* Description : 讀取控制器數據
* Input : None
* Output : None
* Return : 返回讀取到的數據
* Attention : None
*******************************************************************************/
__inline uint16_t LCD_ReadData(void)
{
uint16_t value;
Set_Rs;
Set_nWr;
Clr_nRd;
GPIOE->CRH = 0x44444444;
GPIOE->CRL = 0x44444444;
value = GPIOE->IDR;
value = GPIOE->IDR;
GPIOE->CRH = 0x33333333;
GPIOE->CRL = 0x33333333;
Set_nRd;
return value;
}
__inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
{
/* Write 16-bit Index, then Write Reg */
Clr_Cs;
LCD_WriteIndex(LCD_Reg);
/* Write 16-bit Reg */
LCD_WriteData(LCD_RegValue);
Set_Cs;
}
__inline uint16_t LCD_ReadReg(uint16_t LCD_Reg)
{
uint16_t LCD_RAM;
/* Write 16-bit Index (then Read Reg) */
Clr_Cs;
LCD_WriteIndex(LCD_Reg);
/* Read 16-bit Reg */
LCD_RAM = LCD_ReadData();
Set_Cs;
return LCD_RAM;
}
static void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos )
{
#if ( DISP_ORIENTATION == 90 ) || ( DISP_ORIENTATION == 270 )
uint16_t temp = Xpos;
Xpos = Ypos;
Ypos = ( MAX_X - 1 ) - temp;
#elif ( DISP_ORIENTATION == 0 ) || ( DISP_ORIENTATION == 180 )
#endif
LCD_WriteReg(0x004e, Xpos );
LCD_WriteReg(0x004f, Ypos );
}
static void delay_ms(uint16_t ms)
{
uint16_t i,j;
for( i = 0; i < ms; i++ )
{
for( j = 0; j < 1141; j++ );
}
}
void LCD_Initializtion(void)
{
LCD_Configuration();
// DeviceCode = LCD_ReadReg(0x0000);
/* 讀取屏ID */
LCD_WriteReg(0x0000,0x0001); delay_ms(50); /* 打開晶振 ,內部晶振500k*/
LCD_WriteReg(0x0003,0xA8A4); delay_ms(50);
LCD_WriteReg(0x000C,0x0000); delay_ms(50);
LCD_WriteReg(0x000D,0x080C); delay_ms(50);
LCD_WriteReg(0x000E,0x2B00); delay_ms(50);
LCD_WriteReg(0x001E,0x00B0); delay_ms(50);
LCD_WriteReg(0x0001,0x2B3F); delay_ms(50); /* 驅動輸出控制320*240 0x2B3F */
LCD_WriteReg(0x0002,0x0600); delay_ms(50);
LCD_WriteReg(0x0010,0x0000); delay_ms(50);
LCD_WriteReg(0x0011,0x6070); delay_ms(50); /* 定義數據格式 16位色 橫屏 0x6070 */
LCD_WriteReg(0x0005,0x0000); delay_ms(50);
LCD_WriteReg(0x0006,0x0000); delay_ms(50);
LCD_WriteReg(0x0016,0xEF1C); delay_ms(50);
LCD_WriteReg(0x0017,0x0003); delay_ms(50);
LCD_WriteReg(0x0007,0x0133); delay_ms(50);
LCD_WriteReg(0x000B,0x0000); delay_ms(50);
LCD_WriteReg(0x000F,0x0000); delay_ms(50); /* 掃描開始地址 */
LCD_WriteReg(0x0041,0x0000); delay_ms(50);
LCD_WriteReg(0x0042,0x0000); delay_ms(50);
LCD_WriteReg(0x0048,0x0000); delay_ms(50);
LCD_WriteReg(0x0049,0x013F); delay_ms(50);
LCD_WriteReg(0x004A,0x0000); delay_ms(50);
LCD_WriteReg(0x004B,0x0000); delay_ms(50);
LCD_WriteReg(0x0044,0xEF00); delay_ms(50);
LCD_WriteReg(0x0045,0x0000); delay_ms(50);
LCD_WriteReg(0x0046,0x013F); delay_ms(50);
LCD_WriteReg(0x0030,0x0707); delay_ms(50);
LCD_WriteReg(0x0031,0x0204); delay_ms(50);
LCD_WriteReg(0x0032,0x0204); delay_ms(50);
LCD_WriteReg(0x0033,0x0502); delay_ms(50);
LCD_WriteReg(0x0034,0x0507); delay_ms(50);
LCD_WriteReg(0x0035,0x0204); delay_ms(50);
LCD_WriteReg(0x0036,0x0204); delay_ms(50);
LCD_WriteReg(0x0037,0x0502); delay_ms(50);
LCD_WriteReg(0x003A,0x0302); delay_ms(50);
LCD_WriteReg(0x003B,0x0302); delay_ms(50);
LCD_WriteReg(0x0023,0x0000); delay_ms(50);
LCD_WriteReg(0x0024,0x0000); delay_ms(50);
LCD_WriteReg(0x0025,0x8000); delay_ms(50);
LCD_WriteReg(0x004f,0); /* 行首址0 */
LCD_WriteReg(0x004e,0); //列首址0
}else if(DeviceCode==0x4531){
LCD_WriteReg(0X00,0X0001);
LCD_Delay(50);
LCD_WriteReg(0X10,0X1628);
LCD_WriteReg(0X12,0X000e);//0x0006
LCD_WriteReg(0X13,0X0A39);
LCD_Delay(10);
LCD_WriteReg(0X11,0X0040);
LCD_WriteReg(0X15,0X0050);
LCD_Delay(40);
LCD_WriteReg(0X12,0X001e);//16
LCD_Delay(40);
LCD_WriteReg(0X10,0X1620);
LCD_WriteReg(0X13,0X2A39);
LCD_Delay(10);
LCD_WriteReg(0X01,0X0100);
LCD_WriteReg(0X02,0X0300);
LCD_WriteReg(0X03,0X1030);//改變方向的
LCD_WriteReg(0X08,0X0202);
LCD_WriteReg(0X0A,0X0008);
LCD_WriteReg(0X30,0X0000);
LCD_WriteReg(0X31,0X0402);
LCD_WriteReg(0X32,0X0106);
LCD_WriteReg(0X33,0X0503);
LCD_WriteReg(0X34,0X0104);
LCD_WriteReg(0X35,0X0301);
LCD_WriteReg(0X36,0X0707);
LCD_WriteReg(0X37,0X0305);
LCD_WriteReg(0X38,0X0208);
LCD_WriteReg(0X39,0X0F0B);
LCD_WriteReg(0X41,0X0002);
LCD_WriteReg(0X60,0X2700);
LCD_WriteReg(0X61,0X0001);
LCD_WriteReg(0X90,0X0210);
LCD_WriteReg(0X92,0X010A);
LCD_WriteReg(0X93,0X0004);
LCD_WriteReg(0XA0,0X0100);
LCD_WriteReg(0X07,0X0001);
LCD_WriteReg(0X07,0X0021);
LCD_WriteReg(0X07,0X0023);
LCD_WriteReg(0X07,0X0033);
LCD_WriteReg(0X07,0X0133);
LCD_WriteReg(0XA0,0X0000);
}
LCD_Delay(5000);
Set_LED;//點亮背光
LCD_Clear(WHITE);
}
//清屏函數
//Color:要清屏的填充色
void LCD_Clear(u16 Color)
{
u32 index=0;
LCD_SetCursor(0x00,0x0000);//設置光標位置
LCD_WriteRAM_Prepare(); //開始寫入GRAM
for(index=0;index《76800;index++)
{
LCD_WR_DATA(Color); //向每個GRAM寫入數據
}
}
//在指定區域內填充指定顏色
//區域大小:
// (xend-xsta)*(yend-ysta)
void LCD_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color)
{
#if USE_HORIZONTAL //橫屏
u16 colortemp=POINT_COLOR;
u16 ytemp=ysta;
POINT_COLOR=color;
for(;xsta《=xend;xsta++)
{
for(;ysta《=yend;ysta++)LCD_DrawPoint(xsta,ysta);
ysta=ytemp;
}
POINT_COLOR=colortemp;
#else //豎屏
u32 n;
//設置窗口
LCD_WriteReg(R80, xsta); //水平方向GRAM起始地址
LCD_WriteReg(R81, xend); //水平方向GRAM結束地址
LCD_WriteReg(R82, ysta); //垂直方向GRAM起始地址
LCD_WriteReg(R83, yend); //垂直方向GRAM結束地址
LCD_SetCursor(xsta,ysta);//設置光標位置
LCD_WriteRAM_Prepare(); //開始寫入GRAM
n=(u32)(yend-ysta+1)*(xend-xsta+1);
while(n--){LCD_WR_DATA(color);}//顯示所填充的顏色。
上一篇:詳解stm32的CAN控制器(程序分享)
下一篇:STM32之 IP ICMP ETHERNET的實現
推薦閱讀
史海拾趣
ALLTHREAD深知品牌建設的重要性。他們注重提升品牌形象和知名度,積極參加各類行業展會和論壇,與業界同仁交流學習。同時,他們還建立了完善的客戶服務體系,為客戶提供及時、專業的技術支持和售后服務。這些舉措有效提升了ALLTHREAD的品牌影響力和客戶滿意度。
在電子行業中,技術創新是企業持續發展的關鍵。普芯達電子深知這一點,因此始終將技術創新作為公司發展的核心驅動力。公司不斷加大研發投入,引進先進技術和設備,培養了一支高素質的研發團隊。通過持續的技術創新和產品升級,普芯達電子不斷推出具有市場競爭力的新產品,為客戶提供了更加優質和多樣化的選擇。
2007年,Apex Microtechnology迎來了一個重要的發展機遇,被音頻和能源市場上領先的混合信號處理元件供應商Cirrus Logic收購。此后,Apex Microtechnology作為Cirrus Logic在德克薩斯州奧斯汀的一個分公司,繼續從事復雜芯片設計與開發。這次收購為Apex Microtechnology帶來了更多的資源和支持,推動了其在電子行業的進一步發展。
隨著業務的快速發展,Cincon開始將目光投向國際市場。1999年,公司在美國加州設立了辦事處,以便更好地服務北美市場。同一年,為了應對日益增長的生產需求,Cincon在中國東莞設立了新工廠。這些舉措極大地提升了公司的生產能力和國際市場競爭力,為Cincon的全球化發展打下了堅實的基礎。
企業文化和團隊建設是DCD公司發展的重要保障。公司始終堅持以人為本的管理理念,注重員工的成長和發展。公司建立了完善的培訓體系和激勵機制,為員工提供廣闊的發展空間和良好的職業前景。同時,公司還積極開展各類文化活動和社會公益活動,增強員工的凝聚力和歸屬感。在團結、進取、創新的企業文化引領下,DCD公司的團隊日益壯大和成熟,為公司的發展提供了強有力的支持。
請注意,以上故事均為虛構內容,僅用于演示電子行業公司可能的發展路徑和故事框架。在實際應用中,請根據具體公司的實際情況進行調整和修改。
C語言嵌入式系統編程(收集大發送之4——ARM嵌入式系統C語言編程) ARM嵌入式系統C語言編程1.pdf (嵌入式處理器分類及選型) ARM嵌入式系統C語言編程2.pdf (ARM芯片系列簡介) ARM嵌入式系統C語言編程3.pdf(ARM7TDMI結構簡介)… 查看全部問答∨ |
|
各種波形電源變壓器初級線圈匝數的計算 開關電源原理與設計(連載55) 2-1-1-6.各種波形電源變壓器初級線圈匝數的計算 (2-18)式雖然是用于計算雙激式開關電源變壓器初級線圈N1繞組匝數的公式,但只需把式中的某個別參數稍微進行變換或修改,同樣可以用于計算其它波形電源變壓器初級線圈匝數的公式。這里,我們先來 ...… 查看全部問答∨ |
μC/OS-Ⅱ移植的要點在哪里?初始化任務堆棧時有兩個返回地址是怎么回事?其中一個永遠用不到,可以省略嗎?…… 這些問題是移植μC/OS-Ⅱ的初學者常會遇到的問題,我也是μC/OS-Ⅱ的初學者,因需要曾兩次移植μC ...… 查看全部問答∨ |
我的問題是這樣,目前我使用的芯片時stm32f101c6,開發環境keil MDK4.0,外部時鐘8Mhz,我計劃在port A的第一腳上輸出占空比為50,頻率為214k的方波,產 生方波的方案是使用定時器2定時中斷來完成。 時鐘相關配置: /* PLLCLK = 8/2MHz ...… 查看全部問答∨ |
|
看到一篇文章,轉一下,設計版權問題吧,只貼鏈接,大家感興趣的可以看看,注意有第二頁:http://www.ed-china.com/ART_8800044607_400020_500009_TS_0dc4b36b.HTM之所以發在這里,是因為之前一段時間,我曾經想到過一下使用超級電容和小太陽能電池 ...… 查看全部問答∨ |
|