STM32F1系列單片機有多種外設(shè),外設(shè)配置方式比較一致,一般是使能外設(shè)所在GPIO口時鐘、使能外設(shè)的時鐘,在禁止外設(shè)的情況下配置外設(shè)的時序以及中斷和DMA等。大部分的外設(shè)配置相對簡單,但是FSMC接口因為配置比較復(fù)雜,往往讓一些初學者一頭霧水。汽車軟板廠記錄了在STM32F103ZET6的FSMC接口配置調(diào)試TFT LCD屏相關(guān)注意事項。
1 FSMC接口GPIO配置
/** FSMC GPIOConfiguration PF0 ------> FSMC_A0 ------> LCD_RS: 0: Reg,1:Data PE7 ------> FSMC_D4 PE8 ------> FSMC_D5 PE9 ------> FSMC_D6 PE10 ------> FSMC_D7 PE11 ------> FSMC_D8 PE12 ------> FSMC_D9 PE13 ------> FSMC_D10 PE14 ------> FSMC_D11 PE15 ------> FSMC_D12 PD8 ------> FSMC_D13 PD9 ------> FSMC_D14 PD10 ------> FSMC_D15 PD14 ------> FSMC_D0 PD15 ------> FSMC_D1 PD0 ------> FSMC_D2 PD1 ------> FSMC_D3 PD4 ------> FSMC_NOE ------> LCD_RD Default:1,Value:0 PD5 ------> FSMC_NWE ------> LCD_WR Default:1,Value:0 PG12 ------> FSMC_NE4 ------>LCD_CS Default:1,Value:0
2 初始化FSMC時序
/* FSMC initializationfunction */ FSMC_NORSRAM_TimingTypeDef Timing;SRAM_HandleTypeDef hsram1;
hsram1.Instance = FSMC_NORSRAM_DEVICE; hsram1.Extended =FSMC_NORSRAM_EXTENDED_DEVICE; /* hsram1.Init */hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;hsram1.Init.DataAddressMux =FSMC_DATA_ADDRESS_MUX_DISABLE;hsram1.Init.MemoryType=FSMC_MEMORY_TYPE_NOR;hsram1.Init.MemoryDataWidth =FSMC_NORSRAM_MEM_BUS_WIDTH_16;hsram1.Init.BurstAccessMode =FSMC_BURST_ACCESS_MODE_DISABLE;hsram1.Init.WaitSignalPolarity =FSMC_WAIT_SIGNAL_POLARITY_LOW;hsram1.Init.WrapMode =FSMC_WRAP_MODE_DISABLE;hsram1.Init.WaitSignalActive =FSMC_WAIT_TIMING_BEFORE_WS;hsram1.Init.WriteOperation =FSMC_WRITE_OPERATION_ENABLE;hsram1.Init.WaitSignal =FSMC_WAIT_SIGNAL_DISABLE;hsram1.Init.ExtendedMode =FSMC_EXTENDED_MODE_DISABLE;hsram1.Init.AsynchronousWait =FSMC_ASYNCHRONOUS_WAIT_DISABLE;hsram1.Init.WriteBurst =FSMC_WRITE_BURST_DISABLE; /* Timing */ Timing.AddressSetupTime = 0x04; Timing.AddressHoldTime = 0x02; Timing.DataSetupTime = 0x08; Timing.BusTurnAroundDuration = 0x00; Timing.CLKDivision = 0x00; Timing.DataLatency = 0x00; Timing.AccessMode = FSMC_ACCESS_MODE_B; 后面數(shù)值決定讀寫屏快慢。
FPC小編注意點:
1 因為STM32的地址是32bit的,數(shù)據(jù)是按照8bit組織的,如果lcd的數(shù)據(jù)選擇8bit的話,地址A0就是正常的輸出,如0x60000000輸出A0=0; 0x6000 0001輸出A0=1;對應(yīng)數(shù)據(jù)是byte;如果lcd的數(shù)據(jù)選擇16bit的話,地址A0就,如0x60000000輸出A0=0; 而0x60000002對應(yīng)A0=1;對應(yīng)數(shù)據(jù)是word,也就是說每兩個原來基于byte結(jié)構(gòu)的地址對應(yīng)一個地址線上實際的word長度的地址;
#define Bank1_LCD_D ((uint32_t)0x6C000002) //DispData ADDR#define Bank1_LCD_C ((uint32_t)0x6C000000) //DispReg ADDR
void LCD_WR_REG(uint16_t index){ *(__IOuint16_t *) (Bank1_LCD_C) = index;}
uint16_t LCD_READ_DATA(void){ uint16_ta = 0; a=*(__IOuint16_t *) (Bank1_LCD_D); //L return a;}
軟板廠: Image2LCD軟件轉(zhuǎn)換時注意掃描方式和數(shù)據(jù)位寬度,以及高低為順序。
實際效果: