[DemoCode下载] MINI51的PDID以及SYS相关操作演示

[复制链接]
 楼主| dongnanxibei 发表于 2018-4-22 20:59 | 显示全部楼层 |阅读模式
  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V2.00
  4. * $Date: 15/10/06 1:21p $
  5. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to get PDID, get and clear reset source, configure
  6. *           BOD, and output system clock to CKO pin with the system
  7. *           clock / 4 frequency
  8. *
  9. * @note
  10. * Copyright (C) 2012 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "Mini51Series.h"

  15. #define SIGNATURE       0x125ab234
  16. #define FLAG_ADDR       0x200007FC

  17. extern char GetChar(void);
  18. /*---------------------------------------------------------------------------------------------------------*/
  19. /*  Brown Out Detector IRQ Handler                                                                         */
  20. /*---------------------------------------------------------------------------------------------------------*/
  21. void BOD_IRQHandler(void)
  22. {
  23.     /* Clear Interrupt Flag */
  24.     SYS->BODCTL |= SYS_BODCR_BOD_INTF_Msk;

  25.     printf("Brown Out is Detected\n");
  26. }

  27. /*---------------------------------------------------------------------------------------------------------*/
  28. /*  Power Down Wake Up IRQ Handler                                                                         */
  29. /*---------------------------------------------------------------------------------------------------------*/
  30. void PWRWU_IRQHandler(void)
  31. {
  32.     /* Clear Power Down Wake Up interrupt flag */
  33.     CLK->PWRCON |= CLK_PWRCON_PD_WU_STS_Msk;

  34.     printf("Wake Up Interrupt is asserted\n");
  35. }

  36. void SYS_Init(void)
  37. {
  38.     /* Unlock protected registers */
  39.     SYS_UnlockReg();

  40.     /*---------------------------------------------------------------------------------------------------------*/
  41.     /* Init System Clock                                                                                       */
  42.     /*---------------------------------------------------------------------------------------------------------*/
  43.     /* Set P5 multi-function pins for XTAL1 and XTAL2 */
  44.     SYS->P5_MFP &= ~(SYS_MFP_P50_Msk | SYS_MFP_P51_Msk);
  45.     SYS->P5_MFP |= (SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2);

  46.     /* Enable external 12MHz XTAL, internal 22.1184MHz */
  47.     CLK_EnableXtalRC(CLK_PWRCON_HXT|CLK_PWRCON_HIRC_EN_Msk);

  48.     /* Waiting for clock ready */
  49.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL_STB_Msk | CLK_CLKSTATUS_IRC22M_STB_Msk);

  50.     /* Switch HCLK clock source to XTL */
  51.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_XTAL,CLK_CLKDIV_HCLK(1));

  52.     /* STCLK to XTL STCLK to XTL */
  53.     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_XTAL);

  54.     /* Enable IP clock */
  55.     CLK_EnableModuleClock(UART_MODULE);

  56.     /* Select IP clock source */
  57.     CLK_SetModuleClock(UART_MODULE,CLK_CLKSEL1_UART_S_XTAL,CLK_CLKDIV_UART(1));

  58.     /*---------------------------------------------------------------------------------------------------------*/
  59.     /* Init I/O Multi-function                                                                                 */
  60.     /*---------------------------------------------------------------------------------------------------------*/
  61.     /* Set P0 multi-function pins for UART RXD and TXD */
  62.     SYS->P0_MFP &= ~(SYS_MFP_P01_Msk | SYS_MFP_P00_Msk);
  63.     SYS->P0_MFP |= (SYS_MFP_P01_RXD | SYS_MFP_P00_TXD);

  64.     /* Set P3 multi-function pins for Clock Output */
  65.     SYS->P3_MFP = SYS_MFP_P36_CKO;

  66.     /* To update the variable SystemCoreClock */
  67.     SystemCoreClockUpdate();

  68.     /* Lock protected registers */
  69.     SYS_LockReg();
  70. }

  71. void UART_Init(void)
  72. {
  73.     /*---------------------------------------------------------------------------------------------------------*/
  74.     /* Init UART                                                                                               */
  75.     /*---------------------------------------------------------------------------------------------------------*/
  76.     /* Reset IP */
  77.     SYS_ResetModule(UART_RST);

  78.     /* Configure UART and set UART Baudrate */
  79.     UART_Open(UART, 115200);

  80. }

  81. /*---------------------------------------------------------------------------------------------------------*/
  82. /*  Main Function                                                                                          */
  83. /*---------------------------------------------------------------------------------------------------------*/
  84. int32_t main (void)
  85. {
  86.     uint32_t u32data;

  87.     /* Init System, IP clock and multi-function I/O */
  88.     SYS_Init();

  89.     /* Init UART for printf */
  90.     UART_Init();

  91.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

  92.     /*
  93.         This sample code will show some function about system manager controller and clock controller:
  94.         1. Read PDID
  95.         2. Get and clear reset source
  96.         3. Setting about BOD
  97.         4. Output system clock from CKO pin, and the output frequency = system clock / 4
  98.     */

  99.     printf("+----------------------------------------+\n");
  100.     printf("|    Mini51 System Driver Sample Code    |\n");
  101.     printf("+----------------------------------------+\n");

  102.     if (M32(FLAG_ADDR) == SIGNATURE) {
  103.         printf("  CPU Reset success!\n");
  104.         M32(FLAG_ADDR) = 0;
  105.         printf("  Press any key to continue ...\n");
  106.         GetChar();
  107.     }

  108.     /*---------------------------------------------------------------------------------------------------------*/
  109.     /* Misc system function test                                                                               */
  110.     /*---------------------------------------------------------------------------------------------------------*/

  111.     /* Read Part Device ID */
  112.     printf("Product ID 0x%x\n", SYS->PDID);

  113.     /* Get reset source from last operation */
  114.     u32data = SYS_GetResetSrc();
  115.     printf("Reset Source 0x%x\n", u32data);

  116.     /* Clear reset source */
  117.     SYS_ClearResetSrc(u32data);

  118.     /* Unlock protected registers for Brown-Out Detector settings */
  119.     SYS_UnlockReg();

  120.     /* Check if the write-protected registers are unlocked before BOD setting and CPU Reset */
  121.     if (SYS->RegLockAddr != 0) {
  122.         printf("Protected Address is Unlocked\n");
  123.     }

  124.     /* Enable Brown-Out Detector and Low Voltage Reset function, and set Brown-Out Detector voltage 2.7V ,
  125.        Enable Brown-Out Interrupt function */
  126.     SYS_EnableBOD(SYS_BODCR_BOD_INTERRUPT_EN,SYS_BODCR_BOD_VL_2_7V);

  127.     /* Enable BOD IRQ */
  128.     NVIC_EnableIRQ(BOD_IRQn);

  129.     /* Write a signature work to SRAM to check if it is reset by software */
  130.     M32(FLAG_ADDR) = SIGNATURE;
  131.     printf("\n\n  >>> Reset CPU <<<\n");

  132.     /* Waiting for message send out */
  133.     UART_WAIT_TX_EMPTY(UART);

  134.     /* Switch HCLK clock source to Internal 22MHz */
  135.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_IRC22M,0);

  136.     /* Enable CKO and output frequency = system clock / 4 */
  137.     CLK_EnableCKO(CLK_CLKSEL2_FRQDIV_HCLK,1,0);

  138.     /* Reset CPU */
  139.     SYS_ResetCPU();

  140. }






 楼主| dongnanxibei 发表于 2018-4-22 21:06 | 显示全部楼层
