/* ********************************************************************************************************* * * LCD Driver via EBI * * IAR Development Kits * on the * * M451 * * Filename : ebi_sram.c * Version : V1.00 * Programmer(s) : Qian Xianghong ********************************************************************************************************* */ /* ********************************************************************************************************* * INCLUDE FILES ********************************************************************************************************* */ #include "includes.h" // 初始化引脚 void SRAM_Init() { /* EBI AD0~1 pins on PB.12~13 */ SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB12_MFP_Msk | SYS_PB_H_MFP_PB13_MFP_Msk); SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB12_MFP_EBI_AD0 | SYS_PB_H_MFP_PB13_MFP_EBI_AD1); /* EBI AD2~3 pins on PC.14~15 */ SYS->PC_H_MFP &= ~(SYS_PC_H_MFP_PC14_MFP_Msk | SYS_PC_H_MFP_PC15_MFP_Msk); SYS->PC_H_MFP |= (SYS_PC_H_MFP_PC14_MFP_EBI_AD2 | SYS_PC_H_MFP_PC15_MFP_EBI_AD3); /* EBI AD4~5 pins on PC.6~7 */ SYS->PC_L_MFP &= ~(SYS_PC_L_MFP_PC6_MFP_Msk | SYS_PC_L_MFP_PC7_MFP_Msk); SYS->PC_L_MFP |= (SYS_PC_L_MFP_PC6_MFP_EBI_AD4 | SYS_PC_L_MFP_PC7_MFP_EBI_AD5); /* EBI AD6~12 pins on PA.7~1 */ SYS->PA_L_MFP &= ~(SYS_PA_L_MFP_PA7_MFP_Msk | SYS_PA_L_MFP_PA6_MFP_Msk); SYS->PA_L_MFP |= (SYS_PA_L_MFP_PA7_MFP_EBI_AD6 | SYS_PA_L_MFP_PA6_MFP_EBI_AD7); SYS->PA_L_MFP &= ~(SYS_PA_L_MFP_PA5_MFP_Msk | SYS_PA_L_MFP_PA4_MFP_Msk); SYS->PA_L_MFP |= (SYS_PA_L_MFP_PA5_MFP_EBI_AD8 | SYS_PA_L_MFP_PA4_MFP_EBI_AD9); SYS->PA_L_MFP &= ~(SYS_PA_L_MFP_PA3_MFP_Msk | SYS_PA_L_MFP_PA2_MFP_Msk | SYS_PA_L_MFP_PA1_MFP_Msk); SYS->PA_L_MFP |= (SYS_PA_L_MFP_PA3_MFP_EBI_AD10 | SYS_PA_L_MFP_PA2_MFP_EBI_AD11 | SYS_PA_L_MFP_PA1_MFP_EBI_AD12); /* EBI AD13~15 pins on PA.12~14 */ SYS->PA_H_MFP &= ~(SYS_PA_H_MFP_PA12_MFP_Msk | SYS_PA_H_MFP_PA13_MFP_Msk | SYS_PA_H_MFP_PA14_MFP_Msk); SYS->PA_H_MFP |= (SYS_PA_H_MFP_PA12_MFP_EBI_AD13 | SYS_PA_H_MFP_PA13_MFP_EBI_AD14 | SYS_PA_H_MFP_PA14_MFP_EBI_AD15); /* EBI nWR on PA.10, EBI nRD pin on PA.11 */ SYS->PA_H_MFP &= ~(SYS_PA_H_MFP_PA10_MFP_Msk | SYS_PA_H_MFP_PA11_MFP_Msk); SYS->PA_H_MFP |= (SYS_PA_H_MFP_PA10_MFP_EBI_NWE | SYS_PA_H_MFP_PA11_MFP_EBI_NRE); /* EBI ALE pin on PB.6, EBI NCS pin on PB.7 */ SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB6_MFP_Msk | SYS_PB_L_MFP_PB7_MFP_Msk); SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB6_MFP_EBI_ALE | SYS_PB_L_MFP_PB7_MFP_EBI_NCS); // 允许外设时钟 CLK_EnableModuleClock(EBI_MODULE); } // 打开设备和允许中断 void SRAM_Open() { // 打开EBI EBI_Open(0, EBI_BUSWIDTH_8BIT, EBI_TIMING_VERYFAST, 0, 0); } // 分配扩展内存 // 本函数只能在初始代码里调用(如果在任务里调用可能会导致冲突) void *SRAM_Alloc(uint32_t size) { static uint32_t SRAM_Base = 0; void *p = 0; // 4字节对齐 if(size % 4) size += (4 - size % 4); // 检查大小 if(SRAM_Base + size <= SRAM_SIZE) { // printf("\nAlloced SRAM at 0x%08X size %04X (%d) bytes\n", EBI_BASE_ADDR + SRAM_Base, size, size); p = (void *) (EBI_BASE_ADDR + SRAM_Base); SRAM_Base += size; } else printf("\n****** Alloc SRAM failed.\n"); return p; }