[新手园地] 求助,nuc120的DrvSYS_Delay()函数中的时钟设置问题

[复制链接]
2930|8
 楼主| as234827239 发表于 2013-3-3 19:49 | 显示全部楼层 |阅读模式
在120的CLKSRC位写1,同时又把DrvSYS_Delay()函数中的SystemCoreClock->__HSI中的__IRC22M改为__RTC_XTAL,为什么速度反而提高了??
 楼主| as234827239 发表于 2013-3-3 19:51 | 显示全部楼层
补充:CLKSRC位写0也是同样效果,CLKSRC位的作用还是有点模糊,求大神解释!
缥缈九哥 发表于 2013-3-3 20:31 | 显示全部楼层
具体看看新版本的手册吧。
 楼主| as234827239 发表于 2013-3-4 08:41 | 显示全部楼层
缥缈九哥 发表于 2013-3-3 20:31
具体看看新版本的手册吧。

九哥救命!
在void DrvSYS_Delay(uint32_t us)
{
        SysTick->LOAD = (us * (SystemCoreClock / 10000)) / 100;
        SysTick->VAL  = (0x00);
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;

    /* Waiting for down-count to zero */
    while((SysTick->CTRL & (1 << 16)) == 0);
}
中,SysTick->LOAD其实就是地址0xE000E000+0x0010,
而us是我们给的值,
SystemCoreClock追查到源头是
#define __HSI       (__IRC22M)      /* Factory Default is internal 22MHz */   ,在这里括号里面的(__IRC22M)是由前面的值是由
#define __XTAL      (12000000UL)
#define __RTC_XTAL  (32768UL)
#define __IRC22M    (22118400UL)
#define __IRC10K    (10000UL)
给定的,所以说SystemCoreClock其实就是12000000或32768或22118400或10000这四个值中的一个,
SysTick->VAL  = (0x00);这句是设置初值,
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;是设置系统时间的状态,
最后while((SysTick->CTRL & (1 << 16)) == 0);就是等待时间计数器跳到0,
所以说正常情况下只要改 #define __HSI       (__IRC22M)括号里面的内容,时间也就改变了,但是我把__IRC22M改成__RTC_XTAL,LED闪烁的时间反而变短了?求九哥解答!!(Ps:仔细看过关于系统时间的数据手册,还是找不到原因)
恋子炎 发表于 2013-3-4 19:03 | 显示全部楼层
这个问题很简单!
请先看你写的这2句:
#define __RTC_XTAL  (32768UL)
#define __IRC22M    (22118400UL)
发现什么问题没有,就算你把__IRC22M改为__RTC_XTAL,__RTC_XTAL代表的也是32768UL,由于宏定义是不能重复的,编译器只认第一个宏定义,所以就变快了呗!
 楼主| as234827239 发表于 2013-3-4 19:39 | 显示全部楼层
恋子炎 发表于 2013-3-4 19:03
这个问题很简单!
请先看你写的这2句:
#define __RTC_XTAL  (32768UL)

谢谢你的回答,但是好像你理解错了,我说的是把#define __HSI      (__IRC22M)里面的__IRC22M改成__RTC_XTAL,而不是改宏定义里面的,
恋子炎 发表于 2013-3-4 20:05 | 显示全部楼层
CLKSRC位是SYST_CSR(SysTick控制与状态寄存器)的[2]号位!
1:内核时钟(CPU)时钟用作SysTick的时钟
0:时钟源为内部参考时钟,这里就有5个始终来源可以选,由寄存器CLKSEL0的3~5位即STCLK_S位域决定,见附件图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
恋子炎 发表于 2013-3-4 20:37 | 显示全部楼层
DrvSYS_Delay函数中,LOAD的值和SystemCoreClock还有US是成正比的,SystemCoreClock越小,LOAD的值也越小,DELAY的时间也越小,对不对?

评论

!  发表于 2013-3-5 10:48

评分

参与人数 1威望 +1 收起 理由
as234827239 + 1 很给力!

查看全部评分

 楼主| as234827239 发表于 2013-3-4 21:32 | 显示全部楼层
恋子炎 发表于 2013-3-4 20:37
DrvSYS_Delay函数中,LOAD的值和SystemCoreClock还有US是成正比的,SystemCoreClock越小,LOAD的值也越小, ...

谢谢!初学看程序看得脑袋都短了,竟然把12M和32.768k按频率折成时间来看待了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

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