该例子也对欠压复位做了演示。
wahahaheihei 发表于 2018-4-22 21:45 | 显示全部楼层
大部分简单的特别操作都在这个例子里。
幸福小强 发表于 2018-4-22 22:02 | 显示全部楼层
没想到用外部晶振还要先配置管脚。
xinpian101 发表于 2018-4-22 22:25 | 显示全部楼层
IP时钟原来就是模块时钟,串口模块,PWM模块,或者说外设。
yiyigirl2014 发表于 2018-4-23 11:21 | 显示全部楼层
SYS->P3_MFP = SYS_MFP_P36_CKO;

一个配置就好了。
merry_zsp 发表于 2018-4-24 16:21 | 显示全部楼层
支持下,我习惯用库,基本不用寄存器的。
mintspring 发表于 2018-4-26 12:50 | 显示全部楼层
    /* Set P3 multi-function pins for Clock Output */
    SYS->P3_MFP = SYS_MFP_P36_CKO;

    /* Enable CKO and output frequency = system clock / 4 */
    CLK_EnableCKO(CLK_CLKSEL2_FRQDIV_HCLK,1,0);

是这两条决定的,因此可以封装未一个函数比较好。
HKingS 发表于 2018-4-26 23:14 | 显示全部楼层
支持下,好久没关注mini51系列了,觉得其他家的M0或者STM8比这个性价比好多了。
xuanhuanzi 发表于 2018-4-27 11:20 | 显示全部楼层
BOD这个非常好用。
Puremr 发表于 2018-4-28 15:18 | 显示全部楼层
mintspring 发表于 2018-4-26 12:50
/* Set P3 multi-function pins for Clock Output */
    SYS->P3_MFP = SYS_MFP_P36_CKO;

同意,这两个可以封装为一个库函数的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3840

帖子

18

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

223

主题

3840

帖子

18

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