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