打印
[DemoCode下载]

NUC505如何在指定位置塞入指定数值

[复制链接]
843|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuomuniao110|  楼主 | 2017-3-20 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本代码展示如何在指定位置塞入指定数值,可以当作加密时的辨识码,或是版本号码的判断。
代码内预设的辨识码为 20040929 其所在位置为 0x130,版本号码为 abcd0001 其所在位置为
0x100。若用 IAR 开发环境需先 define IAR 使可开始执行。
必须注意此位置不可与中断向量位置重迭,需摆在其之后。各芯片型号如下:
1. NUC505 须放在 0xBC 之后
2. M451 series 须放在 0x13C 之后
3. NUC400 series 须放在 0x240 之后

沙发
zhuomuniao110|  楼主 | 2017-3-20 00:10 | 只看该作者
/****************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.0
* $Date: 16/09/02 10:04a $
* @brief
*       Display how to insert OTP signature and Version number into SPI Flash.
*                      
* @note
* Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include <string.h>
#include "NUC505Series.h"

/* If you want to encrypt binary firmware, you can enable
   the session code and assign signature and offset here */
#define OTP_SIG1    (0x20040929)
#define OTP_OFFSET  (0x130)
#define Version    (0xabcd0001)
#define V_OFFSET  (0x100)
//#define IAR

#ifdef IAR   
/* IAR */
static const uint32_t gu32OtpAddr[1] [url=home.php?mod=space&uid=72445]@[/url] OTP_OFFSET = {OTP_SIG1};
static const uint32_t gu32VAddr[1] @ V_OFFSET = {Version};
#else
/* Keil */
__attribute__((at(OTP_OFFSET))) static const unsigned int gu32OtpAddr[1] = {OTP_SIG1};  
__attribute__((at(V_OFFSET))) static const unsigned int gu32VAddr[1] = {Version};
#endif
/*---------------------------------------------------------------------------------------------------------*/
/* Global variables                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t g_au32BufS[1],g_au32BufV[1];;

void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable  XTAL */
    CLK->PWRCTL |= CLK_PWRCTL_HXTEN_Msk;

    CLK_SetCoreClock(96000000);
       
    /* Set PCLK divider */
    CLK_SetModuleClock(PCLK_MODULE, NULL, 1);

    /* Update System Core Clock */
    SystemCoreClockUpdate();

    /* Enable IP clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select IP clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_UART0_SRC_EXT, 0);

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Configure multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPL  = (SYS->GPB_MFPL & (~SYS_GPB_MFPL_PB0MFP_Msk) ) | SYS_GPB_MFPL_PB0MFP_UART0_TXD;
    SYS->GPB_MFPL  = (SYS->GPB_MFPL & (~SYS_GPB_MFPL_PB1MFP_Msk) ) | SYS_GPB_MFPL_PB1MFP_UART0_RXD;

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART module */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
}

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{
       
    SYS_Init();
    UART0_Init();
    printf("+-------------------------------------+ \n");
    printf("| NUC505 Cipher Signature Sample Code | \n");
    printf("+-------------------------------------+ \n");
    /* Set OTP */
#ifdef IAR   
    if (0)
     {
       uint32_t s;
       s = gu32OtpAddr[0]+1;
     }
    if (0)
     {
       uint32_t s;
       s = gu32VAddr[0]+1;
     }
#endif
               
                printf("The signature is 0x20040929\n");
                printf("The Version is 0xabcd0001\n");
                 
                memset((char *)g_au32BufS, 0, 32);
                memset((char *)g_au32BufV, 0, 32);
                 
                /* Load signature from SPI Flash 0x130 */
                memcpy(g_au32BufS,(void *)304 , sizeof(uint32_t)*1);
                /* Load Version from SPI Flash 0x100 */
                memcpy(g_au32BufV,(void *)256 , sizeof(uint32_t)*1);
               
                 if((g_au32BufS[0]==OTP_SIG1)&&(g_au32BufV[0]==Version)){
                        printf("Verify the Data is correct\n");
                        printf("Demo complete\n");
                }
                else{
                        printf("Data validation error\n");
                }
                while(1);       
}

/*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/


使用特权

评论回复
板凳
zhuomuniao110|  楼主 | 2017-3-20 00:11 | 只看该作者
这个技术还是很有用的。

使用特权

评论回复
地板
zhuomuniao110|  楼主 | 2017-3-20 00:11 | 只看该作者
EC_NUC505_Cipher_Signature_V1.0.zip (917.19 KB)



使用特权

评论回复
5
643757107| | 2017-3-20 13:42 | 只看该作者
这些位置存储的数据可以是系统或者项目的版本号之类的信息。

使用特权

评论回复
6
wahahaheihei| | 2017-3-20 17:07 | 只看该作者
主要用于产品的信息版本号之类的,也可以使用Flash搞啊,不过这个更方便。

使用特权

评论回复
7
dongnanxibei| | 2017-3-21 11:30 | 只看该作者
这一招还可以用于系统加密。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

206

主题

3359

帖子

10

粉丝