打印
[新手园地]

求助,nuc120的DrvSYS_Delay()函数中的时钟设置问题

[复制链接]
2123|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在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:仔细看过关于系统时间的数据手册,还是找不到原因)

使用特权

评论回复
5
恋子炎| | 2013-3-4 19:03 | 只看该作者
这个问题很简单!
请先看你写的这2句:
#define __RTC_XTAL  (32768UL)
#define __IRC22M    (22118400UL)
发现什么问题没有,就算你把__IRC22M改为__RTC_XTAL,__RTC_XTAL代表的也是32768UL,由于宏定义是不能重复的,编译器只认第一个宏定义,所以就变快了呗!

使用特权

评论回复
6
as234827239|  楼主 | 2013-3-4 19:39 | 只看该作者
恋子炎 发表于 2013-3-4 19:03
这个问题很简单!
请先看你写的这2句:
#define __RTC_XTAL  (32768UL)

谢谢你的回答,但是好像你理解错了,我说的是把#define __HSI      (__IRC22M)里面的__IRC22M改成__RTC_XTAL,而不是改宏定义里面的,

使用特权

评论回复
7
恋子炎| | 2013-3-4 20:05 | 只看该作者
CLKSRC位是SYST_CSR(SysTick控制与状态寄存器)的[2]号位!
1:内核时钟(CPU)时钟用作SysTick的时钟
0:时钟源为内部参考时钟,这里就有5个始终来源可以选,由寄存器CLKSEL0的3~5位即STCLK_S位域决定,见附件图片

QQ截图20130304200344.png (73.22 KB )

CLKSEL0的STCLK_S位域

CLKSEL0的STCLK_S位域

使用特权

评论回复
8
恋子炎| | 2013-3-4 20:37 | 只看该作者
DrvSYS_Delay函数中,LOAD的值和SystemCoreClock还有US是成正比的,SystemCoreClock越小,LOAD的值也越小,DELAY的时间也越小,对不对?

使用特权

评论回复
评论
as234827239 2013-3-5 10:48 回复TA
! 
评分
参与人数 1威望 +1 收起 理由
as234827239 + 1 很给力!
9
as234827239|  楼主 | 2013-3-4 21:32 | 只看该作者
恋子炎 发表于 2013-3-4 20:37
DrvSYS_Delay函数中,LOAD的值和SystemCoreClock还有US是成正比的,SystemCoreClock越小,LOAD的值也越小, ...

谢谢!初学看程序看得脑袋都短了,竟然把12M和32.768k按频率折成时间来看待了。

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