本文档主要是关于LPC8XX系列用户手册中关于IAP命令的一段话:
上面讲,在使用IAP命令的时候,用到两个寄存器r0,r1, r0用来指向命令参数,r1用来返回结果。但是用户可以在r0,r1中使用同样的指针,也就是重复使用命令表。所以有一些客户就的确按照这种描述来做了,使用同样的指针进去。不过遇到了些问题,发现返回的值总是错误的。 为了验证这个问题,我这里特地做了测试,测试代码如下:
- int ErasePage_KERRY (uint32_t adr)
- {
- uint32_t n;
- uint32_t buf[ 10 ];//kerry
-
- n = GetSecNum(adr); // Get Sector Number
- //=======kerry_begin=========
- buf[0] = IAP_PREPARE;
- buf[1] = n;
- buf[2] = n;
- buf[3] = 0;
- buf[4] = 0;
- buf[5] = 0;
- buf[6] = 0;
- buf[7] = 0;
- buf[8] = 0;
- buf[9] = 0;
-
- IAP_Call (buf, buf); // Call IAP Command
- //IAP_Call (buf, &buf[5]); // Call IAP Command
- if(buf[5]) return (buf[5]); // Command Failed
- //===========kerry_end==========
- IAP.cmd = IAP_PREPARE; // Prepare Sector for Erase
- IAP.par[0] = n; // Start Sector
- IAP.par[1] = n; // End Sector
- IAP_Call (&IAP.cmd, &IAP.stat); // Call IAP Command
- if (IAP.stat) return (IAP.stat); // Command Failed
- n = adr >> 6; // Get Page Number, 64 bytes/page
- IAP.cmd = IAP_ERASE_PAGE; // Erase Page
- IAP.par[0] = n; // Start page
- IAP.par[1] = n; // End page
- // IAP.par[2] = SystemCoreClock / 1000; // CCLK in kHz
- IAP_Call (&IAP.cmd, &IAP.stat); // Call IAP Command
- if (IAP.stat) return (IAP.stat); // Command Failed
- return (0); // Finished without Errors
- }
复制代码测试结果如下: 运行IAP_Call之前,测试buff结果
运行传参同样指针的IAP_Call之后:
可以发现,buff[0]结果变成1,并不正确。而且之前用来放命令的值也被改变了。下面运行IAP_Call输入两个不同指针,也就是内存地址的运行情况:
可以发现,结果是正确的,而且命令值也没被刷掉。 综上,对于LPC8XX系列,手册里面讲可以用同样的指针的说法是不正确的,所以建议大家还是参考官方的codebundle 代码,使用两个不同的buff地址进去。关于手册的问题,我也已经报了bug,后面的版本会修复这个问题。
|