本帖最后由 Alden 于 2024-8-30 16:33 编辑
#申请原创# #技术资源#
在测试芯片功能的时候会需要测试MCU的flash读写,但芯片的程序是在flash中运行,不方便对整个flash进行擦写。想到以前又试过做了个让程序运行在RAM中的工程,添加了flash擦写可以顺利对flash任意区域进行擦写测试。
将代码放在RAM中运行需要做这些修改。
主要就是将工程的目标地址都改在RAM的前面一部分区域,后面一部分还是正常的RAM使用,更改ini文件,让仿真时能够正确进入RAM。
main中进行flash擦写,擦写的区域可以从0x800000开始。
- #if defined (APM32F10X_HD)
- #define FLASH_PAGE_SIZE ((uint16_t)0x800)
- #else
- #define FLASH_PAGE_SIZE ((uint16_t)0x400)
- #endif
- #define BANK1_WRITE_START_ADDR ((uint32_t)0x08000000)
- #define BANK1_WRITE_END_ADDR ((uint32_t)0x0800C000)
- int main(void)
- {
- APM_EVAL_LEDInit(LED1);
- SysTick_Config(SystemCoreClock / 1000);
-
-
- FLASH_UnlockBank1();
-
- NbrOfPage = (BANK1_WRITE_END_ADDR - BANK1_WRITE_START_ADDR) / FLASH_PAGE_SIZE;
- FLASH_ClearFlag((FLASH_FLAG_T)(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR));
- for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
- {
- FLASHStatus = FLASH_ErasePage(BANK1_WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
- }
- Address = BANK1_WRITE_START_ADDR;
- while((Address < BANK1_WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
- {
- FLASHStatus = FLASH_ProgramWord(Address, Data);
- Address = Address + 4;
- }
- FLASH_LockBank1();
-
- Address = BANK1_WRITE_START_ADDR;
- while((Address < BANK1_WRITE_END_ADDR))
- {
- if((*(__IO uint32_t*) Address) != Data)
- {
- MemoryProgramStatus = FAILED;
- }
- Address += 4;
- }
- while(1)
- {
- APM_EVAL_LEDToggle(LED1);
-
- Delay();
- }
- }
配置好就可以烧录后在线仿真,可以看到汇编指针在RAM中正常运行。
APM32F10x_SDK_XB.zip
(3.49 MB, 下载次数: 4)
|