缥缈九哥 发表于 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:仔细看过关于系统时间的数据手册,还是找不到原因)
|