当前位置:   article > 正文

STM32 系统时钟初始化函数和延时函数

STM32 系统时钟初始化函数和延时函数

系统时钟初始化函数

  1. void Stm32 Clock nit(u8 PLL)
  2. {
  3. unsigned char temmp=0;
  4. MYRCC_Delnit(); //复位并配置向量表
  5. RCC->CR|=0x00010000; //把时钟控制寄存器的第16置1来开启外部振荡器
  6. while(!RCC->CR>>17); //通过判断时钟控制寄存器的第17位,看一下外部振荡器是否就绪
  7. RCC->CFCR=0X00000400; //通过设置时钟配置寄存器8-10位来保证APB1时钟频率不超过36MHZ。
  8. PLL-=2; //抵消2个单位
  9. RCC->CFGR|=PLL<<18; //设置PLL值
  10. ROC->CFGR|=1<<16; //外部时钟作为PLL输入时钟
  11. FLASH->ACR|=0x32; //FLASH 2个延时周期
  12. RCC->CRI=0x01000000; //通过时钟控制寄存器的第24位,使能PLL
  13. while(!(RCC->CR>>25)); //通过判断时钟控制寄存器的第25位,看一下PLL是否就绪
  14. RCC->CFGR|=0x00000002; //通过设置时钟配置寄存器0-1位把PLL作为系统时钟
  15. whiler(temp!=0x02); //等待PLL作为系统时钟设置成功
  16. {
  17. temp=RCC>CFGR>>2;
  18. temmp&=0x03;
  19. }
  20. }

延时函数

         如果我们需要得到精确的定时,那么我们可以使用STM32中的定时器(时钟9M,1微秒减9),例如,SysTick 定时器。SysTick是一个24位的递减计数器,它放在NVIC中,主要目的是为了给操作系统提供一个硬件上的中断(滴答中断)。SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。计数到0 时,SvsTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(假如中断使能情况下)。在STM32中,SysTick定时器可以用来作为操作系统的滴答定时器。如果我们的程序不使用操作系统,那么SysTick定时器可以用来产生精确的定时。

  1. //初始化延迟函数
  2. //SYSTICK的时钟固定为HCLK时钟的1/8
  3. //SYSCLK:系统时钟
  4. void delay_init(u8 SYSCLK)
  5. {
  6. SysTick->CTRL&=0xfffffffb; //bit2清空,选外部时钟 HCLK/8
  7. fac_us=SYSCLK/8:
  8. fac_ms=(u16)fac_us*1000;
  9. }
  1. //延时nus
  2. //nus为要延时的us数
  3. //n为10,20,30,.....
  4. void delay_us(u32 nus)
  5. {
  6. u32 temp;
  7. SysTick->LOAD=nus*fac_us; //时间加载
  8. SysTick->VAL=0x00; //清空计数器
  9. SysTick->CTRL=0x01; //开始倒数
  10. do
  11. {
  12. temp=SysTick->CTRL;
  13. }
  14. while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
  15. SysTick->CTRL=0x00;//关闭计数器
  16. SysTick->VAL =0X00://清空计数器
  17. }

要注意因为 LOAD 仅仅是一个24bit的寄存器,延时的ms数不能太长。否则超出了LOAD 的范围,高位会被舍去,导致延时不准。最大延迟ms数可以通过公式:n ms<=0xffffff *8*1000/SYSCLK 计算。SYSCLK 单位为Hz,nms的单位为ms。如果时钟为72M,那么nms的最大值为1864ms。超过这个值就会导致延时不准确。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/820063
推荐阅读
相关标签
  

闽ICP备14008679号