STM32F407非中断延时和系统时钟问题,求助

2019-07-21 05:12发布

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时钟。

求高手指点,不胜感激
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。