打印

F28M35的DSP核如何启动?

[复制链接]
2430|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aquariuszh|  楼主 | 2013-8-22 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用FLASH的.cmd文件将程序调通,去掉仿真后,重新上电M3核启动了,而DSP核没启动,M3的程序里用了也IPCMtoCBootControlSystem(CBROM_MTOC_BOOTMODE_BOOT_FROM_FLASH); 函数。求高手指点下如何启动DSP核。谢谢

相关帖子

沙发
zhangmangui| | 2013-8-22 17:07 | 只看该作者
IPCMtoCBootControlSystem程序说明





unsigned short
IPCMtoCBootControlSystem(unsigned long ulBootMode)
{   //读取CTOMIPCBOOTSTS寄存器,该寄存器C28X的地址在0x4E20,M3的地址在0x400FB740
    //读到的数是0x00010002,Figure 6-15. C-Boot ROM Health Status;
//                     Table 6-19. C-Boot ROM Boot Status Values
//说明28X的boot已经开始,还在进程中
    while ((HWREG(MTOCIPC_BASE +
                  IPC_O_CTOMIPCBOOTSTS) &
            CBROM_BOOTSTS_CTOM_CONTROL_SYSTEM_READY)!=
           CBROM_BOOTSTS_CTOM_CONTROL_SYSTEM_READY)
    {
    }

    //初始化28X侧的RAM,Msg和L0~L3
    if(RAMControlInitM1MsgRam())
        return true;
    if(RAMControlInitL0L3Ram())
        return true;

    // 等待MTOCIPC标志寄存器的相关位清零
    while (HWREG(MTOCIPC_BASE + IPC_O_MTOCIPC标志寄存器) & (IPC_FLAG1 | IPC_FLAG32))
    {
    }
    //看看用户设置的ulBootMode值是否合法
    if (ulBootMode >= CBROM_MTOC_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE)//CBROM_MTOC_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE=0x7
    {
        return STATUS_FAIL;
    }

    // 按照设置的BOOTMode设置相关的引脚
    switch (ulBootMode)
    {
    case CBROM_MTOC_BOOTMODE_BOOT_FROM_SCI:
// SCITXDA ->    PF3_GPIO35    设置SCI相关引脚,把GPIO功能给到S8X内核控制
// SCIRXDA ->    PF4_GPIO36
        HWREG(GPIO_PORTF_BASE + GPIO_O_PUR) |= (GPIO_PIN_3 | GPIO_PIN_4);
        HWREG(GPIO_PORTF_BASE + GPIO_O_CSEL) |= (GPIO_PIN_3 | GPIO_PIN_4);
        break;
    case CBROM_MTOC_BOOTMODE_BOOT_FROM_SPI:
// SPISIMOA ->    PD0_GPIO16    设置SPI相关引脚,把GPIO功能给到S8X内核控制
// SPISOMIA ->    PD1_GPIO17
// SPICLKA ->    PD2_GPIO18
// SPISTEA    ->  PD3_GPIO19
        HWREG(GPIO_PORTD_BASE +
              GPIO_O_PUR) |=
            (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
        HWREG(GPIO_PORTD_BASE +
              GPIO_O_CSEL) |=
            (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
        break;
    case CBROM_MTOC_BOOTMODE_BOOT_FROM_I2C:
// SDAA ->    PF0_GPIO32    设置I2C相关引脚,把GPIO功能给到S8X内核控制
// SCLA ->    PF1_GPIO33
        HWREG(GPIO_PORTF_BASE + GPIO_O_PUR) |= (GPIO_PIN_0 | GPIO_PIN_1);
        HWREG(GPIO_PORTF_BASE + GPIO_O_CSEL) |= (GPIO_PIN_0 | GPIO_PIN_1);
        break;
    case CBROM_MTOC_BOOTMODE_BOOT_FROM_PARALLEL:
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);  //设置并口相关引脚,把GPIO功能给到S8X内核控制
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

// GPIO[7:6] ->    PB1:0_GPIO1:0
// GPIO[5:0] ->    PA5:0_GPIO5:0
        HWREG(GPIO_PORTA_BASE +
              GPIO_O_PUR) |=
            (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
             GPIO_PIN_4 |
             GPIO_PIN_5);
        HWREG(GPIO_PORTB_BASE + GPIO_O_PUR) |= (GPIO_PIN_0 | GPIO_PIN_1);
        HWREG(GPIO_PORTA_BASE +
              GPIO_O_CSEL) |=
            (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
             GPIO_PIN_4 |
             GPIO_PIN_5);
        HWREG(GPIO_PORTB_BASE + GPIO_O_CSEL) |= (GPIO_PIN_0 | GPIO_PIN_1);
// DSP_CTL ->  PE2_GPIO26
// HOST_CTL -> PE3_GPIO27
        HWREG(GPIO_PORTE_BASE + GPIO_O_PUR) |= (GPIO_PIN_2 | GPIO_PIN_3);
        HWREG(GPIO_PORTE_BASE + GPIO_O_CSEL) |= (GPIO_PIN_2 | GPIO_PIN_3);
        break;
    }
    //最后,写入MTOCIPCCOM命令,
    HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCCOM) = IPC_MTOC_EXECUTE_BOOTMODE_CMD;//0x00000013=19
    HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCBOOTMODE) = ulBootMode;

    //置位FLAG1和FLAG32
    HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCSET) |= (IPC_FLAG1 | IPC_FLAG32);

    return STATUS_PASS;
}



