欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32F103 定时器

程序员文章站 2024-02-21 20:52:58
...
定时器的时钟源可以是内部时钟,或者外部时钟。

STCLK的具体来源则由芯片设计者决定,不同产品之间的时钟频率可能会不相同。这里使用外部时钟源。

STM32F103 定时器
Cortex-M3的内核中包含一个SysTick时钟。
SysTick为一个24位递减计数器,SYsTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1,
计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发

中断(如果中断使能)。

SysTick属于NVIC控制部分,一共有四个寄存器:

STM32F103 定时器

STM32F103 定时器

STM32F103 定时器

void delay_us(u32 nus)
{
	u32 temp;
	SysTick->LOAD = 9*nus;	// 在系统时钟位72MHz下,8分频后为9MHz,经过1us减9,即1us发生9次动作
	SysTick->VAL = 0x00;	//清空计数器,就会把SysTick->LOAD中的值加载进来
	SysTick->CTRL = 0x01;	//使能,减到0无动作,采用外部时钟源
	
	do {
		temp = SysTick->CTRL;	//读取当前计数值
	}	while( (temp & 0x01) && (!(temp &(1 << 16))) );
	
	SysTick->CTRL = 0x00;	// 关闭计数器
	SysTick->VAL = 0x00;	//清空计数器
	
}

void delay_ms(u32 nms)
{
	u32 temp;
	SysTick->LOAD = 9000*nms;	// 
	SysTick->VAL = 0x00;	//清空计数器,就会把SysTick->LOAD中的值加载进来
	SysTick->CTRL = 0x01;	//使能,减到0无动作,采用外部时钟源
	
	do {
		temp = SysTick->CTRL;	//读取当前计数值
	}	while( (temp & 0x01) && (!(temp &(1 << 16))) );
	
	SysTick->CTRL = 0x00;	// 关闭计数器
	SysTick->VAL = 0x00;	//清空计数器
	
}