使用新塘单片机的EBI总线刷屏,速度爽的.

/ 0评 / 0

新塘的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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注