打印
[STM32F4]

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

[复制链接]
2150|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lin-811|  楼主 | 2013-11-30 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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时钟。
求高手指点,不胜感激
沙发
_icmcu_study| | 2013-11-30 17:38 | 只看该作者
SysTick->CTRL|=(1<<2);                 //选择 HCLK
这条语句已经打时钟源切换到了HCLK,所以肯定是168M了啊

使用特权

评论回复
板凳
east森林| | 2013-11-30 20:56 | 只看该作者
高手们,来研究一下啊

使用特权

评论回复
地板
caijie187| | 2013-11-30 21:28 | 只看该作者
不懂帮顶

使用特权

评论回复
5
地瓜patch| | 2013-11-30 22:14 | 只看该作者
软件延时,要知道程序每条指令的周期,而且要与系统时钟配合

使用特权

评论回复
6
zhangjin_comeon| | 2013-11-30 22:18 | 只看该作者
软件延时  不好准确计算

使用特权

评论回复
7
Lin-811|  楼主 | 2013-12-2 09:01 | 只看该作者
_icmcu_study 发表于 2013-11-30 17:38
SysTick->CTRL|=(1

可能重新编辑的时候不小心把注销符号删掉了。。。

使用特权

评论回复
8
Lin-811|  楼主 | 2013-12-2 09:02 | 只看该作者
地瓜patch 发表于 2013-11-30 22:14
软件延时,要知道程序每条指令的周期,而且要与系统时钟配合

做延时的时候不是可以重新选择延时的时钟吗?

使用特权

评论回复
9
地瓜patch| | 2013-12-2 10:46 | 只看该作者
我说的软件延时是,用循环延时,不是定时计数器延时

使用特权

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

本版积分规则

3

主题

15

帖子

0

粉丝