请问,ch549f 如何把数组中的数据保存到dataflash中?

请问,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[i]=SN[i];

    }

    /* 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[i] = temp[i];

      printf("%02x ",(UINT16)temp[i]);

        if(temp[i]!=FlashBuf[i])

        {

            printf("Err Offset:%02x\n",i);

            while(1)

            {

                ;

            }

        }

    }

    printf("\n\n");

}


看代码中对FLASH操作的部分没什么问题,只要没有动flash函数内部的代码。

你说的代码不行,具体的是只代码无法正常运行下去,还是在read过程中出现了数据错误对不上的情况呢?


你好!完整代码如下,请看下问题出在哪里?保存不了sn:重新启动单片机后数组SN为空:

#include "..\Public\CH549.H"                                                   

#include "..\Public\Debug.H"

#include ".\FlashRom\FlashRom.H"  

#include "..\GPIO\GPIO.H"

#include "..\Timer\Timer.H"

#include "stdio.h"

#include //没有的话,malloc不能正常工作

#include

#include ".\USB\CompatibilityHID.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[i] = 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[i]=SN[i];

    }

    /* 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[i] = temp[i];

        if(temp[i]!=FlashBuf[i])

        {

            printf("Err Offset:%02x\n",i);

            while(1)

            {

                ;

            }

        }

    }

    printf("\n\n");

}



您好,发的代码不是很具有参考意义。您的描述中提到“重新启动单片机后数组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;

 

}

 

}

 }



snRead的初值和主循环的代码处理是否会导致上电就会执行一次flash的写入呢?

image.pngimage.png


主函数里面的 flashWrite()改为flashRead()还是原样,说明flash读写根本没起作用。断电后马上上电读取的sn只是存储到数组SN里面的值,可能是断电后立即上电,分配给数组SN的地址的数据还保持不变,所以还能读到。

if(snRead ==1){

 

 flashRead();

 

 snRead = 0;

 

 }



应该是读写dataflash没有作用


只有登录才能回复,可以选择微信账号登录