新塘的MCU大多数都集成EBI,我手上这个M0516也集成,相对于ST来说,这是大方好多呢.EBI可以类比为ST的FSMC,FMC等等,不过,他是通过地址数据复用方式实现的,类似51时代接内存.其实51通过内存接口来刷屏幕我觉得应该也不慢的.只不过好像很少人这么用,主要是能刷上去也不知道处理些什么.
首先要初始化EBI,但是不用初始化ALE引脚的复用(但是会被占用,接下来再解释.),如下红色是需要初始化的,粉红色是系统调试工作要保留的IO:
但是对于TFT还是不够的,还有DC,RST,BL引脚,其中ALE引脚被我用作DC了.
然后还有一个叫触摸屏的,要给他预留个SPI(天蓝色),还有INT引脚,BUSY引脚.(黄色)
那么这个MCU所剩IO就很少了,要初始化除了触摸屏以外,仅仅是刷屏,代码如下.
/*---------------------------------------------------------------------------------------------------------*/ /* Init I/O Multi-function */ /*---------------------------------------------------------------------------------------------------------*/ /* Set P3 multi-function pins for UART0 RXD, TXD and EBI MCLK, nWR and nRD */ SYS->P3_MFP = SYS_MFP_P33_MCLK | SYS_MFP_P36_nWR | SYS_MFP_P37_nRD; /* Set P0 multi-function pins for EBI AD0 ~ AD7 */ SYS->P0_MFP = SYS_MFP_P00_AD0 | SYS_MFP_P01_AD1 | SYS_MFP_P02_AD2 | SYS_MFP_P03_AD3 | SYS_MFP_P04_AD4 | SYS_MFP_P05_AD5 | SYS_MFP_P06_AD6 | SYS_MFP_P07_AD7; /* Set P2 multi-function pins for EBI AD8 ~ AD15 */ SYS->P2_MFP = SYS_MFP_P20_AD8 | SYS_MFP_P21_AD9 | SYS_MFP_P22_AD10 | SYS_MFP_P23_AD11 | SYS_MFP_P24_AD12 | SYS_MFP_P25_AD13 | SYS_MFP_P26_AD14 | SYS_MFP_P27_AD15; /* Set P4 multi-function pins for EBI nCS, ALE and ICE CLK and DAT */ SYS->P4_MFP = SYS_MFP_P44_nCS | SYS_MFP_P46_ICE_CLK | SYS_MFP_P47_ICE_DAT; /* P4.3 = BL,P4.2=RST */ P4->PMD |= (GPIO_PMD_OUTPUT << GPIO_PMD_PMD5_Pos) | (GPIO_PMD_OUTPUT << GPIO_PMD_PMD3_Pos) | (GPIO_PMD_OUTPUT << GPIO_PMD_PMD2_Pos);
当然EBI需要配置时序的,而EBI我们不用SRAM,所以外部一些时序直接写0,但是分频还是要调整的.如下.
/* Enable EBI function and bus width to 16-bit, MCLK is HCLK/2 */ EBI->EBICON = (EBI_MCLKDIV_1 << EBI_EBICON_MCLKDIV_Pos) | EBI_EBICON_ExtBW16_Msk | EBI_EBICON_ExtEN_Msk | (0x0 << EBI_EBICON_ExttALE_Pos) ; EBI->EXTIME = 0x00000000;
假设我现在HCLK是50MHz,那么MCLK就是25MHz,1分频就25MHz速度刷屏了.还要定义几个,这样可以很方便从STM代码转移过来.
#define TFT_READ() (*(__IO uint16_t *)(0x60000000)) #define TFT_DAT(DAT) *(__IO uint16_t *)(0x60000000) = DAT #define TFT_CMD(CMD) do{P45 = 0;*(__IO uint16_t *)(0x60000000) = CMD;P45 = 1;}while(0)
然后按照我们理解的方式开始刷吧.
新塘的刷速度还是很猛的.代码放上.EBI_LCD