This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:寄存器映射问题

Guru**** 666710 points
Other Parts Discussed in Thread: C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1251927/tms320f28379d-issue-with-where-registers-are-mapped

器件型号:TMS320F28379D
主题中讨论的其他器件: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
 

对我做错了什么有什么想法吗?

谢谢。

布伦特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我最后删除了 LED 项目并将其重新导入。 我不再有这个问题。