[DemoCode下载] M051读取UID的方法

[复制链接]
1112|11
 楼主| 643757107 发表于 2017-11-21 11:17 | 显示全部楼层 |阅读模式
ui, TE, AD, DDR
  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: 10 $
  5. * $Date: 15/05/22 5:13p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    FMC erase/program/read sample program for M051 series MCU
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "M051Series.h"

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


  15. #define APROM_TEST_BASE             0x3000
  16. #define APROM_TEST_END              0x10000
  17. #define DATA_FLASH_TEST_BASE        (FMC->DFBADR)
  18. #define DATA_FLASH_TEST_END         (FMC->DFBADR + 0x1000)
  19. #define TEST_PATTERN                0x5A5A5A5A



  20. void SYS_Init(void)
  21. {
  22.     /*---------------------------------------------------------------------------------------------------------*/
  23.     /* Init System Clock                                                                                       */
  24.     /*---------------------------------------------------------------------------------------------------------*/

  25.     /* Enable External XTAL (4~24 MHz) */
  26.     CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk;

  27.     CLK->PLLCON = PLLCON_SETTING;

  28.     /* Waiting for clock ready */
  29.     CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk);

  30.     /* Switch HCLK clock source to PLL */
  31.     CLK->CLKSEL0 = CLK_CLKSEL0_HCLK_S_PLL;

  32.     /* Enable IP clock */
  33.     CLK->APBCLK = CLK_APBCLK_UART0_EN_Msk;

  34.     /* Select IP clock source */
  35.     CLK->CLKSEL1 = CLK_CLKSEL1_UART_S_HXT;

  36.     /* Update System Core Clock */
  37.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  38.     //SystemCoreClockUpdate();
  39.     PllClock        = PLL_CLOCK;            // PLL
  40.     SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  41.     CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  42.     /*---------------------------------------------------------------------------------------------------------*/
  43.     /* Init I/O Multi-function                                                                                 */
  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Set P3 multi-function pins for UART0 RXD and TXD  */
  46.     SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;

  47. }

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

  55. int32_t FillDataPattern(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  56. {
  57.     uint32_t u32Addr;

  58.     for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
  59.     {
  60.         FMC_Write(u32Addr, u32Pattern);
  61.     }
  62.     return 0;
  63. }


  64. int32_t  VerifyData(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  65. {
  66.     uint32_t    u32Addr;
  67.     uint32_t    u32Data;

  68.     for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
  69.     {
  70.         u32Data = FMC_Read(u32Addr);
  71.         if(u32Data != u32Pattern)
  72.         {
  73.             printf("\nFMC_Read data verify failed at address 0x%x, read=0x%x, expect=0x%x\n", u32Addr, u32Data, u32Pattern);
  74.             return -1;
  75.         }
  76.     }
  77.     return 0;
  78. }


  79. int32_t  FlashTest(uint32_t u32StartAddr, uint32_t u32EndAddr, uint32_t u32Pattern)
  80. {
  81.     uint32_t    u32Addr;

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

  85.         // Erase page
  86.         FMC_Erase(u32Addr);

  87.         // Verify if page contents are all 0xFFFFFFFF
  88.         if(VerifyData(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, 0xFFFFFFFF) < 0)
  89.         {
  90.             printf("\nPage 0x%x erase verify failed!\n", u32Addr);
  91.             return -1;
  92.         }

  93.         // Write test pattern to fill the whole page
  94.         if(FillDataPattern(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, u32Pattern) < 0)
  95.         {
  96.             printf("Failed to write page 0x%x!\n", u32Addr);
  97.             return -1;
  98.         }

  99.         // Verify if page contents are all equal to test pattern
  100.         if(VerifyData(u32Addr, u32Addr + FMC_FLASH_PAGE_SIZE, u32Pattern) < 0)
  101.         {
  102.             printf("\nData verify failed!\n ");
  103.             return -1;
  104.         }

  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.     }
  113.     printf("\r    Flash Test Passed.          \n");
  114.     return 0;
  115. }


  116. int main()
  117. {
  118.     uint32_t i, u32Data;

  119.     /* Unlock protected registers */
  120.     SYS_UnlockReg();

  121.     SYS_Init();
  122.     UART_Init();

  123.     /*
  124.         This sample code is used to show how to use StdDriver API to implement ISP functions.
  125.     */

  126.     printf("\n\n");
  127.     printf("+----------------------------------------+\n");
  128.     printf("|          M051 FMC Sample Code          |\n");
  129.     printf("+----------------------------------------+\n");

  130.     SYS_UnlockReg();

  131.     /* Enable FMC ISP function */
  132.     FMC_Open();

  133.     /* Read BS */
  134.     printf("  Boot Mode ............................. ");
  135.     if(FMC_GetBootSource() == 0)
  136.         printf("[APROM]\n");
  137.     else
  138.     {
  139.         printf("[LDROM]\n");
  140.         printf("  WARNING: The driver sample code must execute in AP mode!\n");
  141.         goto lexit;
  142.     }

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

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

  147.     for(i = 0; i < 3; i++)
  148.     {
  149.         u32Data = FMC_ReadUID(i);
  150.         printf("  Unique ID %d ........................... [0x%08x]\n", i, u32Data);
  151.     }

  152.     for(i = 0; i < 4; i++)
  153.     {
  154.         u32Data = FMC_ReadUCID(i);
  155.         printf("  Unique Customer ID %d .................. [0x%08x]\n", i, u32Data);
  156.     }

  157.     /* Read User Configuration */
  158.     printf("  User Config 0 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE));

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

  162.     printf("\n\nLDROM test =>\n");
  163.     FMC_EnableLDUpdate();
  164.     if(FlashTest(FMC_LDROM_BASE, FMC_LDROM_BASE + FMC_LDROM_SIZE, TEST_PATTERN) < 0)
  165.     {
  166.         printf("\n\nLDROM test failed!\n");
  167.         goto lexit;
  168.     }
  169.     FMC_DisableLDUpdate();

  170.     printf("\n\nAPROM test =>\n");
  171.     FMC_EnableAPUpdate();
  172.     if(FlashTest(APROM_TEST_BASE, APROM_TEST_END, TEST_PATTERN) < 0)
  173.     {
  174.         printf("\n\nAPROM test failed!\n");
  175.         goto lexit;
  176.     }
  177.     FMC_DisableAPUpdate();

  178.     printf("\n\nData Flash test =>\n");
  179.     if(FlashTest(DATA_FLASH_TEST_BASE, DATA_FLASH_TEST_END, TEST_PATTERN) < 0)
  180.     {
  181.         printf("\n\nData Flash test failed!\n");
  182.         goto lexit;
  183.     }

  184. lexit:

  185.     /* Disable FMC ISP function */
  186.     FMC_Close();

  187.     /* Lock protected registers */
  188.     SYS_LockReg();

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

  190.     while(1);
  191. }

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


 楼主| 643757107 发表于 2017-11-21 11:18 | 显示全部楼层
芯片的各种ID都在这个例子中进行了演示
zhuotuzi 发表于 2017-11-21 15:20 | 显示全部楼层
多种ID可以用于安全加密和身份识别
zhuomuniao110 发表于 2017-11-21 16:15 | 显示全部楼层
为何这么多种ID,一个不是就够了吗
wanduzi 发表于 2017-11-21 17:36 | 显示全部楼层
从寄存器地址读数据而已,要知道地址位置。
xinpian101 发表于 2017-11-21 20:07 | 显示全部楼层
读长数据是通过for循环多次读出来的。
捉虫天师 发表于 2017-11-21 20:46 | 显示全部楼层
这个主题函数没有实现那个读取功能,应该是在头文件里吧
稳稳の幸福 发表于 2017-11-21 20:49 | 显示全部楼层
#define TEST_PATTERN                0x5A5A5A5A
经常看到这个5A不知道是代表什么。
antusheng 发表于 2017-11-21 21:01 | 显示全部楼层
新唐的每一款芯片都有这个功能。
21mengnan 发表于 2017-12-15 15:45 | 显示全部楼层
操作用的时钟部分值得学习啊。
huahuagg 发表于 2017-12-15 15:47 | 显示全部楼层
可用的ID加一起是个庞大的ID资源。
玛尼玛尼哄 发表于 2017-12-15 20:50 | 显示全部楼层
FMC操作的应用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3972

帖子

11

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