[技术问答] M451的flash当作eeprom来使用的erase,write等操作有例程吗?

[复制链接]
 楼主| newiot 发表于 2018-12-27 16:17 | 显示全部楼层 |阅读模式
M451的flash当作eeprom来使用的erase,write等操作有例程吗?
wanduzi 发表于 2018-12-27 20:17 | 显示全部楼层
  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 7 $
  5. * $Date: 15/09/02 10:04a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Show how to read/program embedded flash by ISP function.
  7. * @note
  8. * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved.
  9. *****************************************************************************/
  10. #include <stdio.h>
  11. #include "M451Series.h"

  12. #define PLLCTL_SETTING      CLK_PLLCTL_72MHz_HXT
  13. #define PLL_CLOCK           72000000

  14. #define APROM_TEST_BASE             0x3000
  15. #define DATA_FLASH_TEST_BASE        0x5000
  16. #define DATA_FLASH_TEST_END         0x12000

  17. #define TEST_PATTERN                0x5A5A5A5A



  18. void SYS_Init(void)
  19. {
  20.     /*---------------------------------------------------------------------------------------------------------*/
  21.     /* Init System Clock                                                                                       */
  22.     /*---------------------------------------------------------------------------------------------------------*/

  23.     /* Enable HIRC clock (Internal RC 22.1184MHz) */
  24.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  25.     /* Wait for HIRC clock ready */
  26.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  27.     /* Select HCLK clock source as HIRC and and HCLK source divider as 1 */
  28.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  29.     /* Set PLL to Power-down mode and PLLSTB bit in CLK_STATUS register will be cleared by hardware.*/
  30.     CLK_DisablePLL();

  31.     /* Enable HXT clock (external XTAL 12MHz) */
  32.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

  33.     /* Wait for HXT clock ready */
  34.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

  35.     /* Set core clock as PLL_CLOCK from PLL */
  36.     CLK_SetCoreClock(PLL_CLOCK);

  37.     /* Enable UART module clock */
  38.     CLK_EnableModuleClock(UART0_MODULE);

  39.     /* Select UART module clock source as HXT and UART module clock divider as 1 */
  40.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

  41.     /*---------------------------------------------------------------------------------------------------------*/
  42.     /* Init I/O Multi-function                                                                                 */
  43.     /*---------------------------------------------------------------------------------------------------------*/

  44.     /* Set PD multi-function pins for UART0 RXD and TXD */
  45.     SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
  46.     SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);

  47. }

  48. void UART_Init()
  49. {
  50.     /*---------------------------------------------------------------------------------------------------------*/
  51.     /* Init UART                                                                                               */
  52.     /*---------------------------------------------------------------------------------------------------------*/
  53.     UART_Open(UART0, 115200);
  54. }


  55. static int  SetDataFlashBase(uint32_t u32DFBA)
  56. {
  57.     uint32_t au32Config[2];

  58.     /* Read current User Configuration */
  59.     FMC_ReadConfig(au32Config, 1);

  60.     /* Just return when Data Flash has been enabled */
  61.     if(!(au32Config[0] & 0x1))
  62.         return 0;

  63.     /* Enable User Configuration Update */
  64.     FMC_EnableConfigUpdate();

  65.     /* Erase User Configuration */
  66.     FMC_Erase(FMC_CONFIG_BASE);

  67.     /* Write User Configuration to Enable Data Flash */
  68.     au32Config[0] &= ~0x1;
  69.     au32Config[1] = u32DFBA;

  70.     if(FMC_WriteConfig(au32Config, 2))
  71.         return -1;

  72.     printf("\nSet Data Flash base as 0x%x.\n", FMC_ReadDataFlashBaseAddr());

  73.     /* Perform chip reset to make new User Config take effect */
  74.     SYS->IPRST0 |= SYS_IPRST0_CHIPRST_Msk;

  75.     return 0;
  76. }


  77. int32_t FillDataPattern(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  78. {
  79.     uint32_t u32Addr;

  80.     for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
  81.     {
  82.         FMC_Write(u32Addr, u32Pattern);
  83.     }
  84.     return 0;
  85. }


  86. int32_t  VerifyData(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  87. {
  88.     uint32_t    u32Addr;
  89.     uint32_t    u32Data;

  90.     for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
  91.     {
  92.         u32Data = FMC_Read(u32Addr);
  93.         if(u32Data != u32Pattern)
  94.         {
  95.             printf("\nFMC_Read data verify failed at address 0x%x, read=0x%x, expect=0x%x\n", u32Addr, u32Data, u32Pattern);
  96.             return -1;
  97.         }
  98.     }
  99.     return 0;
  100. }


  101. int32_t  FlashTest(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  102. {
  103.     uint32_t    u32Addr;

  104.     for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += FMC_FLASH_PAGE_SIZE)
  105.     {
  106.         printf("    Flash test address: 0x%x    \r", u32Addr);

  107.         // Erase page
  108.         FMC_Erase(u32Addr);

  109.         // Verify if page contents are all 0xFFFFFFFF
  110.         if(VerifyData(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, 0xFFFFFFFF) < 0)
  111.         {
  112.             printf("\nPage 0x%x erase verify failed!\n", u32Addr);
  113.             return -1;
  114.         }

  115.         // Write test pattern to fill the whole page
  116.         if(FillDataPattern(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, u32Pattern) < 0)
  117.         {
  118.             printf("Failed to write page 0x%x!\n", u32Addr);
  119.             return -1;
  120.         }

  121.         // Verify if page contents are all equal to test pattern
  122.         if(VerifyData(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, u32Pattern) < 0)
  123.         {
  124.             printf("\nData verify failed!\n ");
  125.             return -1;
  126.         }

  127.         FMC_Erase(u32Addr);

  128.         // Verify if page contents are all 0xFFFFFFFF
  129.         if(VerifyData(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, 0xFFFFFFFF) < 0)
  130.         {
  131.             printf("\nPage 0x%x erase verify failed!\n", u32Addr);
  132.             return -1;
  133.         }
  134.     }
  135.     printf("\r    Flash Test Passed.          \n");
  136.     return 0;
  137. }


  138. int main()
  139. {
  140.     uint32_t i, u32Data;

  141.     /* Unlock protected registers */
  142.     SYS_UnlockReg();

  143.     SYS_Init();
  144.     UART_Init();

  145.     /*
  146.         This sample code is used to show how to use StdDriver API to implement ISP functions.
  147.     */

  148.     printf("\n\n");
  149.     printf("+----------------------------------------+\n");
  150.     printf("|          M451 FMC Sample Code          |\n");
  151.     printf("+----------------------------------------+\n");

  152.     //SYS_UnlockReg();

  153.     /* Enable FMC ISP function */
  154.     FMC_Open();

  155.     if(SetDataFlashBase(DATA_FLASH_TEST_BASE) < 0)
  156.     {
  157.         printf("Failed to set Data Flash base address!\n");
  158.         goto lexit;
  159.     }

  160.     /* Read BS */
  161.     printf("  Boot Mode ............................. ");
  162.     if(FMC_GetBootSource() == 0)
  163.         printf("[APROM]\n");
  164.     else
  165.     {
  166.         printf("[LDROM]\n");
  167.         printf("  WARNING: The driver sample code must execute in AP mode!\n");
  168.         goto lexit;
  169.     }

  170.     u32Data = FMC_ReadCID();
  171.     printf("  Company ID ............................ [0x%08x]\n", u32Data);

  172.     u32Data = FMC_ReadPID();
  173.     printf("  Product ID ............................ [0x%08x]\n", u32Data);

  174.     for(i = 0; i < 3; i++)
  175.     {
  176.         u32Data = FMC_ReadUID(i);
  177.         printf("  Unique ID %d ........................... [0x%08x]\n", i, u32Data);
  178.     }

  179.     for(i = 0; i < 4; i++)
  180.     {
  181.         u32Data = FMC_ReadUCID(i);
  182.         printf("  Unique Customer ID %d .................. [0x%08x]\n", i, u32Data);
  183.     }

  184.     /* Read User Configuration */
  185.     printf("  User Config 0 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE));
  186.     printf("  User Config 1 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE + 4));

  187.     /* Read Data Flash base address */
  188.     u32Data = FMC_ReadDataFlashBaseAddr();
  189.     printf("  Data Flash Base Address ............... [0x%08x]\n", u32Data);

  190.     printf("\n\nLDROM test =>\n");
  191.     FMC_EnableLDUpdate();
  192.     if(FlashTest(FMC_LDROM_BASE, FMC_LDROM_BASE + FMC_LDROM_SIZE, TEST_PATTERN) < 0)
  193.     {
  194.         printf("\n\nLDROM test failed!\n");
  195.         goto lexit;
  196.     }
  197.     FMC_DisableLDUpdate();

  198.     printf("\n\nAPROM test =>\n");
  199.     FMC_EnableAPUpdate();
  200.     if(FlashTest(APROM_TEST_BASE, DATA_FLASH_TEST_BASE, TEST_PATTERN) < 0)
  201.     {
  202.         printf("\n\nAPROM test failed!\n");
  203.         goto lexit;
  204.     }
  205.     FMC_DisableAPUpdate();

  206.     printf("\n\nData Flash test =>\n");
  207.     if(FlashTest(DATA_FLASH_TEST_BASE, DATA_FLASH_TEST_END, TEST_PATTERN) < 0)
  208.     {
  209.         printf("\n\nUHB test failed!\n");
  210.         goto lexit;
  211.     }

  212. lexit:

  213.     /* Disable FMC ISP function */
  214.     FMC_Close();

  215.     /* Lock protected registers */
  216.     SYS_LockReg();

  217.     printf("\nFMC Sample Code Completed.\n");

  218.     while(1);
  219. }

  220. /*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/
caoqing 发表于 2018-12-27 22:15 来自手机 | 显示全部楼层
官方例程有啊。
幸福小强 发表于 2018-12-27 22:24 | 显示全部楼层
下载BSP开发包里面有好多关于FMC的例子,就是这个。
598330983 发表于 2018-12-28 14:52 | 显示全部楼层
是上面那个FMC吗
598330983 发表于 2018-12-28 14:52 | 显示全部楼层
是上面那个FMC吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

80

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部