[DemoCode下载] M051Series时钟配置

[复制链接]
2094|10
 楼主| 734774645 发表于 2016-2-10 10:03 | 显示全部楼层 |阅读模式
  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: 3 $
  5. * $Date: 14/01/28 11:44a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    M051 Series GPIO Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "M051Series.h"


  13. #define PLL_CLOCK           50000000


  14. void SYS_Init(void)
  15. {
  16.     /*---------------------------------------------------------------------------------------------------------*/
  17.     /* Init System Clock                                                                                       */
  18.     /*---------------------------------------------------------------------------------------------------------*/
  19.     /* Enable Internal RC 22.1184MHz clock */
  20.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  21.     /* Waiting for Internal RC clock ready */
  22.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  23.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  24.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  25.     /* Enable external XTAL 12MHz clock */
  26.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  27.     /* Waiting for external XTAL clock ready */
  28.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  29.     /* Set core clock as PLL_CLOCK from PLL */
  30.     CLK_SetCoreClock(PLL_CLOCK);

  31.     /* Enable UART module clock */
  32.     CLK_EnableModuleClock(UART0_MODULE);

  33.     /* Select UART module clock source */
  34.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

  35.     /*---------------------------------------------------------------------------------------------------------*/
  36.     /* Init I/O Multi-function                                                                                 */
  37.     /*---------------------------------------------------------------------------------------------------------*/

  38.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  39.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  40.     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

  41. }

  42. void UART0_Init(void)
  43. {
  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Init UART                                                                                               */
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Reset UART */
  48.     SYS_ResetModule(UART0_RST);

  49.     /* Configure UART0 and set UART0 Baudrate */
  50.     UART_Open(UART0, 115200);
  51. }

  52. /*---------------------------------------------------------------------------------------------------------*/
  53. /* MAIN function                                                                                           */
  54. /*---------------------------------------------------------------------------------------------------------*/
  55. int main(void)
  56. {
  57.     int32_t i32Err;

  58.     /* Unlock protected registers */
  59.     SYS_UnlockReg();

  60.     /* Init System, peripheral clock and multi-function I/O */
  61.     SYS_Init();

  62.     /* Lock protected registers */
  63.     SYS_LockReg();

  64.     /* Init UART0 for printf */
  65.     UART0_Init();

  66.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
  67.     printf("+-------------------------------------------------+\n");
  68.     printf("|    P1.2(Output) and P4.1(Input) Sample Code     |\n");
  69.     printf("+-------------------------------------------------+\n\n");

  70.     /* Configure P1.2 as Output mode and P4.1 as Input mode */
  71.     GPIO_SetMode(P1, BIT2, GPIO_PMD_OUTPUT);
  72.     GPIO_SetMode(P4, BIT1, GPIO_PMD_INPUT);

  73.     i32Err = 0;
  74.     printf("GPIO P1.2(output mode) connect to P4.1(input mode) ......");

  75.     /* Use Pin Data Input/Output Control to pull specified I/O or get I/O pin status */
  76.     P12 = 0;
  77.     if(P41 != 0)
  78.     {
  79.         i32Err = 1;
  80.     }

  81.     P12 = 1;
  82.     if(P41 != 1)
  83.     {
  84.         i32Err = 1;
  85.     }

  86.     if(i32Err)
  87.     {
  88.         printf("  [FAIL].\n");
  89.     }
  90.     else
  91.     {
  92.         printf("  [OK].\n");
  93.     }

  94.     /* Configure P1.2 and P4.1 to default Quasi-bidirectional mode */
  95.     GPIO_SetMode(P1, BIT2, GPIO_PMD_QUASI);
  96.     GPIO_SetMode(P4, BIT1, GPIO_PMD_QUASI);

  97.     while(1);
  98. }

  99. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/


 楼主| 734774645 发表于 2016-2-10 10:03 | 显示全部楼层
  1. /* Init System, peripheral clock and multi-function I/O */
  2. SYS_Init();

