- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2024-05-02 21:48:56
高级会员
- 积分
- 614
|
在这里先感谢各位前辈在原帖的回帖,事情原委是这样(链接原帖): https://www.stcaimcu.com/forum.p ... amp;extra=#pid69680 ,因为附加其他验证代码和异常表现不稳定一直没有找到准确原因.
STC8H2K08U在ISP的范例程序把EEPROM基本操作代码复制到验证模块发现EEPROM连续读写一直出现最后一位数据读到了第一位,如下:
异常输出:
[10:15:41.630]发送:@
[10:15:41.643]接收:801234567 //最后一位数据(8)读到了第一位
[10:15:42.758]发送:@
[10:15:42.764]接收:801234567
[10:15:43.765]发送:@
[10:15:43.774]接收:801234567
EERROM循环写入外部代码:
Flash_Erase(0x0400);
for(i = 0 ; i < 9 ; i ++)
{
Flash_Program(0x0400 + i, i);
delay_ms(10); //加延时没有解决异常
}
理论输出:
[10:16:08.328]发送:@
[10:16:08.341]接收:012345678
[10:16:09.470]发送:@
[10:16:09.488]接收:012345678
[10:16:10.574]发送:@
[10:16:10.580]接收:012345678
然后前辈建议我试试加" _nop_(); " 延时,我开始没有理解正确位置把延时加在每次连续读取的外部,异常依旧,如下代码:
for(i = 0 ; i < 9 ; i ++)
{
Uart1_sendbyte(Flash_Read(0x0400 + i) + 0x30);
delay_ms(10); //加延时没有解决异常
}
一直在昨天论坛看到一位使用STC32的朋友也出现一样问题,帖子有提到_nop_()加到3个,我猛然想到是否函数内部延时不够,今天上班立即验证抓到了规律,"Flash_Read(int addr)" 函数内读IAP之前原一个延时增加到3个延时立即读写稳定.
char Flash_Read(int addr)
{
char dat;
EA = 0; //禁止中断
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); ------------------------------------------------------------ //在这里加延时异常跟着解除
_nop_();
_nop_();
_nop_();
_nop_();
dat = IAP_DATA; //读IAP数据
Flash_Idle(); //关闭IAP功能
EA = 1; //重新允许中断
return dat;
}
确定Flash_Read函数是问题关键,尝试加2个延时读写依旧会不稳定,最后为了稳定加了5个延时,顺便另两个Flash函数也在由原来的1个延时增加到3个延时,后来验证终于输出一直正常 .
最后感谢所有前辈,我原是模电专业后来模电开发实在难于维继才开始转MCU开发,这方面底子太薄我还是个小学生.谢谢!
|
|