[技术问答] 求助,新塘MINI51使用内部晶振

[复制链接]
 楼主| 纯乐乐24k 发表于 2016-8-23 11:04 | 显示全部楼层 |阅读模式
不知道使用的对不对。新手,菜鸟~希望大神们解答一下
/**
  * @brief  This function is used to update the variable SystemCoreClock
  *   and must be called whenever the core clock is changed.
  * @param  None.
  * @retval None.
  */

void SystemCoreClockUpdate (void)
{
    uint32_t u32CoreFreq, u32ClkSrc;

//    u32ClkSrc = CLK->CLKSEL0 & CLK_CLKSEL0_HCLK_S_Msk;
    u32ClkSrc = 8;
    if (u32ClkSrc == 0)
        u32CoreFreq = __XTAL;       /* External crystal clock */
    else if (u32ClkSrc == 3)
        u32CoreFreq = __IRC10K;     /* Internal 10K crystal clock */
    else if (u32ClkSrc ==  7)
        u32CoreFreq = __IRC22M;     /* Internal 22M */
    else
        u32CoreFreq = __IRC22M;     /* unknown value, use default Internal 22M */

    SystemCoreClock = (u32CoreFreq/((CLK->CLKDIV & CLK_CLKDIV_HCLK_N_Msk) + 1));
    CyclesPerUs = (SystemCoreClock + 500000) / 1000000;
}

这里 u32ClkSrc直接写了8.使用内部晶振,按理说内部应该是22.1184M的晶振。
1.png 2.png


但是在用官方代码给的定时延时的时候
/**
  * @brief  This function execute delay function.
  * @param  us  Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex:
  *                             50MHz => 335544us, 48MHz => 349525us, 28MHz => 699050us ...
  * @return None
  * @Details    Use the SysTick to generate the delay time and the UNIT is in us.
  *             The SysTick clock source is from HCLK, i.e the same as system core clock.
  */
void CLK_SysTickDelay(uint32_t us)       //MAX 1398101 US 12M    MAX 758518 US 22.1184M   MAX 762600 US 22M
{
    SysTick->LOAD = us * CyclesPerUs;
    SysTick->VAL  =  (0x00);
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;

    /* Waiting for down-count to zero */
    while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
    SysTick->CTRL = 0;
}

按照计算,22.1184M最大可延时758518us。。但是实际上最大可以延时762600us.也就是内部晶振当成了22M。用的是MINI51系列的MINI54LDE官方版。得出是22M结论是板子上有个LED,自己写了程序闪烁。
请教一下内部晶振使用是否正确?如果正确为什么延时不对、希望大神解答一下
 楼主| 纯乐乐24k 发表于 2016-8-23 11:10 | 显示全部楼层
附上时钟定义。
/*----------------------------------------------------------------------------
  Define SYSCLK
*----------------------------------------------------------------------------*/

#define __XTAL12M        (12000000UL)
#define __XTAL32K        (32768UL)
#define __IRC22M        (22118400UL)
#define __IRC10K        (10000UL)
#define __XTAL            __XTAL12M
#define __HSI            (__IRC22M)      /* Factory Default is internal 22MHz */
 楼主| 纯乐乐24k 发表于 2016-8-23 11:35 | 显示全部楼层
额。解决了。看了下延时的定义。不是系统时钟……
zhuomuniao110 发表于 2016-8-25 21:30 来自手机 | 显示全部楼层
对的,不是系统时钟
捉虫天师 发表于 2016-8-27 21:22 | 显示全部楼层
以前还真不知道这么个事情,多谢楼主分享战果。
734774645 发表于 2016-8-28 08:53 | 显示全部楼层
不是有结构图吗,按照结构图,配合库函数使用
zhuotuzi 发表于 2016-8-28 22:52 | 显示全部楼层
原来如此,ARM的时钟也太复杂了。
 楼主| 纯乐乐24k 发表于 2016-8-30 14:32 | 显示全部楼层
上海唐辉电子92 发表于 2016-8-29 12:07
你最后选定的是哪个频率?

不是我选定的额,我用内部22.1184M晶振,它的系统延时sys那个函数里面有计算。实际上用的是22M来进行延时
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

26

帖子

0

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

2

主题

26

帖子

0

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