您尚未登录。

楼主 # 2022-04-02 22:36:11

wm20031015
会员
注册时间: 2017-10-18
已发帖子: 66
积分: 170

Lauterbach TRACE32下载算法框架

近来用国产的ARM起来越多了,想着把TRACE32利用起来,调试、抓取数据非常的方便,花了一周的时间找资料,验证算法,终于搞定了。

//***********************************************************************************************************
//  Ver 1.0
//      2022.04.02  1、新建文件。
//***********************************************************************************************************
//#include    "stdio.h"

//参数块定义
typedef struct{
    unsigned int  flashaddr;  //0x800,芯片起始地址
    unsigned int  flashwidth; //0x804,1=8bit,2=16bit,4=32bit
    unsigned int  width;      //0x808,数据总线位宽
    unsigned int  offset;     //0x80c,
    unsigned int  addr;       //0x810,FLASH操作地址
    unsigned int  size;       //0x814,擦除、写入字节数
    unsigned int  reserved;   //0x818,
    unsigned int  status;     //0x81c,in: 1=program, 2=erase, 5=chip erase, out: 0=o.k., 0x100=fail
    unsigned char   data[4096]; //0x820,缓冲区起始地址
}FlashParameter_Str;
//关键地址,TRACE32的数据交互都在这个结构体里面
static FlashParameter_Str FlashParameter __attribute__((at(0x20000800)));


#define FLASH_PAGE_SIZE     512

enum{
    FLASH_PROGRAM       = 0x01,
    FLASH_ERASE         = 0x02,
    FLASH_CHIP_ERASE    = 0x05,
};

#define FMC_FLPROT          *(unsigned int *)(0x40020000UL + 0x20)
#define FMC_FLOPMD1         *(unsigned int *)(0x40020000UL + 0x04)
#define FMC_FLOPMD2         *(unsigned int *)(0x40020000UL + 0x08)
#define FMC_FLSTS           *(unsigned int *)(0x40020000UL + 0x00)
#define FMC_FLERMD          *(unsigned int *)(0x40020000UL + 0x0c)
#define FMC_FLSTS_OVF_Msk   0x01
#define SCB_VTOR           *(unsigned int *)(0xE000E000UL + 0x0D00UL + 0x08)

//关键行,把main函数放到RAM首地址,找到这个问题花了不少时间。
#pragma arm section code = ".ARM.__at_0x20000000"
int main(void)
{     
    unsigned int errCnt = 65535;
    unsigned int tMs;
    unsigned int i;
    unsigned char *ptr,*buf;
    
    while(1)
    {
        switch(FlashParameter.status)
        {
            case FLASH_PROGRAM:
                ptr = (unsigned char *)FlashParameter.addr;
                buf = &FlashParameter.data[0];
                
                if(FlashParameter.size > 0xffff)
                {
                    FlashParameter.size = 0xffff;
                }
                
                FMC_FLPROT = 0xF1;
                
                for(i=0; i<FLASH_PAGE_SIZE; i++) 
                {
                    FMC_FLOPMD1 = 0xAA;
                    FMC_FLOPMD2 = 0x55;  
                    *ptr++ = *buf++;    
                    // polling OVER Flag
                    while((FMC_FLSTS & FMC_FLSTS_OVF_Msk) == 0);
                    FMC_FLSTS |= FMC_FLSTS_OVF_Msk;
                }

                FMC_FLPROT = 0x00;
                FlashParameter.status = 0;
                return(0);
                break;
                    
            case FLASH_ERASE:
                FMC_FLERMD = 0x10;
                FMC_FLPROT = 0xF1;
                FMC_FLOPMD1 = 0x55;
                FMC_FLOPMD2 = 0xAA;  
                // Write data to start address of sector to trigger Erase Operation
                *(unsigned int *) FlashParameter.addr = 0xFFFFFFFF;
                
                // polling Erase Over Flag
                while((FMC_FLSTS & FMC_FLSTS_OVF_Msk) == 0);
                FMC_FLSTS |= FMC_FLSTS_OVF_Msk;
                FMC_FLERMD = 0x00;
                FMC_FLPROT = 0x00;
                FlashParameter.status = 0;
                return(0);
                break; 
                    
            case FLASH_CHIP_ERASE:
                FMC_FLERMD = 0x08;
                FMC_FLPROT = 0xF1;
                FMC_FLOPMD1 = 0x55;
                FMC_FLOPMD2 = 0xAA;  
                *(unsigned char *) FlashParameter.addr = 0xff;    
                // polling OVER Flag
                while((FMC_FLSTS & FMC_FLSTS_OVF_Msk) == 0);
                FMC_FLSTS |= FMC_FLSTS_OVF_Msk;
                FMC_FLPROT = 0x00;
                FlashParameter.status = 0;
                return(0);
                break; 
              
            default:
                tMs = 65535;
                while(tMs--);
                break;
        }
        if(errCnt > 0) errCnt--;
        else           return(1);
    }
}
#pragma arm section