这个子函数是用来配置系统,外设时钟,和IO功能 选择。
 楼主| 734774645 发表于 2016-2-10 10:22 | 显示全部楼层
  1. #define PLL_CLOCK           50000000


  2. void SYS_Init(void)
  3. {
  4.     /*---------------------------------------------------------------------------------------------------------*/
  5.     /* Init System Clock                                                                                       */
  6.     /*---------------------------------------------------------------------------------------------------------*/
  7.     /* Enable Internal RC 22.1184MHz clock 使能内部的RC时钟,并指定频率*/
  8.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  9.     /* Waiting for Internal RC clock ready  等待内部时钟稳定*/
  10.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  11.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1  这个函数设置HCLK时钟源和HCLK时钟分频器*/
  12.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  13.     /* Enable external XTAL 12MHz clock使能外部XTAL12M时钟 */
  14.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  15.     /* Waiting for external XTAL clock ready等待外部时钟稳定 */
  16.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  17.     /* Set core clock as PLL_CLOCK from PLL 这个函数设置HCLK频率。频率单位为赫兹。对u32hclk范围是16 ~ 32兆赫 */
  18.     CLK_SetCoreClock(PLL_CLOCK);

  19.     /* Enable UART module clock 使能串口时钟 */
  20.     CLK_EnableModuleClock(UART0_MODULE);

  21.     /* Select UART module clock source设置串口模块时钟源 */
  22.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

  23.     /*---------------------------------------------------------------------------------------------------------*/
  24.     /* Init I/O Multi-function                                                                                 */
  25.     /*---------------------------------------------------------------------------------------------------------*/

  26.     /* Set P3 multi-function pins for UART0 RXD and TXD 把P3设置为 */
  27.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  28.     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

  29. }


 楼主| 734774645 发表于 2016-2-10 10:45 | 显示全部楼层
  1. void UART0_Init(void)
  2. {
  3.     /*---------------------------------------------------------------------------------------------------------*/
  4.     /* Init UART                                                                                               */
  5.     /*---------------------------------------------------------------------------------------------------------*/
  6.     /* Reset UART */
  7.     SYS_ResetModule(UART0_RST);

  8.     /* Configure UART0 and set UART0 Baudrate */
  9.     UART_Open(UART0, 115200);
  10. }
配置完了时钟源和管脚选择,就可以复位模块,然后打开端口,设置波特率。

玛尼玛尼哄 发表于 2016-2-10 13:18 | 显示全部楼层
我看了好几个的void SYS_Init(void)函数,对于时钟配置的部分基本上都是一样的。
lovecat2015 发表于 2016-2-10 13:53 | 显示全部楼层
这个系列的时钟倍频最高能到多少啊?
 楼主| 734774645 发表于 2016-2-12 17:10 | 显示全部楼层
  1. uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq);
  2. void TIMER_Close(TIMER_T *timer);
  3. void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec);
  4. void TIMER_EnableCapture(TIMER_T *timer, uint32_t u32CapMode, uint32_t u32Edge);
  5. void TIMER_DisableCapture(TIMER_T *timer);
  6. void TIMER_EnableEventCounter(TIMER_T *timer, uint32_t u32Edge);
  7. void TIMER_DisableEventCounter(TIMER_T *timer);
  8. uint32_t TIMER_GetModuleClock(TIMER_T *timer);
 楼主| 734774645 发表于 2016-2-12 17:11 | 显示全部楼层
这几个是定时器的函数。配置时钟的函数在哪儿呢
 楼主| 734774645 发表于 2016-2-12 17:13 | 显示全部楼层
  1. void CLK_DisableCKO(void);
  2. void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En);
  3. void CLK_PowerDown(void);
  4. void CLK_Idle(void);
  5. uint32_t CLK_GetHXTFreq(void);
  6. uint32_t CLK_GetHCLKFreq(void);
  7. uint32_t CLK_GetPCLKFreq(void);
  8. uint32_t CLK_GetCPUFreq(void);
  9. uint32_t CLK_SetCoreClock(uint32_t u32Hclk);
  10. void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv);
  11. void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv);
  12. void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc);
  13. void CLK_EnableXtalRC(uint32_t u32ClkMask);
  14. void CLK_DisableXtalRC(uint32_t u32ClkMask);
  15. void CLK_EnableModuleClock(uint32_t u32ModuleIdx);
  16. void CLK_DisableModuleClock(uint32_t u32ModuleIdx);
  17. uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq);
  18. void CLK_DisablePLL(void);
  19. uint32_t CLK_WaitClockReady(uint32_t u32ClkMask);


 楼主| 734774645 发表于 2016-2-13 21:09 来自手机 | 显示全部楼层
    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
Thethree 发表于 2016-2-14 10:00 | 显示全部楼层
能倍频吗,最高频率能达到多少?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

3588

帖子

15

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