主题中讨论的其他器件: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
对我做错了什么有什么想法吗?
谢谢。
布伦特