flash.rar

离线

#1 2022-04-03 15:20:05

ggzzc
会员
注册时间: 2020-06-29
已发帖子: 21
积分: 0.5

Re: Lauterbach TRACE32下载算法框架

土豪,问一下,用这个算法可以把调试Tricore的变成调试Arm核的吗?

离线

楼主 #2 2022-04-03 23:31:32

wm20031015
会员
注册时间: 2017-10-18
已发帖子: 66
积分: 170

Re: Lauterbach TRACE32下载算法框架

trace32调试什么芯片,换对应的头子就可以了,楼上有Tricore的头子?我没有用过tricore的芯片不太清楚,手上还有两个支持arm的头子,也许可以交换一下

离线

#3 2022-04-04 16:09:52

ggzzc
会员
注册时间: 2020-06-29
已发帖子: 21
积分: 0.5

Re: Lauterbach TRACE32下载算法框架

wm20031015 说:

trace32调试什么芯片,换对应的头子就可以了,楼上有Tricore的头子?我没有用过tricore的芯片不太清楚,手上还有两个支持arm的头子,也许可以交换一下

哦,我这是公司的工具,个人用不起,确实好用。

离线

楼主 #4 2022-04-04 21:53:26

wm20031015
会员
注册时间: 2017-10-18
已发帖子: 66
积分: 170

Re: Lauterbach TRACE32下载算法框架

个人可以弄个山寨的,原装货价格确实高了点

离线

#5 2022-04-07 09:57:47

jordonwu
会员
注册时间: 2021-07-05
已发帖子: 64
积分: 45

Re: Lauterbach TRACE32下载算法框架

用trace32来调试mcu有点奢侈啊

离线

#6 2022-04-07 14:37:22

tpu
会员
注册时间: 2020-06-15
已发帖子: 37
积分: 39.5

Re: Lauterbach TRACE32下载算法框架

trace32的特点:
1. 贵
2. 支持CPU多
3. 逼格高

但调试MCU,真没jlink之流方便.

离线

#7 2022-12-13 14:51:50

活出自我
会员
注册时间: 2018-12-13
已发帖子: 7
积分: 0.5

Re: Lauterbach TRACE32下载算法框架

楼主太厉害了!请问下下载算法的资料能分享下吗?

离线

楼主 #8 2022-12-13 15:51:03

wm20031015
会员
注册时间: 2017-10-18
已发帖子: 66
积分: 170

Re: Lauterbach TRACE32下载算法框架

搞MCU开发JLINK是比较方便。很多都是拿来做逆向的,IDA+TRACE32,直接修改完调试,没更方便的了

离线

#9 2023-07-04 21:23:05

演技担当黄晓明
会员
注册时间: 2017-10-17
已发帖子: 184
积分: 122.5

Re: Lauterbach TRACE32下载算法框架

大神接受我的膝盖

离线

#10 2023-12-23 13:45:15

木偶
会员
注册时间: 2023-12-23
已发帖子: 2
积分: 2

Re: Lauterbach TRACE32下载算法框架

大佬,问一下相关资料,或者官方的模板在哪能找到

离线

楼主 #11 2024-04-09 20:10:40

wm20031015
会员
注册时间: 2017-10-18
已发帖子: 66
积分: 170

Re: Lauterbach TRACE32下载算法框架

官方没有提供模板,从网上查找的文档自己写的

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn