本帖最后由 Lin-811 于 2013-12-2 09:03 编辑
1、这种延时不准确
void Delay_Us(unsigned long Nus)
{
unsigned long temp;
SysTick->LOAD=168*Nus; //重装值
SysTick->VAL=0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&(!(temp&(1<<16))));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
void Delay_Ms(unsigned int nms)
{
unsigned long temp;
// SysTick->LOAD=(unsigned long)nms*168000;
SysTick->LOAD=nms;
SysTick->VAL =0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&(!(temp&(1<<16))));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
用这种方式不知道为什么不准确。非中断方式的延时程序。
2、选择了外部时钟,但是读取到的时钟还是168M
void Delay_Init(void)
{
RCC_ClocksTypeDef rcc_clocks;
u32 re;
// RCC->CFGR &=~(3<<2);
// RCC->CFGR |=(1<<3);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择HCLK/8
// SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); //选择 HCLK
SysTick->CTRL&=~(1<<2); //选择 HCLK/8
// SysTick->CTRL|=(1<<2); //选择 HCLK
// SystemCoreClock=21000000;
RCC_GetClocksFreq(&rcc_clocks);
re=rcc_clocks.HCLK_Frequency /1000000;
fac_us=SystemCoreClock/1000000;
fac_ms=(unsigned int)fac_us*1000;
LCD_ShowNum(40,80,re,10,RED);
LCD_ShowNum(40,40,fac_us,10,RED);
LCD_ShowNum(40,60,fac_ms,10,RED);
}
用库函数和寄存器都操作过,怎么选择HCLK/8出来都是168M时钟。
求高手指点,不胜感激 |