本帖最后由 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)
|