IPCLiteMtoCSetBits_Protected 程序说明






IPCLiteMtoCSetBits_Protected (unsigned long ulFlag, unsigned long ulAddress,
                              unsigned long ulMask, unsigned short usLength,
                              unsigned long ulStatusFlag)
{
    //如果MTOCIPC标志寄存器中的相关FLAG已经为1,说明在使用返回fail
    if (HWREG(MTOCIPC_BASE + IPC_O_MTOCIPC标志寄存器) & (ulFlag | ulStatusFlag))
    {
        return STATUS_FAIL;
    }
    //如果设定使用16位长度的命令,相关命令参考Table 6-17. MTOC IPC Commands
    if (usLength == IPC_LENGTH_16_BITS)
    {
        // Set up 16-bit set bits command, address, and mask.
        HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCCOM) = IPC_SET_BITS_16_PROTECTED;//写入商议好的命令
        HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCADDR) = ulAddress;               //要操作的寄存器地址,或者要跳转的地址
        HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCDATAW) = ulMask & (0x0000FFFF);  //对应寄存器要写入的值
    }//如果设定使用32位长度的命令,相关命令参考Table 6-17. MTOC IPC Commands
    else if (usLength == IPC_LENGTH_32_BITS)
    {
        // Set up 32-bit set bits command, address, and mask.
        HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCCOM) = IPC_SET_BITS_32_PROTECTED;//写0x0a
        HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCADDR) = ulAddress;             //要操作的寄存器地址,或者要跳转的地址
        HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCDATAW) = ulMask;                //对应寄存器要写入的值
    }

    // 置位相关IPC标志位,引起28X一侧的中断
    HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCSET) |= (ulFlag | ulStatusFlag);

    return STATUS_PASS;
}

对比看看  是否配置合理

使用特权

评论回复
板凳
wangdezhi| | 2013-8-22 23:36 | 只看该作者
f28m35 这个是嘛芯片的

使用特权

评论回复
地板
wangdezhi| | 2013-8-22 23:37 | 只看该作者
怎么还包含了dsp和m3的内核呢

使用特权

评论回复
5
aquariuszh|  楼主 | 2013-8-23 09:48 | 只看该作者
谢谢各位,我找到原因了,是在链接预定义选项里少加了“_FLASH”

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