论坛» 嵌入式开发» STM32

STM32L053 利用SysTick实现精准延时

高工
2015-11-19 01:52 1楼

在之前分享的资料中有一份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++; }

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

专家
2015-11-19 08:31 2楼
好好学习
院士
2015-11-19 11:24 3楼

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

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

共3条 1/1 1 跳转至

回复

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