pursuing 发表于 2024-3-1 10:20:27

关于冲哥29课SPI读写W25X40CL页写程序的疑问

本帖最后由 pursuing 于 2024-3-2 11:17 编辑

我在学习冲哥STC32教程(用的STC8H实验箱),第29课SPI读写FLASH的教程中有如图的页写PageProgram(指令0x02)程序段:

1. 我的疑问是,这里addr在实验中传的地址是0,根本就没有变,而这里 if(addr&0xff==0) 不是一下就满足了吗,也就跳出这段循环了,按我的理解只有SPI_WriteByte(buffr)写入了,后面的2、4、6、8、10等数组后5个数组元素都不应该写入,但实验确实证明写入成功了,又读出来了。这是怎么回事呢??
2. 另外,这句红线的 if 判断,我认为有问题,应该是 if((addr+i)&0xff==0),这样写满一页时就停止了。又看了下实验箱程序,虽然这一句和这里一样,但前一句是addr++,这就对了。另外,页写最大256字节,length和i用u8就够。
3. 我对上述地方进行了仿真,奇怪的是,仿真程序从来不会走到 if(addr&0xff==0) break; 这句,而其他的 if(length == 0) 之类的判断,都会停下来进行判断。开始我以为是addr没有变化,编译时优化掉了,但后来我改成 if((addr+i)&0xff==0),仿真竟然也不会走到这里,每次都是跳过这个判断,直接到while(length--)处。咋回事捏?

pursuing 发表于 2024-3-4 11:13:56

本帖最后由 pursuing 于 2024-3-5 19:56 编辑

网上看了看相关帖子,除了说打开魔术棒/output/Debug information,就是让降低优化级别,我降低到2,或用default,编译都没问题,但这里if的判断一句断点还是打不上。看来编译器还是会把if这一句优化掉,(addr+i)是不断增加的为何还会被优化,真是令人费解啊。
后来用了xdata的库,终于可以把优化级别降下来了。

最后原因也找到了,应该加(),优先级问题。

GGG_988 发表于 2024-3-6 10:00:57

从flash规的格书看一次最多可写256个字节。如果(addr&oxff==0)说明指针(地址)返回到了0x00,再写下去会覆盖掉前面写好的资料,所以要break退出。
以下是STC8程序包中的相同操作,可作参考




pursuing 发表于 2024-3-7 09:19:31

GGG_988 发表于 2024-3-6 10:00
从flash规的格书看一次最多可写256个字节。如果(addr&oxff==0)说明指针(地址)返回到了0x00,再写下去会覆 ...

谢谢,我不是问这几句的意思,而是当时疑惑为什么仿真到不了那一句,后来发现少了括号,问题已解决。
页: [1]
查看完整版本: 关于冲哥29课SPI读写W25X40CL页写程序的疑问