赞
踩
- void Stm32 Clock nit(u8 PLL)
- {
- unsigned char temmp=0;
- MYRCC_Delnit(); //复位并配置向量表
- RCC->CR|=0x00010000; //把时钟控制寄存器的第16置1来开启外部振荡器
- while(!RCC->CR>>17); //通过判断时钟控制寄存器的第17位,看一下外部振荡器是否就绪
- RCC->CFCR=0X00000400; //通过设置时钟配置寄存器8-10位来保证APB1时钟频率不超过36MHZ。
- PLL-=2; //抵消2个单位
- RCC->CFGR|=PLL<<18; //设置PLL值
- ROC->CFGR|=1<<16; //外部时钟作为PLL输入时钟
- FLASH->ACR|=0x32; //FLASH 2个延时周期
-
- RCC->CRI=0x01000000; //通过时钟控制寄存器的第24位,使能PLL
- while(!(RCC->CR>>25)); //通过判断时钟控制寄存器的第25位,看一下PLL是否就绪
- RCC->CFGR|=0x00000002; //通过设置时钟配置寄存器0-1位把PLL作为系统时钟
- whiler(temp!=0x02); //等待PLL作为系统时钟设置成功
- {
- temp=RCC>CFGR>>2;
- temmp&=0x03;
- }
- }
如果我们需要得到精确的定时,那么我们可以使用STM32中的定时器(时钟9M,1微秒减9),例如,SysTick 定时器。SysTick是一个24位的递减计数器,它放在NVIC中,主要目的是为了给操作系统提供一个硬件上的中断(滴答中断)。SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。计数到0 时,SvsTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(假如中断使能情况下)。在STM32中,SysTick定时器可以用来作为操作系统的滴答定时器。如果我们的程序不使用操作系统,那么SysTick定时器可以用来产生精确的定时。
- //初始化延迟函数
- //SYSTICK的时钟固定为HCLK时钟的1/8
- //SYSCLK:系统时钟
- void delay_init(u8 SYSCLK)
- {
- SysTick->CTRL&=0xfffffffb; //bit2清空,选外部时钟 HCLK/8
- fac_us=SYSCLK/8:
- fac_ms=(u16)fac_us*1000;
- }
- //延时nus
- //nus为要延时的us数
- //n为10,20,30,.....
-
- void delay_us(u32 nus)
- {
- u32 temp;
- SysTick->LOAD=nus*fac_us; //时间加载
- SysTick->VAL=0x00; //清空计数器
- SysTick->CTRL=0x01; //开始倒数
-
- do
- {
- temp=SysTick->CTRL;
- }
- while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
- SysTick->CTRL=0x00;//关闭计数器
- SysTick->VAL =0X00://清空计数器
- }
要注意因为 LOAD 仅仅是一个24bit的寄存器,延时的ms数不能太长。否则超出了LOAD 的范围,高位会被舍去,导致延时不准。最大延迟ms数可以通过公式:n ms<=0xffffff *8*1000/SYSCLK 计算。SYSCLK 单位为Hz,nms的单位为ms。如果时钟为72M,那么nms的最大值为1864ms。超过这个值就会导致延时不准确。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。