1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问,ch549f 如何把数组中的数据保存到dataflash中?我的代码不行,代码是修改官方代码而来。请大神看看哪里有问题,谢谢。
代码如下: void flashWrite() { UINT8 s,i; CfgFsys( ); //CH549时钟选择配置 mDelaymS(20); mInitSTDIO( ); //串口0初始化 printf("FlashRom demo start ...n"); for(i=0; i!=64; i++) { FlashBuf=SN; } /* 1、DataFlash 操作演示 */ memset(temp,0,64); s = FlashErasePage( 0xF000 ) ; //擦除DataFlash的第一页 s = FlashProgPage( 0xF000, FlashBuf,64 );//保存数据 } void flashRead() { UINT8 i,len; len = FlashReadBuf(0xF000,temp,64); for(i=0; i!=len; i++) { SN = temp; printf("%02x ",(UINT16)temp); if(temp!=FlashBuf) { printf("Err Offset:%02xn",i); while(1) { ; } } } printf("nn"); } |
|
相关推荐
8个回答
|
|
看代码中对FLASH操作的部分没什么问题,只要没有动flash函数内部的代码。
你说的代码不行,具体的是只代码无法正常运行下去,还是在read过程中出现了数据错误对不上的情况呢? |
|
|
|
你好!完整代码如下,请看下问题出在哪里?保存不了sn:重新启动单片机后数组SN为空:
#include "..PublicCH549.H" #include "..PublicDebug.H" #include ".FlashRomFlashRom.H" #include "..GPIOGPIO.H" #include "..TimerTimer.H" #include "stdio.h" #include //没有的话,malloc不能正常工作 #include #include ".USBCompatibilityHID.H" /*Flsh*/ UINT8X FlashBuf[64] _at_ 0x0000; //对应于Flash页写的一个页,需要64字节对齐 UINT8X temp[64]; UINT8 snSave=0,snRead =1; UINT8X SN[64]; //USB中断服务程序 void DeviceInterrupt( void ) interrupt INT_NO_USB using 2 //USB中断服务程序,使用寄存器组1 { UINT8 i; UINT16 len; if(UIF_TRANSFER) //USB传输完成标志 { switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) { case UIS_TOKEN_IN | 2: //endpoint 2# 端点批量上传---本句及以下三句禁止则不停给主机传输缓冲区待上传数据 UEP2_T_LEN = 0; //预使用发送长度一定要清空 // UEP1_CTRL ^= bUEP_T_TOG; //如果不设置自动翻转则需要手动翻转 Endp2Busy = 0 ; UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK; //默认应答NAK break; case UIS_TOKEN_OUT | 2: //endpoint 2# 端点批量下传 if ( U_TOG_OK ) // 不同步的数据包将丢弃 { len = USB_RX_LEN; //接收数据长度,数据从Ep2Buffer首地址开始存放 for ( i = 0; i < len; ) { //上位机写入SN if(Ep2Buffer[0]=='n'){ SN = Ep2Buffer[i+1]; if(i==len-1){ Ep2Buffer[MAX_PACKET_SIZE] = 'N'; // sn完成写入返回符号W上传到到IN反馈给计算机 snSave = 1;//开启SN保存命令 } i++; } } UEP2_T_LEN = len; UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; // 允许上传---禁止则不上传 } break; case UIS_TOKEN_SETUP | 0: //SETUP事务 //usb官方默认代码省略 ........ } void SystemInit(void) { CfgFsys(); //CH554时钟选择配置 mDelaymS(5); //修改主频,建议稍加延时等待主频稳定 mInitSTDIO(); INOUTinit(); //串口初始化 MCU_T0_INT(); //定时器0 snRead = 1; } void flashWrite() { UINT8 s,i; for(i=0; i!=64; i++) { FlashBuf=SN; } /* 1、DataFlash 操作演示 */ memset(temp,0,64); s = FlashErasePage( 0xF000 ) ; //擦除DataFlash的第一页 s = FlashProgPage( 0xF000, FlashBuf,64 );//保存数据 } void flashRead() { UINT8 i,len; len = FlashReadBuf(0xF000,temp,64); for(i=0; i!=len; i++) { SN = temp; if(temp!=FlashBuf) { printf("Err Offset:%02xn",i); while(1) { ; } } } printf("nn"); } |
|
|
|
您好,发的代码不是很具有参考意义。您的描述中提到“重新启动单片机后数组SN为空”,是否可以理解为,在单次上电中对flash写入成功了,但是在下次上电后数据发现出现问题。出现数据错误的条件需要重新上下电?
直接运行我们例程代码能否正常运行?当前配置的系统主频是多少? |
|
|
|
感谢关注!代码中,我是先把sn序列号通过USB中断赋给数组SN,然后再存储到dataflash。现在的问题是,当USB赋完值后,再通过USB读取数组SN时是可以正常读取的;断电后马上再上电,也可以读取数组SN中的sn序列号。但是,当断电时间比较长之后,再上电,则读取不到之前赋给数组SN的序列号。由此:第一个问题,dataflash是不是会被代码和其他数据覆盖掉?第二个问题,是不是根本就没有把序列号存储到dataflash中?谢谢!
|
|
|
|
上面代码的主函数是:
main() { SystemInit(); USBDeviceInit(); INOUTinit(); while(1) { if(snSave ==1){ flashWrite(); snSave = 0; } if(snRead ==1){ flashWrite(); snRead = 0; } } } |
|
|
|
|
|
|
|
主函数里面的 flashWrite()改为flashRead()还是原样,说明flash读写根本没起作用。断电后马上上电读取的sn只是存储到数组SN里面的值,可能是断电后立即上电,分配给数组SN的地址的数据还保持不变,所以还能读到。
if(snRead ==1){ flashRead(); snRead = 0; } |
|
|
|
应该是读写dataflash没有作用
|
|
|
|
只有小组成员才能发言,加入小组>>
522 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2903 浏览 2 评论
2399 浏览 1 评论
867浏览 2评论
687浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
417浏览 1评论
522浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
812浏览 1评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 02:39 , Processed in 1.353679 second(s), Total 90, Slave 74 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号