測試寫flash, 基于EVT里的程序改的, 在ch32v307vct6的開發(fā)板上測試正常.
改到我們自己的ch32v307wcu6的板子上運(yùn)行會報(bào)timeout, 但讀的話能看到值正常寫入了
請問可能是什么原因呢?
測試寫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