TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2650片上flash读写问题

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

赞(0)
未经允许不得转载:TI中文支持网 » CC2650片上flash读写问题
分享到: 更多 (0)