FUNC void Setup (unsigned int region) { region &= 0xFFFFF000; SP = _RDWORD(region); // Setup Stack Pointer PC = _RDWORD(region + 4); // Setup Program Counter _WDWORD(0xE000ED08, region); // Setup Vector Table Offset Register } FUNC void Setup_EBC (unsigned int region) { _WDWORD(0x40000000, 0x8555AAA1); // CLK_CNTR->KEY = 0x8555AAA1; _WDWORD(0x4000000C, 0x00038000); /* CLK_CNTR->PER0_CLK = CLKCTRL_PER0_CLK_MDR_PORTC_EN | CLKCTRL_PER0_CLK_MDR_PORTD_EN | CLKCTRL_PER0_CLK_MDR_PORTE_EN; */ _WDWORD(0x40005000, 0x8555AAA1); // EXT_BUS_CNTR->KEY = 0x8555AAA1; _WDWORD(0x40005024, 0x10009000); // EXT_BUS_CNTR->RGN0_ECCBASE = 0x10009000; _WDWORD(0x40005004, 0x04440427); /* EXT_BUS_CNTR->RGN0_CNTRL = 1 << EBC_READ32_pos | 4 << EBC_WS_HOLD_pos | 4 << EBC_WS_SETUP_pos | 4 << EBC_WS_ACTIVE_pos| 2 << EBC_MODE_pos | 1 << EBC_ECCMODE_pos | EB_CNTR_ECCEN | EB_CNTR_EN; */ _WDWORD(0x40082000, 0x8555AAA1); // PORTC->KEY = 0x8555AAA1; _WDWORD(0x40083000, 0x8555AAA1); // PORTD->KEY = 0x8555AAA1; _WDWORD(0x40084000, 0x8555AAA1); // PORTE->KEY = 0x8555AAA1; /* A[1:0] (PC[31:30]) */ _WDWORD(0x40082024, 0x22000000); // PORTC->SFUNC[3] = FUNCVAL(31, 2) | FUNCVAL(30, 2); _WDWORD(0x40082038, 0xC0000000); // PORTC->SANALOG = PORT_Pin_31 | PORT_Pin_30; _WDWORD(0x4008205C, 0xF0000000); // PORTC->SPWR[1] = PWRVAL(31, 3) | PWRVAL(30, 3); /* A[15:2] (PD[13:0]), D[1:0] (PD[31:30]), nOE (PD23), nWE (PD24) */ _WDWORD(0x40083018, 0x22222222); /* PORTD->SFUNC[0] = FUNCVAL(7, 2) | FUNCVAL(6, 2) | FUNCVAL(5, 2) | FUNCVAL(4, 2) | FUNCVAL(3, 2) | FUNCVAL(2, 2) | FUNCVAL(1, 2) | FUNCVAL(0, 2); */ _WDWORD(0x4008301C, 0x00222222); /* PORTD->SFUNC[1] = FUNCVAL(13, 2) | FUNCVAL(12, 2) | FUNCVAL(11, 2)| FUNCVAL(10, 2) | FUNCVAL(9, 2) | FUNCVAL(8, 2); */ _WDWORD(0x40083020, 0x20000000); /* PORTD->SFUNC[2] = FUNCVAL(23, 2); */ _WDWORD(0x40083024, 0x22000002); /* PORTD->SFUNC[3] = FUNCVAL(31, 2) | FUNCVAL(30, 2) | FUNCVAL(24, 2); */ _WDWORD(0x40083038, 0xC1803FFF); /* PORTD->SANALOG = PORT_Pin_31 | PORT_Pin_30 | PORT_Pin_24 | PORT_Pin_23 | PORT_Pin_13 | PORT_Pin_12 | PORT_Pin_11 | PORT_Pin_10 | PORT_Pin_9 | PORT_Pin_8 | PORT_Pin_7 | PORT_Pin_6 | PORT_Pin_5 | PORT_Pin_4 | PORT_Pin_3 | PORT_Pin_2 | PORT_Pin_1 | PORT_Pin_0; */ _WDWORD(0x40083058, 0x0FFFFFFF); /* PORTD->SPWR[0] = PWRVAL(13, 3) | PWRVAL(12, 3) | PWRVAL(11, 3) | PWRVAL(10, 3) | PWRVAL(9, 3) | PWRVAL(8, 3) | PWRVAL(7 , 3) | PWRVAL(6, 3) | PWRVAL(5, 3) | PWRVAL(4 , 3) | PWRVAL(3, 3) | PWRVAL(2, 3) | PWRVAL(1 , 3) | PWRVAL(0, 3); */ _WDWORD(0x4008305C, 0xF003C000); // PORTD->SPWR[1] = PWRVAL(31, 3) | PWRVAL(30, 3) | PWRVAL(24, 3) | PWRVAL(23, 3); /* D[7:2] (PE[5:0]) */ _WDWORD(0x40084018, 0x00222222); /* PORTE->SFUNC[0] = FUNCVAL(5, 2) | FUNCVAL(4, 2) | FUNCVAL(3, 2) | FUNCVAL(2, 2) | FUNCVAL(1, 2) | FUNCVAL(0, 2); */ _WDWORD(0x40084038, 0x0000003F); // PORTE->SANALOG = PORT_Pin_5 | PORT_Pin_4 | PORT_Pin_3 | PORT_Pin_2 | PORT_Pin_1 | PORT_Pin_0; _WDWORD(0x40084058, 0x00000FFF); /* PORTE->SPWR[0] = PWRVAL(5, 3) | PWRVAL(4, 3) | PWRVAL(3, 3) | PWRVAL(2, 3) | PWRVAL(1, 3) | PWRVAL(0, 3); */ } RESET // Reset MCU Setup_EBC(0x10000000); // Config EBC LOAD $L%L INCREMENTAL // Load program to external RAM Setup(0x10000000); // Setup SP, PC, VT g ,main // Go to main