STM32-配置SysTick定时器

    相信大家在使用STM32的过程中,一直都想配置并且使用定时器吧,下面小编就带大家了解SysTick定时器。

SysTick定时器是什么?

    从原理上来说,Systick定时器和开发板上的通用定时器没有区别。从功能上来说,Systick定时器主要是用来用来进行延时的(就是让CPU一直重复计数这件事),而通用或者高级定时器往往用来进行PWM输出、输入捕获等功能。至于为什么不用通用定时器或者高级定时器来完成延时功能,则是考虑到节省MCU的资源来做更重要的事。

Systick定时器相关寄存器

地址 名称 类型 复位值 描述
0xE000E010 STK_CTRL RW 0x0000 0000 STK的控制和状态基础器
0xE000E014 STK_LOAD RW 不确定 STK的重载值寄存器
0xE000E018 STK_VAL RW 不确定 STK的当前值寄存器
0xE000E01c STK_CALIB RO 不确定 STK 的标定值寄存器

实现函数

    Systick定时器在工作时,先将LOAD中存放的值放入VAL中,然后VAL中的值会在每个时钟周期中减1直到变成0,变成0并且有开启中断的前提下,就会触发中断。这里还需要注意的是LOAD是24位的,也就是最大值为FFFFFF

/*
	* @brief microsecond dealy(微秒级延时)
	* @param i:time to be delayed(延时时间)
	* @retval none
*/
void delay_us(u32 i){
	//u32表示uint32_t数据类型
	u32 temp = 0;
	SysTick->LOAD = 9*i;
	//使能状态,减到0是无动作,采用的是外部时钟源
	SysTick->CTRL = 1;
	//清空计数器
	SysTick->VAL = 0;
	do{
		temp = SysTick->CTRL;//获取当前计数值
	}while((temp&0x01) && (!(temp&(1<<16))));
	SysTick->CTRL = 0;//关闭计数器
	SysTick->VAL = 0;//清空计数器
}

/*
	* @brief millisecond dealy(毫秒级延时)
	* @param i:time to be delayed(延时时间)
	* @retval none
*/
void dealy_ms(u32 i){
	delay_us(i*1000);//毫秒与微秒的进制就是1000,因此微秒延时扩大1000倍就是毫秒延时	
}

你可能感兴趣的:(#,STM32,单片机,stm32,单片机,arm)