Thread 中讨论的其他部件:SysConfig、 SYSBIOS
工具/软件:Starterware
您好!
我将使用 BeagleBone Black、CCS 6.1以及 Starterware 2.0.1.1来完成我的项目。 连接到配置为非多路复用模式、地址为0x0100 0000、16MB、带 GPMC_csn0。
以下代码用于配置 GPMC:
#define CS_WR_OFF_TIME 0x1E
#define CS_RD_OFF_TIME 0x1E
#define CS_ON_TIME 0x01
#define ADV_ON_TIME 0x02
#define ADV_RD_OFF_TIME 0x04
#define ADV_WR_OFF_TIME 0x04
#define OE_ON_TIME 0x0A
#define OE_OFF_TIME 0x19
#define WE_ON_TIME 0x0A
#define WE_OFF_TIME 0x19
#define RD_CYCLE _TIME 0x1F
#define WR_CYCLE _TIME 0x1F
#define RD_ACCESS_TIME 0x19
#define WR_DATA_ON_ADMUX 0x06
#define WR_ACCESS_TIME 0x00
#define CYC2CYC_DELAY 0x05
#define CS0_BASE_ADDR 0x01 // base_addr (0x01-0x1F)
#define CS0_MASK_ADDR GPMC_CS_SIZE_16MB //最大 cs 大小= 16MB
#define LCD_WRITE (x)(*(volatile unsigned int *)(x))
#define LCD_BASE 0x01000000
#define LCD_OFFSET (LCD_BASE + 0x01)
void GPMC_Init (void)
{
unsigned int csNum = 0;
unsigned int baseAddr = SOC_GPMC_0_regs;
unsigned int conf = 0;
GPMC 模块的//启用时钟
HWREG (SOC_CM_PER_regs + CM_PER_GPMC_CLKCTRL)=(CM_PER_GPMC_CLKCTRL_MODULEMODE_ENABLE << CM_PER_GPMC_CLKCTRL_MODULEMODE_SHIFT);
//检查是否已启用
while ((HWREG (SOC_CM_PER_regs + CM_PER_GPMC_CLKCTRL)和(CM_PER_GPMC_CLKCTRL_IDLEST)));
GPMCIdleModeSelect (baseAddr、GPMC_IDLEMODE_FORCEIDLE);
//重置 GPMC 模块
GPMCModuleSoftReset (baseAddr);
while (GPMCModuleResetStatusGet (baseAddr)==GPMC_SYSSTATUS_RESETDONE_RSTONGING);
GPMCIdleModeSelect (baseAddr、GPMC_SysConfig_IDLEMODE_NOIDLE);
HWREG (baseAddr + GPMC_IRQENABLE)= 0x0;
///-------------------------------- CS0 SRAM 配置-------------------------------------------------------
//GPMCTimeOutStartValSet (GPMC_BASE、0);
HWREG (baseAddr + GPMC_TIMEOUT_CONTROL)= 0x0;
GPMCDevTypeSelect (baseAddr、csNum、GPMC_DEVICETYPE_NORLIK);
GPMCDevSizeSelect (baseAddr、csNum、GPMC_devicesize_16位);
GPMCDevPageLenSet (baseAddr、csNum、GPMC_DEV_pagelength_four);
GPMCAddrDataMuxProtocolSelect (baseAddr、csNum、GPMC_MUXADDMATA_NOMUX);
GPMCTimeParaGranularitySelect (baseAddr、csNum、GPMC_TIMEPARAGRANULARITY_X2);
CONF = GPMC_CS_TIMEOUT_CONFIG (CS_WR_OFF_TIME、CS_RD_OFF_TIME、GPMC_CS_Extra _ NODELAY、CS_ON_TIME);
GPMCCSTimingConfig (baseAddr、csNum、conf);
// conf = GPMC_ADV_TIMEOUT_CONFIG (0、0、ADV_WR_OFF_TIME、ADV_RD_OFF_TIME、GPMC_ADV_Extra NODELAY、 0、ADV_ON_TIME);
//GPMCADVTimingConfig (baseAddr、csNum、conf);
CONF = GPMC_WE_OE_TIME_CONFIG (WE_OFF_TIME、GPMC_WE_Extra NODELAY、WE_ON_TIME、0、OE_OFF_TIME、 GPMC_OE_Extra;NODELAY、0、OE_ON_TIME);
GPMCWEAndOETimingConfig (baseAddr、csNum、conf);
CONF = GPMC_RDACCESS_CYCLETIME_TIMing_CONFIG (RD_CYCLE_TIME、WR_CYCLE_TIME、RD_ACCESS_TIME、0);
GPMCRdAccessAndCycleTimeTimingConfig (baseAddr、csNum、conf);
//GPMCWrAccessAndWrDataOnADMUXBusTimingConfig (baseAddr、csNum、WR_ACCESS_TIME、WR_DATA_ON_ADMUX);
CONF = GPMC_CYCLE2CYCLE_BUSTURNAROUND_TIMing_CONFIG (CYC2CYC_DELAY、GPMC_CYCLE2CYCLESAMECSEN_C2CDELAY、GPMC_CYCLE2CYCLEDIFFCSEN_NOC2CDELAY、0);
GPMCycle2CyclAndTurnArndTimeTimingConfig (baseAddr、csNum、conf);
GPMCBaseAddrSet (baseAddr、csNum、CS0_BASE_ADDR);
GPMCMaskAddrSet (baseAddr、csNum、CS0_MASK_ADDR);
GPMCCSConfig (baseAddr、csNum、GPMC_CS_enable);
}
空 GPMC_PinConfig (空)
{
//模式开关
CPUSchomyToPrivilegedMode();
//CPUSchomyToUserMode();
//PIN MUX
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (8))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD8 => GPMC_AD8 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (9))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD9 => GPMC_AD9 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (10))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD10 => GPMC_AD10 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (11))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD11 => GPMC_AD11 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (12))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD12 => GPMC_AD12 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (13))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD13 => GPMC_AD13 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (14))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD14 => GPMC_AD14 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (15))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_AD15 => GPMC_AD15 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_WEN)= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_WEN => GPMC_WEN *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_oen_REN)= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_oen_REN => GPMC_oen_REN *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_CSn (0))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_CSN0 => GPMC_CSN0 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_CSn (3))= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_CSN3 => GPMC_CSN3 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_CLK)= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_CLK => GPMC_CLK *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_WAIT0)= CONTRAL_CONF_MUXMODE (0);//映射 GPMC_WAIT0 => GPMC_WAIT0 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (0))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA0 => GPMC_A0 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (1))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_Data1 => GPMC_A1 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (2))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA2 => GPMC_A2 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (3))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA3 => GPMC_A3 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (4))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA4 => GPMC_A4 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (5))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_Data5 => GPMC_A5 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (6))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA6 => GPMC_A6 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (7))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA7 => GPMC_A7 *
HWREG (SOC_CONTROL_REGS + CONTROL_CONF_LCD_VSYNC)= CONTROL_CONF_MUXMODE (1);//映射 LCD_VSYNC => GPMC_A8 *
HWREG (SOC_CONTROL_REGS + CONTROL_CONF_LCD_HSYNC)= CONTROL_CONF_MUXMODE (1);//映射 LCD_HSYNC => GPMC_A9 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_PCLK)= CONTRAL_CONF_MUXMODE (1);//映射 LCD_PCLK => GPMC_A10 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_AC_BIAS_EN)= CONTRAL_CONF_MUXMODE (1);//映射 LCD_AC_BIAS_EN => GPMC_A11 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (8))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA8 => GPMC_A12 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (9))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA9 => GPMC_A13 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (10))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA10 => GPMC_A14 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (11))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA11 => GPMC_A15 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (12))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA12 => GPMC_A16 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (13))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA13 => GPMC_A17 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (14))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA14 => GPMC_A18 *
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_LCD_DATA (15))= CONTRAL_CONF_MUXMODE (1);//映射 LCD_DATA15 => GPMC_A19 *
;
}
执行此操作后、我尝试在地址0x0100 0000中写入一个字、但此时应用程序会崩溃、处理程序未定义。
LCD_WRITE (LCD_OFFSET)= 0xaa00;
以下是 GPMC_CONFIG7寄存器:
GPMC_CONFIG1_0 0x00001010
GPMC_CONFIG2_0 0x001E1E01
GPMC_CONFIG3_0 0x22060514
GPMC_CONFIG4_0 0x190A190A
GPMC_CONFIG5_0 0x00191F1F
GPMC_CONFIG6_0 0x8F070580
GPMC_CONFIG7_0 0x00000F41
请告诉我、如果这是正确的操作方式、以及当我尝试写入 GPMC 地址时它崩溃的原因。 请建议。
谢谢