瑞萨单片机论坛
直播中

杨永胜

11年用户 2352经验值
擅长:嵌入式技术
私信 关注
[经验]

【RA4M2设计挑战赛】使用 openocd 直接烧录 hex 文件到 RA4M2

首先声明,目前虽然可以实现使用 openocd 烧录文件到 RA4M2,但是速度特别慢,具体原因稍后会说道.

这个补丁我是在前人的基础上修改来到,因为根据前人补丁的内容,理论上来说是可以实现烧写的,但是我调试了很长时间之后发现在执行 target_run_algorithm 时候出错了(使用的山寨 jlink).然后使用 cmsis-dap 虽然函数 target_run_algorithm 不报错了,但是分析还是没有正常执行这段代码在芯片端.所以不得已,才使用了傻瓜的方法,直接使用 target_write/read_u32/u8/16 这些接口函数操作 RA4M2,实现写 code flash.

前人补丁的链接, 有兴趣的可以看下.

我修改的部分主要有两处:

__attribute__ ((unused)) static int __rv40f_flash_write(struct target *target, unsigned int count, uint16_t *wa_start, uint16_t *wa_end, uint32_t dst_addr)
{
    unsigned int i = 0;
    __attribute__ ((unused)) uint32_t value = 0;
    uint8_t reg8   = 0;
    __attribute__ ((unused))    uint16_t reg16   = 0;
    uint32_t reg32   = 0;
    int retval;

    target_write_u32(target, FACI_FSADDR, (uint32_t)dst_addr);
    target_write_u8(target, FACI_CMD_AREA, 0XE8);
    target_write_u8(target, FACI_CMD_AREA, count);

    for (; i < count; i++)
    {
        reg16 = *(wa_start+i);
        target_write_u16(target, FACI_CMD_AREA, reg16);
        do
        {
            retval = target_read_u32(target, FACI_FSTATR, &reg32);
            usleep(1000);
        } while(reg32 & 0X400);
    }

    target_write_u8(target, FACI_CMD_AREA, 0XD0);

    retval = target_read_u32(target, FACI_FSTATR, &reg32);
    if (reg32 & 0X8000)
    {
        retval = target_read_u8(target, FACI_FASTAT, &reg8);
    }

    return retval;
}
  1. 替换 target_run_algorithm 函数为 __rv40f_flash_write,选择直接远程控制 RA4M2,而不是让这段程序运行在 RA4M2,所以就导致速度特别慢.实际烧写还是用 pyocd 快一点.

更多回帖

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