CC2650片上flash读写,为什么有时候能正常读写有时候不行呢?
硬件:CC2650LaunchPad
uint8_t bBuf[4] = {0}; uint_least32_t dstAddr = 0x10000; uint32_t word = 0x12345678; FlashSectorErase(16 * BASELOADER_IPAGESIZE); FlashProgram((uint8_t *) &word, dstAddr, 4); memcpy(bBuf, (uint8_t *)(dstAddr), 4); Display_print1(dispHandle, 0, 0, "0x10000 = %x", bBuf[0]); Display_print1(dispHandle, 0, 0, "0x10001 = %x", bBuf[1]); Display_print1(dispHandle, 0, 0, "0x10002 = %x", bBuf[2]); Display_print1(dispHandle, 0, 0, "0x10003 = %x", bBuf[3]); CPUdelay(800000*50); dstAddr = 0x10004; word = 0x99999999; FlashProgram((uint8_t *) &word, dstAddr, 4); memcpy(bBuf, (uint8_t *)(dstAddr), 4); Display_print1(dispHandle, 0, 0, "0x10004 = %x", bBuf[0]); Display_print1(dispHandle, 0, 0, "0x10005 = %x", bBuf[1]); Display_print1(dispHandle, 0, 0, "0x10006 = %x", bBuf[2]); Display_print1(dispHandle, 0, 0, "0x10007 = %x", bBuf[3]);
下面是打印出来的结果:
// 烧写后第一次单步执行结果: APP init 0x10000 = 78 0x10001 = 56 0x10002 = 34 0x10003 = 12 0x10004 = 99 0x10005 = 99 0x10006 = 99 0x10007 = 99 -------------- // F5直接跑或硬件复位的执行结果: APP init 0x10000 = 78 0x10001 = 56 0x10002 = 34 0x10003 = 12 0x10004 = ff 0x10005 = ff 0x10006 = ff 0x10007 = ff --------------
Kevin Qiu1:
有时候具体是什么情况,只能正常读写一次还是其他的情况
user6142675:
回复 Kevin Qiu1:
单步情况下 可以正确读写(如原贴第一次结果),F5直接跑,开发板硬件复位等就不对(如原贴第N次结果)。我以为是需要延时,加上延时后还是不对……
user6142675:
回复 Kevin Qiu1:
硬件复位后打印结果,地址0x10000的值正确,0x10004的值错误,但是用Flash Programmer 2查看这两个地址结果又是正确的(另外已经设置优化为None)。是什么原因呢?
Kevin Qiu1:
回复 user6142675:
应该是被后面的程序覆盖掉了
user6142675:
回复 Kevin Qiu1:
对 把局部变量bBuf该位全局变量读写正确了!谢谢Kevin
我还有个问题,片上flash的最小擦除单位默认是1K,可以更改吗?
举个例子,如果代码区0 ~ 0x107FFF;但是又想使用0x10800-0x10FFF作为自定义存储区存储自定义参数(会频繁读写),每次写之前都需要擦除该区域,那么代码区的一部分就会被擦除掉?
Kevin Qiu1:
回复 user6142675:
CC2650的flash以4K作为一个扇区(1页),擦除是按扇区擦除的,也就是一次至少会擦出4K的区域,不能只擦除1K或2K
user6142675:
回复 Kevin Qiu1:
1.BLEStack中的SNV是怎么实现的?
// Customer NV Items - Range0x80 - 0x8F - This must match the number of Bonding entries #define BLE_NVID_CUST_START0x80//!< Start of the Customer's NV IDs #define BLE_NVID_CUST_END0x8F//!< End of the Customer's NV IDs这部分位于片上flash的0x1E000 ~ 0x1EFFF,每个NV ID256个字节,可以单独读写,这个怎么实现的?
2. 我想在其它区域实现类似的功能,比如在0x10800 ~ 0x10FFF的区域也实现类似SNV的自定义存储的功能,请问有办法吗?
Kevin Qiu1:
回复 user6142675:
SNV所在区域及使用例子可以看3.10节:https://www.ti.com.cn/cn/lit/ug/swru393e/swru393e.pdf?ts=1607583824681&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Ftool%252Fcn%252FBLE-STACK
user6142675:
回复 Kevin Qiu1:
1.看了3.10节的内容,说的是在使用BLEStack的情况下,stack已经做了很多工作,用户直接调用 osal_snv_read和osal_snv_write函数即可实现256字节块的读写,但是如果不使用stack,SNV还能如3.10节所述的使用吗?
2.如果不能,自己实现类似功能有方法吗?
Kevin Qiu1:
回复 user6142675:
不使用stack无法使用SNV,在CC2640r2f提供了NVS驱动例程可以实现:dev.ti.com/…/node
CC2650使用单独的BLE-stack-2-2-4,时间比较久了,没有此例程。
e2e.ti.com/…/3022995
e2e.ti.com/…/634754