基本函数--delay

delay头文件分为三个函数

static u8  fac_us=0;//us延时倍数						
static u16 fac_ms=0;//ms延时倍数	
delay_init(void);
delay_ms(u16 nms);
delay_us(u32 nus);

delay_init(void)函数

//选择时钟源函数
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

//SystemCoreClock 定义在芯片文件中  SYSCLK_FREQ_72MHz  72000000
//定义了系统时钟的频率常量  72MHz
//系统时钟通常与微控制器的主时钟源(如晶振或PLL输出)相关
//和现实的1us没什么关系,这里只是定义 1us是当前这个系统时钟的1/8
fac_us=SystemCoreClock/8000000;//8Mhz


// 1000us=1ms
fac_ms=(u16)fac_us*1000;

选择时钟源函数 SysTick->CTRL其中的一个标志位

主时钟 1/72MHz = 13.89ns

8分频时钟,减少能耗,精度变差 1/9MHz= 111.1111 ns

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  //检查参数是不是合理
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  //是不是选择时钟
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else //选择分频时钟
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

delay_us(u32 nus)函数;

当你设置了 SysTick->LOAD 寄存器的值后,SysTick 定时器开始从该值开始递减。SysTick->CTRL 寄存器中的 ENABLE 位会被设置为 1,表示定时器启用。

//nus表示我们想要的延时 us数
void delay_us(u32 nus)
{		
	u32 temp;
    //这个寄存器用于设置定时器的重载值,即 SysTick 定时器计数到达这个值时会重新加载并重新开始计数
    //  	 
	SysTick->LOAD=nus*fac_us; 

    //你可以读取它来查看当前定时器的计数值,
    //将 VAL 寄存器清零意味着将定时器的当前计数器值设为 0。此时,定时器的计数开始被清除,下一次定时器递减会从 LOAD 值开始(强制)。					 		 
	SysTick->VAL=0x00;

    //时钟使能,表示开始计时        					
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;

    //计时完成后,SysTick->CTRL寄存器的标志为改变
    //具体就是 检查(temp&0x01) 和  !(temp&(1<<16) 这个标志位,如果满足就表示计时结束	  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));

    //关闭计时使能位,关闭计时时钟		   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;

	SysTick->VAL =0X00;      						 
}

delay_ms(u16 mus)函数;

//与上一个函数同理
void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;				
	SysTick->VAL =0x00;							
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;	
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));		
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	
	SysTick->VAL =0X00;       					    
} 

时钟计数器的结构体,定义了一些寄存器

typedef struct
{
  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
} SysTick_Type;
posted @   流光最璀璨i  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示