- 全局测试变量定义
static uint32_t ui32Source[512];
- flash读写起始地址定义
#define AM_HAL_FLASH_INSTANCE_SIZE ( 512 * 1024 )
#define AM_HAL_FLASH_PAGE_SIZE ( 8 * 1024 )
//! Arbitrary page address in flash instance 1.
#define ARB_PAGE_ADDRESS (AM_HAL_FLASH_INSTANCE_SIZE + (2 * AM_HAL_FLASH_PAGE_SIZE))
- 主函数中测试flash操作功能
//*****************************************************************************
//
// Main
//
//*****************************************************************************
int main(void)
{
am_util_id_t sIdDevice;
uint32_t ui32StrBuf;
//
// Set the clock frequency.
//
am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 0);
//
// Set the default cache configuration
//
am_hal_cachectrl_config(&am_hal_cachectrl_defaults);
am_hal_cachectrl_enable();
//
// Configure the board for low power operation.
//
am_bsp_low_power_init();
//
// Initialize the printf interface for ITM output
//
am_bsp_itm_printf_enable();
//
// Print the banner.
//
am_util_stdio_terminal_clear();
am_util_stdio_printf("Hello World!\n\n");
//
// Print the device info.
//
am_util_id_device(&sIdDevice);
am_util_stdio_printf("Vendor Name: %s\n", sIdDevice.pui8VendorName);
am_util_stdio_printf("Device type: %s\n", sIdDevice.pui8DeviceName);
am_util_stdio_printf("Qualified: %s\n",
sIdDevice.sMcuCtrlDevice.ui32Qualified ?
"Yes" : "No");
am_util_stdio_printf("Device Info:\n"
"\tPart number: 0x%08X\n"
"\tChip ID0: 0x%08X\n"
"\tChip ID1: 0x%08X\n"
"\tRevision: 0x%08X (Rev%c%c)\n",
sIdDevice.sMcuCtrlDevice.ui32ChipPN,
sIdDevice.sMcuCtrlDevice.ui32ChipID0,
sIdDevice.sMcuCtrlDevice.ui32ChipID1,
sIdDevice.sMcuCtrlDevice.ui32ChipRev,
sIdDevice.ui8ChipRevMaj, sIdDevice.ui8ChipRevMin );
//
// If not a multiple of 1024 bytes, append a plus sign to the KB.
//
ui32StrBuf = ( sIdDevice.sMcuCtrlDevice.ui32FlashSize % 1024 ) ? '+' : 0;
am_util_stdio_printf("\tFlash size: %7d (%d KB%s)\n",
sIdDevice.sMcuCtrlDevice.ui32FlashSize,
sIdDevice.sMcuCtrlDevice.ui32FlashSize / 1024,
&ui32StrBuf);
ui32StrBuf = ( sIdDevice.sMcuCtrlDevice.ui32SRAMSize % 1024 ) ? '+' : 0;
am_util_stdio_printf("\tSRAM size: %7d (%d KB%s)\n\n",
sIdDevice.sMcuCtrlDevice.ui32SRAMSize,
sIdDevice.sMcuCtrlDevice.ui32SRAMSize / 1024,
&ui32StrBuf);
//
// Print the compiler version.
//
am_util_stdio_printf("App Compiler: %s\n", COMPILER_VERSION);
#if defined(AM_PART_APOLLO3) || defined(AM_PART_APOLLO3P)
am_util_stdio_printf("HAL Compiler: %s\n", g_ui8HALcompiler);
am_util_stdio_printf("HAL SDK version: %d.%d.%d\n",
g_ui32HALversion.s.Major,
g_ui32HALversion.s.Minor,
g_ui32HALversion.s.Revision);
am_util_stdio_printf("HAL compiled with %s-style registers\n",
g_ui32HALversion.s.bAMREGS ? "AM_REG" : "CMSIS");
am_hal_security_info_t secInfo;
char sINFO[32];
uint32_t ui32Status;
ui32Status = am_hal_security_get_info(&secInfo);
if (ui32Status == AM_HAL_STATUS_SUCCESS)
{
if ( secInfo.bInfo0Valid )
{
am_util_stdio_sprintf(sINFO, "INFO0 valid, ver 0x%X", secInfo.info0Version);
}
else
{
am_util_stdio_sprintf(sINFO, "INFO0 invalid");
}
am_util_stdio_printf("SBL ver: 0x%x - 0x%x, %s\n",
secInfo.sblVersion, secInfo.sblVersionAddInfo, sINFO);
}
else
{
am_util_stdio_printf("am_hal_security_get_info failed 0x%X\n", ui32Status);
}
#endif // AM_PART_APOLLO3
//
// We are done printing.
// Disable debug printf messages on ITM.
//
// am_bsp_debug_printf_disable();
int32_t i32ReturnCode;
int32_t i32ErrorFlag = 0;
uint32_t *pui32Src;
uint32_t *pui32Dst;
int32_t ix;
uint32_t ui32PrgmAddr;
//
// Select an arbitrary page address in flash instance 1.
// 260KB = 0x41000.
//
ui32PrgmAddr = ARB_PAGE_ADDRESS;
//
// Erase the whole block of FLASH instance 1.
//
am_util_stdio_printf(" ... erasing all of flash instance %d.\n", AM_HAL_FLASH_ADDR2INST(ui32PrgmAddr) );
i32ReturnCode = am_hal_flash_mass_erase(AM_HAL_FLASH_PROGRAM_KEY, 1);
//
// Check for an error from the HAL.
//
if (i32ReturnCode)
{
am_util_stdio_printf("FLASH_MASS_ERASE i32ReturnCode = 0x%x.\n",
i32ReturnCode);
i32ErrorFlag++;
}
//
// Setup a pattern to write to the FLASH.
//
am_util_stdio_printf(" ... programming flash instance %d, page %d.\n",
AM_HAL_FLASH_ADDR2INST(ui32PrgmAddr),
AM_HAL_FLASH_ADDR2PAGE(ui32PrgmAddr) );
pui32Src = ui32Source;
for (ix = 0x100; ix < (0x100 + (512 * 4)); ix += 4)
{
*pui32Src++ = ix;
}
//
// Program a few words in a page in the main block of instance 1.
//
pui32Dst = (uint32_t *) ui32PrgmAddr;
i32ReturnCode = am_hal_flash_program_main(AM_HAL_FLASH_PROGRAM_KEY,
ui32Source,
pui32Dst,
512);
//
// Check for an error from the HAL.
//
if (i32ReturnCode)
{
am_util_stdio_printf("FLASH program page at 0x%08x "
"i32ReturnCode = 0x%x.\n",
ui32PrgmAddr,
i32ReturnCode);
i32ErrorFlag++;
}
//
// Check the page just programmed.
//
am_util_stdio_printf(" ... verifying the page just programmed.\n");
for ( ix = 0; ix < 512; ix++ )
{
if ( *(uint32_t*)(ui32PrgmAddr + (ix*4)) != ui32Source[ix] )
{
am_util_stdio_printf("ERROR: flash address 0x%08x did not program properly:\n"
" Expected value = 0x%08x, programmed value = 0x%08x.\n",
ui32PrgmAddr + (ix * 4),
ui32Source[ix],
*(uint32_t*)(ui32PrgmAddr + (ix * 4)) );
}
am_util_stdio_printf("%x\n",*(uint32_t*)(ui32PrgmAddr + (ix*4)));
}
//
// Reprogram the last word to zero.
//
pui32Dst = ((uint32_t *)ui32PrgmAddr) +
sizeof(ui32Source) / sizeof(ui32Source[0]) - 1;
i32ReturnCode = am_hal_flash_clear_bits(AM_HAL_FLASH_PROGRAM_KEY,
pui32Dst,
~0L);
//
// Check for an error from the HAL.
//
if (i32ReturnCode)
{
am_util_stdio_printf("FLASH reprogram page at 0x%08x "
"i32ReturnCode = 0x%x.\n",
pui32Dst,
i32ReturnCode);
i32ErrorFlag++;
}
//
// Check the byte just programmed.
//
am_util_stdio_printf(" ... verifying the word just reprogrammed.\n");
if ( *pui32Dst != 0 )
{
am_util_stdio_printf("ERROR: flash address 0x%08x did not program properly:\n"
" Expected value = 0x%08x, programmed value = 0x%08x.\n",
pui32Dst,
0,
*pui32Dst );
}
//
// Erase the page just programmed.
//
am_util_stdio_printf(" ... erasing the page just programmed.\n");
i32ReturnCode = am_hal_flash_page_erase(AM_HAL_FLASH_PROGRAM_KEY,
AM_HAL_FLASH_ADDR2INST(ui32PrgmAddr),
AM_HAL_FLASH_ADDR2PAGE(ui32PrgmAddr) );
//
// Check for an error from the HAL.
//
if (i32ReturnCode)
{
am_util_stdio_printf(" FLASH erase page at 0x%08x "
"i32ReturnCode = 0x%x.\n",
ARB_PAGE_ADDRESS, i32ReturnCode);
i32ErrorFlag++;
}
//
// Check that the entire page is erased.
//
am_util_stdio_printf(" ... verifying the page just erased.\n");
for ( ix = 0; ix < 512; ix++ )
{
if ( *(uint32_t*)(ui32PrgmAddr + (ix*4)) != 0xFFFFFFFF )
{
am_util_stdio_printf("ERROR: flash address 0x%08x did not ERASE properly:\n"
" Expected value = 0xFFFFFFFF, programmed value = 0x%08x.\n",
ui32PrgmAddr + (ix*4),
*(uint32_t*)(ui32PrgmAddr + (ix * 4)) );
}
}
//
// Report success or any failures and exit.
//
if (i32ErrorFlag)
{
am_util_stdio_printf("ERROR: FLASH Write example failure %d\n",
i32ErrorFlag);
}
else
{
am_util_stdio_printf("FLASH Write example successful \n");
}
//
// Verify that ITM is done printing
//
am_hal_itm_not_busy();
//
while (1)
{
// Go to Deep Sleep.
//
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
}
}