打印
[应用方案]

472的篡改检测复位备份演示

[复制链接]
556|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuotuzi|  楼主 | 2018-9-9 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知道翻译的对不对,请高手来讲解啊
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Date: 14/07/31 1:44p $
* [url=home.php?mod=space&uid=247401]@brief[/url]    NUC472/NUC442 General Purpose I/O Driver Sample Code
*           Connect PB.3 and PD.7 to test IO In/Out
*           Test PB2, PC5, PA0(INT0) and PF0(INT5) interrupts
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "NUC472_442.h"
#include "gpio.h"

#define PLLCON_SETTING      CLK_PLLCON_84MHz_HXT
#define PLL_CLOCK           84000000

/**
* @brief       GPIO IRQ
*
* @param       None
*
* [url=home.php?mod=space&uid=266161]@return[/url]      None
*
* [url=home.php?mod=space&uid=1543424]@Details[/url]     The GPIO default IRQ, declared in startup_NUC472_442.s.
*/


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable External XTAL (4~24 MHz) */
    CLK->PWRCTL |= CLK_PWRCTL_HXTEN_Msk; // XTAL12M (HXT) Enabled

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

    /* Switch HCLK clock source to XTAL */
    CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLKSEL_Msk;
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLKSEL_HXT;

    /* Enable IP clock */
    CLK->APBCLK0 |= CLK_APBCLK0_UART0CKEN_Msk; // UART0 Clock Enable
    CLK->APBCLK0 |= CLK_APBCLK0_RTCCKEN_Msk; // RTC Clock Enable

    /* Select IP clock source */
    CLK->CLKSEL1 &= ~CLK_CLKSEL1_UARTSEL_Msk;
    CLK->CLKSEL1 |= (0x0 << CLK_CLKSEL1_UARTSEL_Pos);// Clock source from external 12 MHz or 32 KHz crystal clock

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set PG multi-function pins for UART0 RXD, TXD */
    SYS->GPG_MFPL &= ~(SYS_GPG_MFPL_PG1MFP_Msk | SYS_GPG_MFPL_PG2MFP_Msk);
    SYS->GPG_MFPL |= (SYS_GPG_MFPL_PG1MFP_UART0_RXD | SYS_GPG_MFPL_PG2MFP_UART0_TXD);

    /* Lock protected registers */
//    SYS_LockReg();

}

void RTC_init(void)
{
    S_RTC_TIME_DATA_T sRTC_Time;
    /* Time Setting */
    sRTC_Time.u32Year       = 2016;
    sRTC_Time.u32Month      = 12;
    sRTC_Time.u32Day        = 13;
    sRTC_Time.u32Hour       = 12;
    sRTC_Time.u32Minute     = 59;
    sRTC_Time.u32Second     = 50;
    sRTC_Time.u32DayOfWeek  = RTC_TUESDAY;
    sRTC_Time.u32TimeScale  = RTC_CLOCK_24;
   
    RTC_Open(&sRTC_Time);
    RTC_EnableTamperDetection(RTC_TAMPER_0, 1, 0, 1, 1);
    RTC_EnableTamperDetection(RTC_TAMPER_1, 1, 0, 1, 1);
}

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
void RTC_AccessEnable()
{
    RTC->RWEN = RTC_WRITE_KEY;
    while(!(RTC->RWEN & RTC_RWEN_RWENF_Msk));
}
int main (void)
{
    int32_t Spare_Data, i;

    SYS_Init();

    /* Init UART to 115200-8n1 for print message */
    UART_Open(UART0, 115200);

    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);
    SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA0MFP_Msk);
    GPIO_SetMode(PA, (BIT0 | BIT1 | BIT2), GPIO_MODE_OUTPUT);
    PA0 = 0;
    PA1 = 0;
    PA2 = 0;

    SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA0MFP_Msk);
    SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA0MFP_TAMPER0  | SYS_GPA_MFPL_PA1MFP_TAMPER1);
    RTC_init();


   // Enable spare register
    RTC_EnableSpareAccess();
    // Write spare register
    for(i = 0; i < 24; i++) {
        RTC_AccessEnable();
        RTC_WRITE_SPARE_REGISTER(i, i+1);
        while(!(RTC->SPRCTL & RTC_SPRCTL_SPRRWRDY_Msk));
    }
   
     while (1)
    {
        // Check spare register data
        for(i = 0; i < 24; i++)
        {
            RTC_AccessEnable();
            Spare_Data = RTC_READ_SPARE_REGISTER(i);
            if(Spare_Data != i+1)
            {
                PA2 = 0;
            }
            else
            {
                PA2 = 1;
            }
        }
    }  
}




沙发
zhuotuzi|  楼主 | 2018-9-9 10:42 | 只看该作者
NUC472_442 侦测RTC PA[1:0] Tamper pin, 若异常将清除96 bytes spare registers Sample Code.

使用特权

评论回复
板凳
antusheng| | 2018-9-9 19:44 | 只看该作者
貌似一个RTC的应用,没见过。

使用特权

评论回复
地板
dongliushui| | 2018-9-9 19:47 | 只看该作者
目前还没用过这个功能。MARK,学习一下。

使用特权

评论回复
5
幸福小强| | 2018-9-9 21:21 | 只看该作者
没看懂啥意思。

使用特权

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

本版积分规则

164

主题

3192

帖子

7

粉丝