使用如下的 EPI 外设设置:
//
// Enable all the GPIO peripherals.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOS);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOT);
//
// Init. EPI0 Bus (General Purpose) (16 bits Data [0..15] + 12 bits Addr [16..27], WR[28], RD[29], FRAME[30], CLK[31])
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);
// Wait for GPIO change
//while(SysCtlPeripheralReady(SYSCTL_PERIPH_EPI0)){};
GPIOPinConfigure(GPIO_PK0_EPI0S0); // PK0 18 / PH0 29 D0
GPIOPinConfigure(GPIO_PK1_EPI0S1); // PK1 19 / PH1 30 D1
GPIOPinConfigure(GPIO_PK2_EPI0S2); // PK2 20 / PH2 31 D2
GPIOPinConfigure(GPIO_PK3_EPI0S3); // PK3 21 / PH3 32 D3
GPIOPinConfigure(GPIO_PK7_EPI0S24); // PK7 59 A8
GPIOPinConfigure(GPIO_PK6_EPI0S25); // PK6 60 A9
GPIOPinConfigure(GPIO_PK5_EPI0S31); // PK5 61 CLK
GPIOPinTypeEPI(GPIO_PORTK_BASE, EPI_PORTK_PINS);
GPIOPinConfigure(GPIO_PC7_EPI0S4); // PC7 22 D4
GPIOPinConfigure(GPIO_PC6_EPI0S5); // PC6 23 D5
GPIOPinConfigure(GPIO_PC5_EPI0S6); // PC5 24 D6
GPIOPinConfigure(GPIO_PC4_EPI0S7); // PC4 25 D7
GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS);
GPIOPinConfigure(GPIO_PA6_EPI0S8); // PA8 40 D8
GPIOPinConfigure(GPIO_PA7_EPI0S9); // PA9 41 D9
GPIOPinTypeEPI(GPIO_PORTA_BASE, EPI_PORTA_PINS);
GPIOPinConfigure(GPIO_PG1_EPI0S10); // PG1 50 D10
GPIOPinConfigure(GPIO_PG0_EPI0S11); // PG0 49 D11
GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS);
GPIOPinConfigure(GPIO_PM3_EPI0S12); // PM3 75 D12
GPIOPinConfigure(GPIO_PM2_EPI0S13); // PM2 22 D13
GPIOPinConfigure(GPIO_PM1_EPI0S14); // PM1 22 D14
GPIOPinConfigure(GPIO_PM0_EPI0S15); // PM0 22 D15
GPIOPinTypeEPI(GPIO_PORTM_BASE, EPI_PORTM_PINS);
GPIOPinConfigure(GPIO_PL0_EPI0S16); // PL0 81 A0
GPIOPinConfigure(GPIO_PL1_EPI0S17); // PL1 82 A1
GPIOPinConfigure(GPIO_PL2_EPI0S18); // PL2 83 A2
GPIOPinConfigure(GPIO_PL3_EPI0S19); // PL3 84 A3
GPIOPinConfigure(GPIO_PL4_EPI0S26); // PL4 84 A10
GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS);
GPIOPinConfigure(GPIO_PQ0_EPI0S20); // PQ0 05 A4
GPIOPinConfigure(GPIO_PQ1_EPI0S21); // PQ1 06 A5
GPIOPinConfigure(GPIO_PQ2_EPI0S22); // PQ2 11 A6
GPIOPinConfigure(GPIO_PQ3_EPI0S23); // PQ3 27 A7
GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS);
GPIOPinConfigure(GPIO_PB2_EPI0S27); // pin 91 A11
GPIOPinConfigure(GPIO_PB3_EPI0S28); // pin 92 /WE (/rd hb16)
GPIOPinTypeEPI(GPIO_PORTB_BASE, EPI_PORTB_PINS);
GPIOPinConfigure(GPIO_PP2_EPI0S29); // pin GPIO RD (HB16 /WR)
//GPIOPinConfigure(GPIO_PP3_EPI0S30); // pin 22 D5
GPIOPinTypeEPI(GPIO_PORTP_BASE, EPI_PORTP_PINS);
// General Purpose Init
EPIDividerSet(EPI0_BASE, 0x00000000); // 0x00010001 1/2 (System) = 120MHz * 0.5 = 60MHz
EPIModeSet(EPI0_BASE, EPI_MODE_HB16 ); // General Purpose
EPIConfigHB16Set(EPI0_BASE,
EPI_HB16_MODE_ADDEMUX | // sets up data and address as separate, D[15:0].
EPI_HB16_WRWAIT_1 | // write wait 2 EPI clocks
EPI_HB16_RDWAIT_1 , // write wait 2 EPI clocks
0);
EPIAddressMapSet(EPI0_BASE,
EPI_ADDR_PER_SIZE_64KB |
EPI_ADDR_PER_BASE_C // set base to 0xC0000000
);
我可以看到时钟以30.72MHz 的频率正确输出。 配合以下测试程序使用:
int
main(void)
{
volatile int32_t ui32Loop;
//
// Make sure the main oscillator is enabled. The system must have a 25MHz crystal attached to the OSC
// pins. The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal
// frequency is 10MHz or higher. SYSCTL_MOSC_SESRC for single ended osc iput (no crystal)
//
#if 1// CLK_EX
SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ|SYSCTL_MOSC_SESRC | SYSCTL_MOSC_PWR_DIS);
SysCtlClockOutConfig(SYSCTL_CLKOUT_MOSC | SYSCTL_CLKOUT_DIS , 1);
//SysCtlClockOutConfig(SYSCTL_CLKOUT_MOSC, 1);
//SysCtlClockFreqSet(SYSCTL_OSC_MAIN | SYSCTL_USE_OSC , 30720000);
SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC), 25000000);
//HWREG(SYSCTL_RSCLKCFG_R)=0x03300000;
#elif 0
#else // internal with pll
SysCtlClockOutConfig(SYSCTL_DIVSCLK_EN | SYSCTL_DIVSCLK_SRC_PIOSC, 1);
SysCtlClockFreqSet(SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240, 30720000);
#endif
PinoutSet();
//
// Enable the GPIO port that is used for the on-board LED.
//
SYSCTL_RCGCGPIO_R = SYSCTL_RCGCGPIO_R12;
//
// Do a dummy read to insert a few cycles after enabling the peripheral.
//
ui32Loop = SYSCTL_RCGCGPIO_R;
//
// Enable the GPIO pin for the LED (PN0). Set the direction as output, and
// enable the GPIO pin for digital function.
//
GPIO_PORTN_DIR_R = 0x01;
GPIO_PORTN_DEN_R = 0x01;
//
// Loop forever.
//
while(1)
{
volatile uint16_t *paddr=(uint16_t *)0xc0000010;
volatile readval=0;
//
// Turn on the LED.
//
GPIO_PORTN_DATA_R |= 0x01;
*paddr=5;
readval=*paddr;
//
// Delay for a bit.
//
int delay=200000; //200000
for(ui32Loop = delay; ui32Loop > 0; ui32Loop--)
{
}
//
// Turn off the LED.
//
GPIO_PORTN_DATA_R &= ~(0x01);
*paddr=0x0a;
readval=*paddr;
//
// Delay for a bit.
//
for(ui32Loop = delay; ui32Loop > 0; ui32Loop--)
{
}
}
}
我可以看到/RD 和/WR 线路正确切换、但看不到 d0或 A4切换。 我哪里出了问题?



