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

[复制链接]
1286|5
 楼主| mintspring 发表于 2019-1-20 22:58 | 显示全部楼层 |阅读模式
  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/05/12 1:46p $
  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 "NUC200Series.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_Msk | SYS_GPB_MFP_PB1_Msk);
  44.     SYS->GPB_MFP |= SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

  45. }

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


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

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

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

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

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

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

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

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

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

  73.     return 0;
  74. }


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

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


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

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


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

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

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

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

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

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

  125.         FMC_Erase(u32Addr);

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


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

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

  141.     SYS_Init();
  142.     UART_Init();

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

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

  150.     //SYS_UnlockReg();

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

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

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

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

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

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

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

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

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

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

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

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

  210. lexit:

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

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

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

  216.     while(1);
  217. }

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


 楼主| mintspring 发表于 2019-1-20 22:59 | 显示全部楼层
想掉电保存数据,必须这么搞。
zhuotuzi 发表于 2019-1-20 23:13 | 显示全部楼层
操作闪存的方式。
wanduzi 发表于 2019-1-20 23:15 | 显示全部楼层
跟其他系列的框架类似。
antusheng 发表于 2019-1-20 23:17 | 显示全部楼层
掌握好配置方式和库函数意思。
huangcunxiake 发表于 2019-1-21 14:28 | 显示全部楼层
主要是要了解这个结构和配置方式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

303

主题

4972

帖子

24

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