2021-11-04

STM32嘀嗒定时器编程步骤(个人学习总结)

基本知识

SysTick 属于CM3,CM4内核芯片内部资源。一个24位的倒
计数定时器,计到0时,将从RELOAD寄存器中自
动重装载定时初值,在睡眠模式也能工作。可以产生中断。当前值减到0时,可以产生中断,并且得到重装载寄存器的值

寄存器

  1. CTRL SysTick控制和状态寄存器
  2. LOAD SysTick自动重装载除值寄存器;
  3. VAL SysTick当前值寄存器CALIB(一个SysTick时钟周期减1)
  4. SysTick 校准值寄存器(不常用)

寄存器具体的位

1.CTRL-控制和状态寄存器(SysTick_CLKSourceConfig函数可配置时钟源)
在这里插入图片描述
2.LOAD-重装载数值寄存器
在这里插入图片描述

3.VAL-当前数值寄存器
在这里插入图片描述

程序编写步骤(循环定时)

一、正点原子思路
1、嘀嗒定时器初始化

static u8  fac_us=0;							//us延时倍乘数			   
static u16 fac_ms=0;						//ms延时倍乘数,在ucos下,代表每个节拍的ms数

 void delay_init()
 {
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//设置 SysTick 时钟源,此时SysTick时钟为9M,一个SysTick时钟周期为1/9M
		 
	   fac_us=9;//延时1us则需要9个SysTick时钟周期
		 fac_ms=9000;//延时1ms则需要9000个SysTick时钟周期
	 
//		fac_us=SystemCoreClock/8000000;	
//		fac_ms=(u16)fac_us*1000;	 
 }

2、微秒延时

void delay_us(unsigned int nus)
{
 u32 tepm;
	SysTick->LOAD=nus*fac_us;//重装载值 由初始化可以得到1us的因子
	SysTick->VAL=0x00;           //清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;  //开始计数
	
	do
	{
	  tepm=SysTick->CTRL;
	
	}
	while((tepm&0x01)&&!(tepm&(1<<16)));   //等待时间到达
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;  //关闭计数器
	SysTick->VAL=0x00;                          //清空计数器
	
}

3、毫秒延时

void delay_ms(unsigned int nms)
{
 u32 tepm;
	SysTick->LOAD=(u32)nms*fac_ms;//重装载值
	SysTick->VAL=0x00;           //清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;  //开始计数
	
	do
	{
	  tepm=SysTick->CTRL;
	
	}
	while((tepm&0x01)&&!(tepm&(1<<16)));   //等待时间到达
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;  //关闭计数器
	SysTick->VAL=0x00;                          //清空计数器
	
}

二、野火思路
1、微秒定时

void delay_us( __IO uint32_t us)
{
	uint32_t i;
	SysTick_Config(SystemCoreClock/1000000);//重装载值为72,72M的时钟频率1us则可由72减到0(一个SysTick时钟周期减一)
	
	for(i=0;i<us;i++)
	{
		// 当计数器的值减小到0的时候,CRTL寄存器的位16会置1	
		while( !((SysTick->CTRL)&(1<<16)) );
	}
	// 关闭SysTick定时器
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

2、毫秒延时

void delay_ms( __IO uint32_t ms)
{
	uint32_t i;	
	SysTick_Config(SystemCoreClock/1000);重装载值为72
	
	for(i=0;i<ms;i++)
	{
		// 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
		// 当置1时,读取该位会清0
		while( !((SysTick->CTRL)&(1<<16)) );
	}
	// 关闭SysTick定时器
	SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

3、SysTick_Config函数(参数设置重装载LOAD的值)

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  // reload 寄存器为24bit,最大值为2^24
	if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);
  
  // 配置 reload 寄存器的初始值	重转载寄存器
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
	
	// 配置中断优先级为 1<<4-1 = 15,优先级为最低
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); 
	
	// 配置 counter 计数器的值
  SysTick->VAL   = 0;
	
	// 配置systick 的时钟为 72M
	// 使能中断
	// 使能systick
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    
  return (0); 
}```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值