我在微控制器上闪存了两个 CPU、以便在独立操作中引导。 当微控制器上电后、所需的结果是让两个 CPU 启动并开始运行。 但是、有时在下电上电后、微控制器似乎不会开始执行。 有时、它会开始执行。 我使用 IPC 来确保 CPU1已初始化并启动内部 ADC、以便 CPU2可以从寄存器中读取。
以下是主代码中 CPU1的内容:
InitSysCtrl();
InitFlash();
//为 GS0/GS14 SARAM 提供对 CPU02的内存访问
//
while (!((MemCfgRegs.GSxMSEL.bit.MSEL_GS0和 MemCfgRegs.GSxMSEL.bit.MSEL_GS14)))
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS0 = 1;
MemCfgRegs.GSxMSEL.bit.MSEL_GS14 = 1;
EDIS;
}
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
device_init();
InitCpuTimer();
//步骤2. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断并
清除标志//。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断
//服务例程(ISR )的指针初始化 PIE 矢量表。
//这将填充整个表,即使在
本示例中未使用中断//也是如此。 这对于调试很有用。
InitPieVectTable();
//在此处启用所需的 GPIO 输入和输出。 参考 gpio.c 获取指南(从编译中排除文件)
DEVICE_initGPIO();
//让 CPU2知道内部 ADC 已初始化并正在运行
HWREG (IPC_BASE + IPC_O_SET)= 1UL << IPC_ADC_READY;
//等待 CPU2返回
while ((HWREG (IPC_BASE + IPC_O_STS)&(1UL << IPC_GPIO_READY)))
{
}
以下是 CPU2主代码中的内容:
//将时间关键代码和闪存设置代码复制到 RAM
//这包括 InitFlash()、闪存 API 函数和任何函数
//分配给 ramfuncs 段。
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
InitSysCtrl();
InitFlash();
IpcRegs.IPCBOOTSTS = C2_BootROM_BOOTSTS_SYSTEM_READY;
//
//初始化设备时钟和外设
//
// Device_init ();
//
//初始化 GPIO 并将 GPIO 引脚配置为推挽输出
//
DEVICE_initGPIO();
//
//清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断
//
interrupt_initModule();
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;
InitCpuTimer();
//等待共享 RAM 可用。
while ((HWREGH (MEMCFG_base + MEMCFG_O_GSXMSEL)和
(MEMCFG_GSXMSEL_MSEL_GS14 | MEMCFG_GSXMSEL_MSEL_GS15)= 0U)
{
}
//
//等待 CPU1初始化 ADC
//
while (!(HWREG (IPC_BASE + IPC_O_STS)&(1UL << IPC_ADC_READY)))
{
}
//
//确认 CPU2的 IPC 标志17
//
HWREG (IPC_BASE + IPC_O_ACK)= 1UL << IPC_ADC_READY;
HWREG (IPC_BASE + IPC_O_CLR)= 1UL << IPC_GPIO_READY;
如何确保在下电上电后、两个 CPU 开始执行?
谢谢!