請教關(guān)于ch32v307 flash寫的問題

測試寫flash, 基于EVT里的程序改的, 在ch32v307vct6的開發(fā)板上測試正常.

改到我們自己的ch32v307wcu6的板子上運(yùn)行會報(bào)timeout, 但讀的話能看到值正常寫入了

請問可能是什么原因呢?

看一下是不是沒有解鎖flash ,標(biāo)準(zhǔn)編程調(diào)用FLASH_Unlock,快速編程需要調(diào)用?FLASH_Unlock_Fast。再看一下是不是操作flash的主頻超過了120M沒有降頻。后續(xù)有問題的話可以郵箱發(fā)程序測試一下zdg@wch.cn


程序是基于例程改的,如下:


void write_flash_data(uint16_t *data, int size)

{

? ? __disable_irq();


? ? FLASH_Unlock();


? ? FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_WRPRTERR);


? ? FLASHStatus = FLASH_ErasePage(FLASH_ADDR);



? ? if(FLASHStatus != FLASH_COMPLETE)

? ? {

? ? ? ? printf("FLASH Erase Fail\r\n");

? ? }

? ? printf("FLASH Erase Suc\r\n");


? ? printf("Programing...\r\n");

? ? for(int i=0; i

? ? ? ? FLASHStatus = FLASH_ProgramHalfWord(FLASH_ADDR + (2*i), data[i]);

? ? ? ? if(FLASHStatus != FLASH_COMPLETE) {

? ? ? ? ? ? printf("flash failed: 0x%08x, %d\r\n", FLASH_ADDR + (2*i), FLASHStatus);

? ? ? ? }

? ? }


? ? FLASH_Lock();


? ? __enable_irq();

}


下面是運(yùn)行的log,時(shí)鐘是96M,erase看著是成功的,但program會fail,返回status是5 timeout

實(shí)際都program的地址值都是對的,寫進(jìn)去了,不知道為啥返回status不對。


SystemClk:96000000????????????????????????????????????????????????????????????????????????????????????????
ChipID:30730518???????????????????????????????????????????????????????????????????????????????????????????
FLASH?Erase?Suc???????????????????????????????????????????????????????????????????????????????????????????
Programing...?????????????????????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070000,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070002,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070004,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070006,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070008,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x0807000a,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x0807000c,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x0807000e,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070010,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070012,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070014,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070016,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x08070018,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x0807001a,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x0807001c,?5???????????????????????????????????????????????????????????????????????????????
flash?failed:?0x0807001e,?5



#define PAGE_WRITE_START_ADDR? ? ? ? ? ? ((uint32_t)0x0800F000) /* Start from 60K */

#define PAGE_WRITE_END_ADDR? ? ? ? ? ? ? ((uint32_t)0x08010000) /* End at 63K */

#define FLASH_PAGE_SIZE? ? ? ? ? ? ? ? ? 4096

#define FLASH_PAGES_TO_BE_PROTECTED? ? ? FLASH_WRProt_Pages60to63



void Flash_Test(void)

{

? ? printf("FLASH Test\n");

? ? __disable_irq();

? ? FLASH_Unlock();


? ? FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_WRPRTERR);


? ? ? ? FLASHStatus = FLASH_ErasePage(PAGE_WRITE_START_ADDR); //Erase 4KB


? ? ? ? if(FLASHStatus != FLASH_COMPLETE)

? ? ? ? {

? ? ? ? ? ? printf("FLASH Erase Fail\r\n");

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? printf("FLASH Erase Suc\r\n");



? ? Address = PAGE_WRITE_START_ADDR;

? ? printf("Programing...\r\n");

? ? while((Address < PAGE_WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))

? ? {

? ? ? ? FLASHStatus = FLASH_ProgramHalfWord(Address, Data);

? ? ? ? Address = Address + 2;

? ? }


? ? Address = PAGE_WRITE_START_ADDR;


? ? printf("Program Cheking...\r\n");

? ? while((Address < PAGE_WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))

? ? {

? ? ? ? if((*(__IO uint16_t *)Address) != Data)

? ? ? ? {

? ? ? ? ? ? MemoryProgramStatus = FAILED;

? ? ? ? }

? ? ? ? Address += 2;

? ? }


? ? if(MemoryProgramStatus == FAILED)

? ? {

? ? ? ? printf("Memory Program FAIL!\r\n");

? ? }

? ? else

? ? {

? ? ? ? printf("Memory Program PASS!\r\n");

? ? }


? ? FLASH_Lock();

? ? __enable_irq();

}

你好 ,你的代碼貼的看不清,我貼了一份我測試過的程序,是沒問題的。檢查一下你的程序的地址是不是與代碼地址有重疊,后續(xù)有問題可以將你的程序通過郵箱發(fā)我。zdg@wch.cn


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

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