主题中讨论的其他器件:C2000WARE
您好!
我正在尝试将 Boot Rom 代码- C:\ti\c2000\c2000Ware_4_02_00_00\libraries\boot_rom\f2837xd\revB 合并到 LED Blink 程序中。
具体来说、我在 LED 闪烁主程序中检查是否连接了 USB。 如果是,则调用 USB_Boot ()。
uint32_t gpio46_value = GPIO_readPin(46); if(gpio46_value == 1) //Checking whether USB is connected or not. { DevCfgRegs.DC12.bit.USB_A = 1; Uint32 EntryAddr = USB_Boot(USB_BOOT); //Calling USB_Boot function. return EntryAddr; } // // Loop Forever // for(;;) { // // Turn on LED // GPIO_writePin(DEVICE_GPIO_PIN_LED1, 0); // // Delay for a bit. // DEVICE_DELAY_US(500000); // // Turn off LED // GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1); // // Delay for a bit. // DEVICE_DELAY_US(500000); }
我遇到的问题是寄存器未映射到正确位置。
例如、在 LED 闪烁程序中、我包含了 来自 C:\ti\c2000\C2000Ware_4_03_00_00\libraries\boot_rom\f2837x\revB\rom_sources\F2837x_headers\source 的 F2837x_GlobalVariableDefs.c
其中一部分是时钟配置系统寄存器:
#ifdef __cplusplus #pragma DATA_SECTION("ClkCfgRegsFile") #else #pragma DATA_SECTION(ClkCfgRegs,"ClkCfgRegsFile"); #endif volatile struct CLK_CFG_REGS ClkCfgRegs;
我在 LED Blink .map 文件中看到以下内容:
Line 78: 00083630 00000004 (.cinit.ClkCfgRegsFile.load) [load image, compression = zero_init] Line 148: ClkCfgRegsFile Line 150: 00000002 00000032 F2837x_GlobalVariableDefs.obj (ClkCfgRegsFile) Line 318: ClkCfgRegsFile: load addr=00083630, load size=00000004 bytes, run addr=00000002, run size=00000032 bytes, compression=zero_init Line 344: 00000002 0 (00000000) ClkCfgRegs Line 416: 1 00000002 ClkCfgRegs Line 699: 1 00000002 ClkCfgRegs
当我查看另一个程序时、我会看到以下内容:
Line 141: CLKCFG 0005d200 00000032 00000032 00000000 RWIX Line 606: ClkCfgRegsFile Line 608: 0005d200 00000032 F2837xD_GlobalVariableDefs.obj (ClkCfgRegsFile) Line 940: 0005d200 1748 (0005d200) _ClkCfgRegs Line 1043: 1 0005d200 _ClkCfgRegs Line 1700: 1 0005d200 _ClkCfgRegs
我 在.map 文件中看不到 CLKCFG。 当 LED 闪烁调用 USB_Boot ()而又调用 USB_Init ()时,它会在访问 ClkCfgRegs 时卡住,因为它们没有指向0x5D200
void USB_Boot_Init() { uint32_t EntryAddr = 0xFFFFFFFF; //Soprano //Lock the main PLL< aux PLL and enable the USB module clock // //USBCLK = 120 MHz / 2, sourced from the external oscillator for precision // //SYSCLK must be greater than USBCLK / 2, according to Design. The PLL minimum //Fout is 110 MHz, so let's set the multiplier to give 120 MHz and keep the //output divider at 1. EALLOW; ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 0x0; //Use INTOSC2 (~10 MHz) as the main PLL clock source ClkCfgRegs.SYSPLLMULT.all = 12; //Set IMULT to 12, clear FMULT ClkCfgRegs.SYSPLLCTL1.bit.PLLEN = 1; //Enable the main PLL ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = 0; //Set PLLSYSCLKDIV to 1 while (ClkCfgRegs.SYSPLLSTS.bit.LOCKS != 1) {;} //Wait for the PLL to lock ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1; //Turn off the main PLL bypass ClkCfgRegs.CLKSRCCTL2.bit.AUXOSCCLKSRCSEL = 0x1; //Use XTAL (20 MHz) as the aux PLL clock source ClkCfgRegs.AUXPLLMULT.all = 6; //Set IMULT to 6, clear FMULT - 120MHz ClkCfgRegs.AUXPLLCTL1.bit.PLLEN = 1; //Enable the aux PLL ClkCfgRegs.AUXCLKDIVSEL.bit.AUXPLLDIV = 2/2; //Set AUXPLLDIV to 2 while (ClkCfgRegs.AUXPLLSTS.bit.LOCKS != 1) {;} //Wait for the PLL to lock ClkCfgRegs.AUXPLLCTL1.bit.PLLCLKEN = 1; //Turn off aux PLL bypass CpuSysRegs.PCLKCR11.bit.USB_A = 1; //Enable the clock to the USB module
对我做错了什么有什么想法吗?
谢谢。
布伦特