打印
[技术问答]

【七,八楼已更正说明】为什么工程配置时设置频率为50MHZ

[复制链接]
3113|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2013-12-6 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 niuyaliang 于 2013-12-8 09:15 编辑

    在我的上一个帖子配置M058S的工程时,曾经有疑问,以前的单片机设置频率时,我用多大的晶振,就设置多少的频率,为什么新塘官网给的例程都把晶振设置为50MHZ呢?曾经以为这种做法是错误的,我配置成实际的12MHZ即可,今天经过一位网友的解释,我恍然大悟。
/**************************
    原来在MCU执行main函数之前,他会先执行system_M051series.c中的程序,在这里程序宏定义了MCU的时钟为PLL倍频后的时钟,即为固定的50MHZ,所以在工程中需要配置频率为50MHZ。
**************************/
    见七楼的更正
沙发
niuyaliang|  楼主 | 2013-12-6 23:08 | 只看该作者
本帖最后由 niuyaliang 于 2013-12-6 23:16 编辑
uint32_t SystemCoreClock  = __HSI;              /*!< System Clock Frequency (Core Clock) */
uint32_t CyclesPerUs      = (__HSI / 1000000);  /*!< Cycles per micro second             */
uint32_t PllClock         = __HSI;              /*!< PLL Output Clock Frequency   
#define __XTAL      (12000000UL)    /*!< External Crystal Clock Frequency     */
#define __IRC22M    (22118400UL)    /*!< Internal 22M RC Oscillator Frequency */
#define __IRC10K    (10000UL)       /*!< Internal 10K RC Oscillator Frequency */
#define __HSI       (50000000UL)    /*!< PLL default output is 48MHz@12M X'tal or 48.065MHz@22.1184MHz IRC */

使用特权

评论回复
板凳
bobde163| | 2013-12-7 19:43 | 只看该作者
50Hz还是50MHz?

使用特权

评论回复
地板
niuyaliang|  楼主 | 2013-12-7 20:28 | 只看该作者
bobde163 发表于 2013-12-7 19:43
50Hz还是50MHz?

晕,50MHZ的,竟然三处都没打上M,太诡异了

使用特权

评论回复
5
黄小俊| | 2013-12-7 23:18 | 只看该作者

使用特权

评论回复
6
bobde163| | 2013-12-7 23:48 | 只看该作者
niuyaliang 发表于 2013-12-7 20:28
晕,50MHZ的,竟然三处都没打上M,太诡异了

我看到三处都是50Hz,觉得奇怪,所以确认一下

使用特权

评论回复
7
niuyaliang|  楼主 | 2013-12-8 09:09 | 只看该作者
在执行主函数之前,MCU会先编译宏定义指令,PLL倍频为50MHZ的指令在SYS.h函数中
#if (__XTAL == 12000000)
#define SYSCLK_PLLCON_50MHz_XTAL   (SYSCLK_PLLCON_FIN_XTAL | SYSCLK_PLLCON_NR(3) | SYSCLK_PLLCON_NF( 25) | SYSCLK_PLLCON_NO_2) /*!< Predefined PLLCON setting for 50MHz PLL output with 12MHz X'tal */
#define SYSCLK_PLLCON_48MHz_XTAL   (SYSCLK_PLLCON_FIN_XTAL | SYSCLK_PLLCON_NR(7) | SYSCLK_PLLCON_NF(112) | SYSCLK_PLLCON_NO_4) /*!< Predefined PLLCON setting for 48MHz PLL output with 12MHz X'tal */
#define SYSCLK_PLLCON_36MHz_XTAL   (SYSCLK_PLLCON_FIN_XTAL | SYSCLK_PLLCON_NR(7) | SYSCLK_PLLCON_NF( 84) | SYSCLK_PLLCON_NO_4) /*!< Predefined PLLCON setting for 36MHz PLL output with 12MHz X'tal */
#define SYSCLK_PLLCON_32MHz_XTAL   (SYSCLK_PLLCON_FIN_XTAL | SYSCLK_PLLCON_NR(6) | SYSCLK_PLLCON_NF( 64) | SYSCLK_PLLCON_NO_4) /*!< Predefined PLLCON setting for 32MHz PLL output with 12MHz X'tal */
#else
在这里定义,当外部晶振为12MHZ时,PLL倍频为50MHZ,SYSCLK_PLLCON_50MHz_XTAL

使用特权

评论回复
8
niuyaliang|  楼主 | 2013-12-8 09:12 | 只看该作者
然后在启动文件中定义
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main
即在执行main函数之前,先执行SystemInit这个函数
void SystemInit(void)
{
#ifdef INIT_SYSCLK_AT_BOOTING
    int32_t i32TimeoutCnt;
    uint32_t u32HclkSelect;
    int8_t i8IsPllEn;

    PllClock = 0;
    i8IsPllEn = 0;
    u32HclkSelect = SYSCLK->CLKSEL0 & SYSCLK_CLKSEL0_HCLK_S_Msk;
    if(u32HclkSelect == SYSCLK_CLKSEL0_HCLK_XTAL)
    {
        /* Set to 50MHz system clock frequency when clock source is from external 12MHz */
        SYSCLK->PLLCON = SYSCLK_PLLCON_50MHz_XTAL;      
        
        /* Waiting for PLL ready */
        i32TimeoutCnt = (__XTAL / 1000); /* Timeout is about 1ms */
        while((SYSCLK->CLKSTATUS & SYSCLK_CLKSTATUS_PLL_STB_Msk) == 0 )
        {
            if(i32TimeoutCnt-- <= 0)
                break;   
        }

        i8IsPllEn = 1;
    }
    else if(u32HclkSelect == SYSCLK_CLKSEL0_HCLK_IRC22M)
    {
        /* Set to 50.1918MHz system clock frequency when clock source is from internal 22.1184MHz RC clock */
        SYSCLK->PLLCON = SYSCLK_PLLCON_50MHz_IRC22M;      
        
        /* Waiting for PLL ready */
        i32TimeoutCnt = (__IRC22M / 1000); /* Timeout is about 1ms */
        while((SYSCLK->CLKSTATUS & SYSCLK_CLKSTATUS_PLL_STB_Msk) == 0 )
        {
            if(i32TimeoutCnt-- <= 0)
                break;   
        }

        i8IsPllEn = 1;
    }

    if(i8IsPllEn)   
    {
        /* Set PLL as HCLK clock source (HCLK_S is locked setting)*/
        SYS_UnlockReg();
        SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_PLL;
        SYS_LockReg();
    }
#endif
}
这样就能理解,为什么在工程中选择50MHZ的频率了

使用特权

评论回复
9
骗子的片子| | 2014-1-20 16:01 | 只看该作者
楼主很给力啊,这么好学

使用特权

评论回复
10
zxf0168| | 2014-2-11 19:39 | 只看该作者
在MCU执行main函数之前,他会先执行system_M051series.c中的程序,在这里程序宏定义了MCU的时钟为PLL倍频后的时钟,即为固定的50MHZ,所以在工程中需要配置频率为50MHZ。

使用特权

评论回复
11
astudent| | 2014-12-29 21:29 | 只看该作者
8楼正解


               
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main

使用特权

评论回复
12
niuyaliang|  楼主 | 2015-1-6 17:19 | 只看该作者
astudent 发表于 2014-12-29 21:29
8楼正解

最后执行的才是主函数

使用特权

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

本版积分规则

212

主题

2427

帖子

7

粉丝