This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2642R: cc2642r1f进行OTA升级的时候,用户程序存放的真正起始地址是多少?

Part Number: CC2642R
Other Parts Discussed in Thread: BLE-STACK, SYSCONFIG

我看官方例程配置(非安全模式),跳转进入用户程序的地址是0x50。然而看这份资料图片,0x1000后面816个字节好像也被占用。那么,我接收到手机APP下发下来的bin文件数据后,第一个包写入flash的起始地址是多少?呢?

  • Memory Map — SimpleLinkTm CC13XX/CC26XX SDK BLE5-Stack User's Guide 2.02.04.00 documentation

    现在不能上传图片,只好给个链接。(为啥TI的datasheet文档中没有这些内容,太不习惯了!今天找到这个链接了,明天又找不到了,查个芯片内部资源真浪费时间)

    The following table contains the memory map for the CC13xx or CC26xx.

    Memory Section Starting Address Size (bytes) Description
    Flash 0x00000000 60 Cortex Interrupt Vecs
    0x00001000 816 TI RTOS ROM Jump Table
    Application / Stack Code
    SNV 1-2 pages Simple Non-Volatile Storage
    Last Flash Page* 88 Customer Configuration
    ROM 0x10000000 ROM_SIZE TI-RTOS, BLE-Stack/BLE5-stack, Crypto, Driverlib, Boot
    RAM 0x20000000 RAMVEC_SIZE Interrupt Vector Table in RAM for dynamic Hwi creation
    0x20000100 RTOSRAM_SIZE Reserved for pointers for TI-RTOS in ROM
    .bss and .data
    ICall heap
    TI-RTOS kernel system stack (CSTACK)
  • 问题一、CC2642每页是8k,等于最开始那页我不能用来存放用户程序了吗?

    问题二、写flash,是不是必须整页写?还是可以单独写,整页擦除?

    谢谢

  • 您好您的问题我们已升级到英文论坛寻求帮助,如有答复将尽快回复您。上传图片的话,您可以点击回复框中的插入--图像/视频/文件--点击灰色的“上传”,然后上传您所需的文件或视频。

  • 您好,请问您问的是片上还是片外负载?

    那么,我接收到手机APP下发下来的bin文件数据后,第一个包写入flash的起始地址是多少?呢?

    这取决于应用。 您请查看 OB.c 中该逻辑存在的位置。 特别要看一下 oadImgIdentifyWrite()。 以下是在 OAD 映像被验证并且复制过程准备就绪后来自此文件的代码片段:

    // If image ID is accepted, set variables and pre-erase flash pages
        if(idStatus == OAD_SUCCESS && verifStatus == OAD_SUCCESS)
        {
    
            if(!useExternalFlash)
            {
                imageAddress = 0;
                imagePage = 0;
                metaPage = 0;
            }
            else
            {
                ImageSizeInfo_t extFlInfo[OAD_EFL_MAX_META] = {0};
    
                // Warning: oadFindExtFlMetaPage needs to be called first
                // to populate the imageInfo structure.
                oadFindExtFlMetaPage(&metaPage, extFlInfo);
                // oadFindExtFlImgAddr will find a suitable region
                // based on ext meta
                imageAddress = oadFindExtFlImgAddr(extFlInfo , idPld->len);
                imagePage = EXT_FLASH_PAGE(imageAddress);
            }

    如果您只将应用程序连接到调试器,您可以在此时暂停调试器以查找 imageAddress 的内容,这个应该是您在问的问题(从片外 OAD的角度来说 )。

    问题一、CC2642每页是8k,等于最开始那页我不能用来存放用户程序了吗?

    应该不是的。

    问题二、写flash,是不是必须整页写?还是可以单独写,整页擦除?

    您可以看下默认示例,它允许写入任何空间,但会擦除整个页面。 在 flash_interface_ext_RTOS_NVS 中看到了函数 eraseFlashPg。

  • 谢谢你!我用的是片内OTA。但是已经完全没有用官方OAD的例程思路了!我好像已经找到了存储起始地址。

    因为用的非安全模式,所以第一页的内容在擦前需要读出保存那些中断向量。我用readFlashPg(0,0,Temp,60); 读出前60个字节,然后打印出来,和用Flash Programmer 2读得的数据不一样。不知道哪里错了。

    再请教几个问题:1、CC2642首页flash开始一些地址,都是装的cortex中断向量啥的,能读出来不?还是不可读的?2、如果用eraseFlashPg(0),会把这些中断向量擦掉吗?

    谢谢

  • CC2642首页flash开始一些地址,都是装的cortex中断向量啥的,能读出来不?

    您好,应该是可读的。不过通常不建议改变中断矢量部分,因为应用程序使用该部分来跟踪各种状态和堆栈指针。

    如果用eraseFlashPg(0),会把这些中断向量擦掉吗?

    是的,您不应擦除第一页。

  • 你好!这个flash擦写我已经弄好了,现在又出现另外一个问题:我是在官方persistent_app工程里进行裁剪写自己的OTA程序的。现在发现flash空间不够用(官方默认分配给persistent_app工程的flash只有少量剩余空间,而我们的私有协议,尤其是加个打印调试程序时,马上就报警flash不够,编译过不了),我想把默认的nvs分配的2pages,改成1page,可以吗?这样就能多出8k的flash用来写下载程序。然而,我在.syscfg和.cmd改好了SIZE和persistent_app起始地址后,还是报错地址重叠,不知道还要修改哪里?这个事情比较急,多谢!

  • 我的新程序是从第一页flash某处开始存放的,所以肯定要先页擦,然后页写。所以我擦之前,先把那些中断向量(系统配置)copy出来,然后和用户程序一起整页写入第一页flash

  • 您好,只能使用 1nV 页面。 请问您是否还修改了 simple_peripheral_onchip 示例中的链接器文件? 请确保项目和 persistent _app 都被正确修改,以避免段重叠。

  • 我在用户程序multi_role里也同步修改了.cmd,.syscfg等相关的地方,可是就是报错。你说的链接器文件一共有哪些呢?能否列出来告诉我,我好一 一核对下。我就是怀疑我有哪个地方遗漏了修改,所以还是报错地址重叠。

    另外,nvs只分配1page=0x2000后,SNV_ID 范围: 0x100~0x11F需不需要更改呢?谢谢

  • 好的收到您的问题了哈,工程师这边应该会在下周二之前给到您答复。

  • 您好,工程师这边在默认示例中无法重现该问题,不过您可以试下以下步骤:

    在persistent_app中:

    1. 在项目的预定义符号内定义 NVOCMP_NVPAGES=1。

    2. 将 SysConfig NV 区域设置为 0x2000 (如您在上面的屏幕截图中所示)。

    3. 打开项目的链接器文件 cc13x2_cc26x2_app.cmd (如果使用 CCS 、则位于 C : \ti\simplelink_cc13xx_cc26xx_SDK_6_10_00_21_eng\examples\RTOS\CC26X2R1_LAUNCHXL\ble5stack\persistent _app\tirtos\cs 内。

    a. 编辑 IMG_A_FLASH_START 并将其设置为 0x00036000。

    4. 打开项目的 RTOS 配置文件

    a. persistent_app.cfg 将 m3Hwi.resetVectorAddress 修改为 0x00038090 ; (0x90 是用来考虑安全标头的。 默认情况下,persistent app会使能安全。)

    b. 

    	else
    	{
    	  m3Hwi.resetVectorAddress  = 0x00038090; //change this to 0x00036090; secure persistent app
    	  ROM.constStructAddr = 0x39000; //tables TI rtos uses
    	  ROM.externFuncStructAddr = 0x393C0;
    	}

    在 Simple_peripheral_OG_ON_CHIP 中,重复上述步骤 (4 除外)。 请注意,对于3来说,需要单独修改 Simple_peripheral_OG_ON_CHIP 的链接器文件。 请导航至该项目路径以查找该链接器文件。 戏外也请注意直接更改链接器文件 (您将丢失原始 SDK 内容)。 确保备份链接器文件或保存副本,以便您可以恢复任何更改。

  • 我也是这样修改的呢!可是就是报错。然后我保持nvs分配2page=0x4000不变,只把用户APP空间压缩,结果还是报错(除了你上面步骤1没有,其它的都相应改了。0x00038000改成0x00034000)

  • 我突然想到一个问题:我的.cmd等文件路径,在开发工程里是使用备份到我的工程目录下的那个,不是用安装默认的路径下的那个,会不会是这个问题导致的呢?

  • 好的感谢您提供的信息,已经帮您跟进给工程师了哈。

  • 我的.cmd等文件路径,在开发工程里是使用备份到我的工程目录下的那个,不是用安装默认的路径下的那个,会不会是这个问题导致的呢?

    您好,只要您可以通过修改项目属性通向正确的链接器文件,应该是没有问题的。

    我也是这样修改的呢!可是就是报错。然后我保持nvs分配2page=0x4000不变,只把用户APP空间压缩,结果还是报错(除了你上面步骤1没有,其它的都相应改了。0x00038000改成0x00034000)

    要使用一页 nv,如上所述,请确保定义predefined symbol并将其设置为 1。请问您为什么将起始地址减少 0x4000? persistent app将会保存 0x2000 ,然后您还必须在另一侧 (Simple_peripheral 应用程序) 进行类似更改,并且也可以保存另一个 0x2000。

    此外,请问您是只想要在persistent app中节省空间吗?

    而且您给的屏幕截图显示了 0x30000 的region base,这个是为什么会这样?

  • 我是想扩大persistent app空间(不够写我的OTA私有协议程序了),而我的用户APP空间有很多余量。所以想压缩用户 APP flash空间,让给persistent app工程使用。我是想移16k(=0x4000)flash空间给persistent app使用。(从0x34000往小移0x4000,就是0x30000了啊),nv还是使用默认的2page配置

  • 已经跟进给工程师了哈,有答复尽快给您。

  • 您好,首先十分抱歉,由于国外假期在即,工程师在4/18之前无法给到您新的答复,为您带来的不便敬请谅解。

    此外,能否请您再次查看链接器文件。 如果区域重叠的话,可能需要进行一些额外的修改。 日志中有一个错误是 the region is already specified..,您方便详细说下吗?以及能否再详细说明下针对链接器文件对项目属性所做的修改&对链接器文件进行的任何直接修改?

  • 非常感谢,flash扩充问题已经解决,因为太忙了,没有及时上来回复。请关闭该帖。再次感谢!