?用你家開發(fā)的一款產(chǎn)品 現(xiàn)在要配置掉電不丟失 這個(gè)內(nèi)部flash那塊是可以我自己用的 然后又讀寫的例程參考嗎??
ch32v203F6B6
0x0800000開始的CODE FALSH掉電不丟失,把數(shù)據(jù)放在程序后面就行,我們的EVT例程有操作FLASH的
void Flash_Test(void) {
? ? printf("FLASH Test\n");
? ? /*When the main frequency exceeds 100MHz, attention should be paid when
? ? ?*operating FLASH: dividing HCLK by two will result in the related peripheral
? ? ?*clock of HCLK being divided by two. Attention should be paid when using.
? ? ?*/
? ? RCC->CFGR0 |= (uint32_t) RCC_HPRE_DIV2; //將系統(tǒng)時(shí)鐘的主頻分頻為2
? ? __disable_irq();
? ? USART_Printf_Init(115200);
? ? FLASH_Unlock();
? ? NbrOfPage = (PAGE_WRITE_END_ADDR - PAGE_WRITE_START_ADDR) / FLASH_PAGE_SIZE;
? ? FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_WRPRTERR); //用于清除閃存操作標(biāo)志位
? ? for (EraseCounter = 0;
? ? ? ? ? ? (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE);
? ? ? ? ? ? EraseCounter++) {
? ? ? ? FLASHStatus = FLASH_ErasePage(
? ? ? ? ? ? ? ? PAGE_WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter)); //Erase 4KB
? ? ? ? if (FLASHStatus != FLASH_COMPLETE) {
? ? ? ? ? ? printf("FLASH Erase Fail\r\n");
? ? ? ? }
? ? ? ? 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_ProgramOptionByteData(Address, Data);
? ? ? ? Address = Address + 1;
? ? ? ? printf("Programing...\r\n");
? ? }
? ? Address = PAGE_WRITE_START_ADDR;
? ? printf("Program Cheking...\r\n");
? ? while((Address < PAGE_WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))
? ? {
? ? ? ? if((*(__IO uint8_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();
? ? RCC->CFGR0 &= ~(uint32_t) RCC_HPRE_DIV2;
? ? __enable_irq();
? ? USART_Printf_Init(115200);
? ? printf("%08x \r\n", *(u32*) (FAST_FLASH_PROGRAM_START_ADDR));
}
例程是半字的寫 我改成一字節(jié)寫入 修改了寫的數(shù)據(jù)類型為uint8? 寫入函數(shù)? ?還要改別的嗎這是修改完的 但是提示寫入失敗? 幫忙看一下謝謝啦
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);你那個(gè)是編程用戶字的函數(shù),地址是固定的,請(qǐng)?zhí)鎿Q這個(gè)函數(shù)試一下
不能存uint8的數(shù)據(jù)嗎
不支持單個(gè)字節(jié)編程,但是可以把數(shù)據(jù)強(qiáng)制轉(zhuǎn)換再寫進(jìn)去,要是數(shù)組的話,把數(shù)組類型強(qiáng)制轉(zhuǎn)換一下就行。根據(jù)使用半字或者字編程轉(zhuǎn)換
明白謝謝