娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月11日(星期二)

正在發生

2020年02月11日 | 淺談STM32的FSMC的TFT筆記

發布者:zdf1966 來源: eefocus關鍵字:STM32  FSMC  TFT 手機看文章 掃描二維碼
隨時隨地手機看文章

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);}//顯示所填充的顏色。

[1] [2] [3] [4]
關鍵字:STM32  FSMC  TFT 引用地址:淺談STM32的FSMC的TFT筆記

上一篇:詳解stm32的CAN控制器(程序分享)
下一篇:STM32之 IP ICMP ETHERNET的實現

推薦閱讀

  根據一份調查報告,中國人對未來科技和就業前景持最積極的態度,65%受訪者說像人工智能和機器人技術這類創新將在今后5到10年里創造出(更多)就業機會。下面就隨網絡通信小編一起來了解一下相關內容吧。  中國人對就業前景的樂觀態度遠超全球平均值——全球頂尖傳播集團電通安吉斯對10個國家的2萬人進行的調查顯示,平均只有29%的人認可新興技術將創造...
在我哥哥告訴我之前,我根本沒有注意到我的侄女瑪迪聽力其實要比其他孩子差一些,因為當孩子很小的時候,通常很難確定兒童的聽力水平。“在她一歲生日前后,我們開始意識到她對聲音的反應不正常,”史蒂文·希爾表示。“她對很多聲音都沒有反應,在她睡覺的時候很難叫醒她。”由于瑪迪還有一部分聽力,因此她的父母花了很長時間才得到爭取的診斷。優勢聽力...
AI和機器人,早就被應用在工業流水線等場景中。而消費型智能機器,卻一直在市場爆發的邊緣反復試探。一方面人工智能的加持讓機器人在社會服務領域的應用范圍進一步被擴大,語音技術也令人機交互更加自然,開始逐漸脫離“人工智障”。但另一方面,政策限令、市場習慣、產品創新,并沒有發生質的革新,機器人始終停留在小眾極客、營銷噱頭的范疇,硅谷爆火的...

史海拾趣

問答坊 | AI 解惑

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/OS-Ⅱ的初學者,因需要曾兩次移植μC ...…

查看全部問答∨

STM32定時器產生方波的奇怪問題,歡迎討論

我的問題是這樣,目前我使用的芯片時stm32f101c6,開發環境keil MDK4.0,外部時鐘8Mhz,我計劃在port A的第一腳上輸出占空比為50,頻率為214k的方波,產 生方波的方案是使用定時器2定時中斷來完成。 時鐘相關配置: /* PLLCLK = 8/2MHz ...…

查看全部問答∨

怎么修改XCL文件, RAM可以存在FLASH中?

RAM可以存在FLASH中,通過修改XCL文件,開辟出一段區間來存數據.…

查看全部問答∨

51 c語言編程工具

網速太慢了 傳了兩次都失敗了 再傳一次&nbsp; 方便各位下載…

查看全部問答∨

射頻能量采集技術新發展(感覺和低功耗應用相關)

看到一篇文章,轉一下,設計版權問題吧,只貼鏈接,大家感興趣的可以看看,注意有第二頁:http://www.ed-china.com/ART_8800044607_400020_500009_TS_0dc4b36b.HTM之所以發在這里,是因為之前一段時間,我曾經想到過一下使用超級電容和小太陽能電池 ...…

查看全部問答∨

請問怎樣往arm7芯片里考程序

我已經有arm芯片和廠家制作的調試好的成型電路板和程序,請問怎樣能將程序考入arm7芯片里?…

查看全部問答∨

stm32 控制定時器1輸出的pwm個數

我用stm32的高級定時器1輸出pwm波,不過怎樣才能控制輸出的脈沖個數呢 求高手指點&nbsp;…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 太湖县| 左权县| 滦南县| 河西区| 莱西市| 邮箱| 靖安县| 高雄市| 仙桃市| 广灵县| 宁化县| 蓬安县| 和林格尔县| 弥渡县| 台湾省| 姚安县| 黄梅县| 祁阳县| 遂溪县| 舞钢市| 邵阳县| 梁山县| 邵武市| 静安区| 秦皇岛市| 玉龙| 浪卡子县| 盐津县| 夹江县| 新蔡县| 阜城县| 云阳县| 营山县| 永宁县| 宁都县| 黄梅县| 加查县| 莱州市| 濉溪县| 神木县| 武汉市|