在之前分享的资料中有一份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++; }
打印出的值与电脑时钟的秒针对比着看,是否同步。效果还是可以得。