請問,ch549f 如何把數(shù)組中的數(shù)據(jù)保存到dataflash中?

請問,ch549f ?如何把數(shù)組中的數(shù)據(jù)保存到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 );//保存數(shù)據(jù)

}



?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函數(shù)內(nèi)部的代碼。

你說的代碼不行,具體的是只代碼無法正常運行下去,還是在read過程中出現(xiàn)了數(shù)據(jù)錯誤對不上的情況呢?


你好!完整代碼如下,請看下問題出在哪里?保存不了sn:重新啟動單片機后數(shù)組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字節(jié)對齊

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# 端點批量上傳---本句及以下三句禁止則不停給主機傳輸緩沖區(qū)待上傳數(shù)據(jù)

? ? ? ? ? ? UEP2_T_LEN = 0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //預使用發(fā)送長度一定要清空

// ? ? ? ? ? ?UEP1_CTRL ^= bUEP_T_TOG; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//如果不設(shè)置自動翻轉(zhuǎn)則需要手動翻轉(zhuǎn)

? ? ? ? ? ? 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 ) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不同步的數(shù)據(jù)包將丟棄

? ? ? ? ? ? {

? ? ? ? ? ? ? ? len = USB_RX_LEN; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //接收數(shù)據(jù)長度,數(shù)據(jù)從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); ?//修改主頻,建議稍加延時等待主頻穩(wěn)定

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 );//保存數(shù)據(jù)


}



?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");

}



您好,發(fā)的代碼不是很具有參考意義。您的描述中提到“重新啟動單片機后數(shù)組SN為空”,是否可以理解為,在單次上電中對flash寫入成功了,但是在下次上電后數(shù)據(jù)發(fā)現(xiàn)出現(xiàn)問題。出現(xiàn)數(shù)據(jù)錯誤的條件需要重新上下電?


直接運行我們例程代碼能否正常運行?當前配置的系統(tǒng)主頻是多少?


感謝關(guān)注!代碼中,我是先把sn序列號通過USB中斷賦給數(shù)組SN,然后再存儲到dataflash。現(xiàn)在的問題是,當USB賦完值后,再通過USB讀取數(shù)組SN時是可以正常讀取的;斷電后馬上再上電,也可以讀取數(shù)組SN中的sn序列號。但是,當斷電時間比較長之后,再上電,則讀取不到之前賦給數(shù)組SN的序列號。由此:第一個問題,dataflash是不是會被代碼和其他數(shù)據(jù)覆蓋掉?第二個問題,是不是根本就沒有把序列號存儲到dataflash中?謝謝!


上面代碼的主函數(shù)是:

?main()

{ ? ?

? ? ??

SystemInit();?

USBDeviceInit();?


INOUTinit();


while(1)

{

if(snSave ==1){

?

flashWrite();

?

snSave = 0;

?

}

?

if(snRead ==1){

?

flashWrite();

?

snRead = 0;

?

}

?

}

?}



snRead的初值和主循環(huán)的代碼處理是否會導致上電就會執(zhí)行一次flash的寫入呢?

image.pngimage.png


主函數(shù)里面的?flashWrite()改為flashRead()還是原樣,說明flash讀寫根本沒起作用。斷電后馬上上電讀取的sn只是存儲到數(shù)組SN里面的值,可能是斷電后立即上電,分配給數(shù)組SN的地址的數(shù)據(jù)還保持不變,所以還能讀到。

if(snRead ==1){

?

?flashRead();

?

?snRead = 0;

?

?}



應該是讀寫dataflash沒有作用


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频