单片机/MCU论坛
直播中

无人岛

9年用户 839经验值
擅长:嵌入式技术 制造/封装 控制/MCU
私信 关注

请问PSOC6是如何实现跳跃的?

我的应用程序程序从外部将升级高级文件写入到我分区的 flashri,bootloaderprogaderPrograderprogres将升级到应用程序区。
但是如何实现跳转呢?有跳转函数数的设计可以参考吗?
        

回帖(3)

陈丽

2024-1-25 15:54:19
如果你使用的不是我们的 DFU 引导加载程序架构,而是自定义的架构,跳转函数可以参考的代码
/* 跳转地址必须对齐到 128 字节*/
void (*flash_Jump) (void);void flash_boot_jump (u
int32_t addr)
{
uint32_t MspValue;
uint32_t JumpValue;

SCB->RESERVED0 = addr;
MspValue = *((uint32_t *)(addr));
JumpValue = *((uint32_t *)(addr+4));
flash_Jump = (void(*)(void))(JumpValue);
__set_MSP(MspValue);
flash_Jump();
}

void bootjumPapp (uint32_t addr)
{
    __disable all interrupt  // pseudocode
    __clear all pending interrupt // pseudocode

    flash_boot_jump(addr);
}
举报

杨万富

2024-1-25 17:01:30
在PSOC6中,跳转到应用程序的实现主要依赖于Bootloader和Bootloader Launcher两个组件。

1. Bootloader:该组件负责升级过程中的数据传输、校验和存储。它会将升级文件写入到Flash的指定分区中,在写入完成后,它可以通过指定的协议(如UART、USB等)通知Bootloader Launcher准备跳转到应用程序。

2. Bootloader Launcher:该组件负责在合适的时机执行跳转指令,使程序从Bootloader切换到应用程序。它通常位于Bootloader的末尾,并被存储在Flash的特定地址。Bootloader Launcher在启动时判断是否需要跳转到应用程序,若需要,则通过跳转函数实现程序的跳转。

在实现跳转时,需要在Bootloader Launcher中定义一个函数,用于将控制权转移到应用程序的入口点。这个函数通常被命名为“Cy_JumpToApp”或类似的名称。示例代码如下:

```c
__attribute__((noreturn)) void Cy_JumpToApp(void)
{
    /* 将中断禁用 */
    Cy_SysLib_EnterCriticalSection();

    /* 设置应用程序的入口点地址 */
    cy_en_reset_t type = CY_SYSLIB_RESET_HWWDT | CY_SYSLIB_RESET_ACT_FAULT;
    *(uint32_t *)(FLASH_ADDR_APPLICATION_RESET + 4) = FLASH_ADDR_APPLICATION_RESET + 48;

    /* 关闭所有外设并执行系统软复位 */
    Cy_SysLib_SystemReset(type);
}
```

注意,上述示例中,`FLASH_ADDR_APPLICATION_RESET`是应用程序的入口地址。

通过调用`Cy_JumpToApp`函数,Bootloader Launcher可以将控制权转移到应用程序,实现跳转。

需要注意的是,跳转的实现可能因具体的应用场景而有所差异,上述代码仅为示例,具体的跳转函数实现需要根据项目需求进行调整。
举报

程丽晶

2024-3-5 13:57:33
我遇到一个类似问题,我使用了这段跳转程序,之前在开发板上是可以成功跳转的。现在移植到自己的板子上就遇到问题了。
boot程序跳转时会进入Cy_SysLib_FaultHandler。

开发工具:Modustoobox。工程为单核,CM0没有用。CM4的flash划分为BOOT和APP。
之前在开发板上做的调试版本可以正常跳转,开发板型号是:CY8CKIT-062-BLE
现在移植到我自己的板子上(芯片型号:CY8C6244LQI-S4D92)遇到问题。

蹲一下解决方案,谢谢
举报

更多回帖

发帖
×
20
完善资料,
赚取积分