查看: 1817|回复: 1

[原创] 【经验分享】LPC8XX IAP命令注意点

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20003
最后登录
2024-4-24
发表于 2018-10-31 15:41:51 | 显示全部楼层 |阅读模式

       本文档主要是关于LPC8XX系列用户手册中关于IAP命令的一段话:
main.jpg


上面讲,在使用IAP命令的时候,用到两个寄存器r0,r1, r0用来指向命令参数,r1用来返回结果。但是用户可以在r0,r1中使用同样的指针,也就是重复使用命令表。所以有一些客户就的确按照这种描述来做了,使用同样的指针进去。不过遇到了些问题,发现返回的值总是错误的。     为了验证这个问题,我这里特地做了测试,测试代码如下:


  1. int ErasePage_KERRY (uint32_t adr)
  2. {
  3.   uint32_t n;
  4.    uint32_t buf[ 10 ];//kerry
  5.    
  6.   n = GetSecNum(adr);                          // Get Sector Number
  7. //=======kerry_begin=========
  8.   buf[0] = IAP_PREPARE;
  9.   buf[1] = n;
  10.   buf[2] = n;
  11.   buf[3] = 0;   
  12.   buf[4] = 0;   
  13.   buf[5] = 0;   
  14.   buf[6] = 0;
  15.   buf[7] = 0;   
  16.   buf[8] = 0;     
  17.   buf[9] = 0;  
  18.   
  19.   IAP_Call (buf, buf);              // Call IAP Command
  20.   //IAP_Call (buf, &buf[5]);              // Call IAP Command
  21.   if(buf[5]) return (buf[5]);             // Command Failed
  22. //===========kerry_end==========
  23.   IAP.cmd    = IAP_PREPARE;                    // Prepare Sector for Erase
  24.   IAP.par[0] = n;                              // Start Sector
  25.   IAP.par[1] = n;                              // End Sector
  26.   IAP_Call (&IAP.cmd, &IAP.stat);              // Call IAP Command
  27.   if (IAP.stat) return (IAP.stat);             // Command Failed

  28.   n = adr >> 6;                                // Get Page Number, 64 bytes/page

  29.   IAP.cmd    = IAP_ERASE_PAGE;                 // Erase Page
  30.   IAP.par[0] = n;                              // Start page
  31.   IAP.par[1] = n;                              // End page
  32. //  IAP.par[2] = SystemCoreClock / 1000;         // CCLK in kHz
  33.   IAP_Call (&IAP.cmd, &IAP.stat);              // Call IAP Command
  34.   if (IAP.stat) return (IAP.stat);             // Command Failed

  35.   return (0);                                  // Finished without Errors
  36. }
复制代码
测试结果如下:
运行IAP_Call之前,测试buff结果
1.png


运行传参同样指针的IAP_Call之后:
2.png

可以发现,buff[0]结果变成1,并不正确。而且之前用来放命令的值也被改变了。下面运行IAP_Call输入两个不同指针,也就是内存地址的运行情况: 3.png
可以发现,结果是正确的,而且命令值也没被刷掉。
综上,对于LPC8XX系列,手册里面讲可以用同样的指针的说法是不正确的,所以建议大家还是参考官方的codebundle 代码,使用两个不同的buff地址进去。关于手册的问题,我也已经报了bug,后面的版本会修复这个问题。














回复

使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32017
    最后登录
    2024-4-9
    发表于 2018-10-31 16:05:36 | 显示全部楼层
    谢谢小恩GG分享
    签到签到
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-24 20:57 , Processed in 0.129967 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表