[DemoCode下载] NUC100的FMC读写操作

[复制链接]
 楼主| 稳稳の幸福 发表于 2021-9-22 23:03 | 显示全部楼层 |阅读模式
  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: 2 $
  5. * $Date: 15/05/12 1:49p $
  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 Nuvoton Technology Corp. All rights reserved.
  9. *****************************************************************************/
  10. #include <stdio.h>
  11. #include "NUC100Series.h"

  12. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  13. #define PLL_CLOCK           50000000


  14. #define APROM_TEST_BASE             0x3000
  15. #define DATA_FLASH_TEST_BASE        0xF000
  16. #define DATA_FLASH_TEST_END         0x10000
  17. #define TEST_PATTERN                0x5A5A5A5A



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

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

  25.     /* Waiting for Internal RC clock ready */
  26.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  27.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  28.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  29.     /* Enable external XTAL 12MHz clock */
  30.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  31.     /* Waiting for external XTAL clock ready */
  32.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  33.     /* Set core clock as PLL_CLOCK from PLL */
  34.     CLK_SetCoreClock(PLL_CLOCK);

  35.     /* Enable UART module clock */
  36.     CLK_EnableModuleClock(UART0_MODULE);

  37.     /* Select UART module clock source */
  38.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));


  39.     /*---------------------------------------------------------------------------------------------------------*/
  40.     /* Init I/O Multi-function                                                                                 */
  41.     /*---------------------------------------------------------------------------------------------------------*/

  42.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  43.     SYS->GPB_MFP = SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

  44. }

  45. void UART_Init()
  46. {
  47.     /*---------------------------------------------------------------------------------------------------------*/
  48.     /* Init UART                                                                                               */
  49.     /*---------------------------------------------------------------------------------------------------------*/
  50.     UART_Open(UART0, 115200);
  51. }


  52. static int  SetDataFlashBase(uint32_t u32DFBA)
  53. {
  54.     uint32_t au32Config[2];

  55.     /* Read current User Configuration */
  56.     FMC_ReadConfig(au32Config, 1);

  57.     /* Just return when Data Flash has been enabled */
  58.     if(!(au32Config[0] & 0x1))
  59.         return 0;

  60.     /* Enable User Configuration Update */
  61.     FMC_EnableConfigUpdate();

  62.     /* Erase User Configuration */
  63.     FMC_Erase(FMC_CONFIG_BASE);

  64.     /* Write User Configuration to Enable Data Flash */
  65.     au32Config[0] &= ~0x1;
  66.     au32Config[1] = u32DFBA;

  67.     if(FMC_WriteConfig(au32Config, 2))
  68.         return -1;

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

  70.     /* Perform chip reset to make new User Config take effect */
  71.     SYS->IPRSTC1 |= SYS_IPRSTC1_CHIP_RST_Msk;

  72.     return 0;
  73. }


  74. int32_t FillDataPattern(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  75. {
  76.     uint32_t u32Addr;

  77.     for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
  78.     {
  79.         FMC_Write(u32Addr, u32Pattern);
  80.     }
  81.     return 0;
  82. }


  83. int32_t  VerifyData(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  84. {
  85.     uint32_t    u32Addr;
  86.     uint32_t    u32Data;

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


  98. int32_t  FlashTest(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  99. {
  100.     uint32_t    u32Addr;

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

  104.         // Erase page
  105.         FMC_Erase(u32Addr);

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

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

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

  124.         FMC_Erase(u32Addr);

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


  135. int main()
  136. {
  137.     uint32_t i, u32Data;

  138.     /* Unlock protected registers */
  139.     SYS_UnlockReg();

  140.     SYS_Init();
  141.     UART_Init();

  142.     /*
  143.         This sample code is used to show how to use StdDriver API to implement ISP functions.
  144.     */

  145.     printf("\n\n");
  146.     printf("+----------------------------------------+\n");
  147.     printf("|          NUC100 FMC Sample Code        |\n");
  148.     printf("+----------------------------------------+\n");

  149.     //SYS_UnlockReg();

  150.     /* Enable FMC ISP function */
  151.     FMC_Open();

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

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

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

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

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

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

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

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

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

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

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

  209. lexit:

  210.     /* Disable FMC ISP function */
  211.     FMC_Close();

  212.     /* Lock protected registers */
  213.     SYS_LockReg();

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

  215.     while(1);
  216. }

  217. /*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/


 楼主| 稳稳の幸福 发表于 2021-9-22 23:05 | 显示全部楼层
这个应该是可以替代EEPROM的,可以开辟一段空间用于掉电存储。
wakayi 发表于 2021-10-14 17:15 | 显示全部楼层
这个接口适合外接什么设备呢
labasi 发表于 2021-10-14 17:17 | 显示全部楼层
这个接口有时钟引脚吗
paotangsan 发表于 2021-10-14 17:17 | 显示全部楼层
大概能匀出来多少内存啊
renzheshengui 发表于 2021-10-14 17:19 | 显示全部楼层
这个是存储模块吗
wowu 发表于 2021-10-14 17:20 | 显示全部楼层
读写速度快吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

203

主题

3409

帖子

8

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