这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32L053 利用SysTick实现精准延时

共3条 1/1 1 跳转至

STM32L053 利用SysTick实现精准延时

高工
2015-11-19 01:52:04     打赏

在之前分享的资料中有一份PDF文件http://share.eepw.com.cn/share/download/id/381630 在这个文档里有Systick的介绍。


需要设置的主要有三个寄存器:

上图中STK_CSR寄存器主要是设置时钟源,是否产生异常请求,是否使能计数。

第二个寄存器是存放计数器减到0时重载的数值。第三个寄存器是计数器当前值


uint32_t ui_opt_us;
uint32_t ui_opt_ms;

void delay_init()
{
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
	ui_opt_us = HAL_RCC_GetHCLKFreq() / 8000000;
	ui_opt_ms = ui_opt_us * 1000;
}

void delay_us(uint32_t xus)
{
	uint32_t ui_tmp = 0x00;
	SysTick->LOAD = xus * ui_opt_us;
	SysTick->VAL = 0x00;
	SysTick->CTRL = 0x01;
	
	do
	{
		ui_tmp = SysTick->CTRL;
	}while((ui_tmp & 0x01) && (!(ui_tmp & (1 << 16))));
	
	SysTick->CTRL = 0x00;
	SysTick->VAL = 0x00;
	
}

void delay_ms(uint32_t xms)
{
	uint32_t ui_tmp = 0x00;
	SysTick->LOAD = xms * ui_opt_ms;
	SysTick->VAL = 0x00;
	SysTick->CTRL = 0x01;
	
	do
	{
		ui_tmp = SysTick->CTRL;
	}while((ui_tmp & 0x01) && (!(ui_tmp & (1 << 16))));
	
	SysTick->CTRL = 0x00;
	SysTick->VAL = 0x00;
	
}

 

测试延时函数:

	delay_init();
  while (1)
  {
		printf("-->%d\n\r",ui_time_count);
		delay_ms(1000);
		ui_time_count++;
  }

 

打印出的值与电脑时钟的秒针对比着看,是否同步。效果还是可以得。




关键词: STM32L053     SysTick     精准     延时    

专家
2015-11-19 08:31:19     打赏
2楼
好好学习

院士
2015-11-19 11:24:57     打赏
3楼

这种方式的延迟可以用来DIY玩,

但是在产品级的应用里,这样的延迟可是使不得呀~~


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]