STM32F103 定时器
程序员文章站
2024-02-21 20:52:58
...
定时器的时钟源可以是内部时钟,或者外部时钟。
STCLK的具体来源则由芯片设计者决定,不同产品之间的时钟频率可能会不相同。这里使用外部时钟源。
Cortex-M3的内核中包含一个SysTick时钟。
SysTick为一个24位递减计数器,SYsTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1,
计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发
中断(如果中断使能)。
SysTick属于NVIC控制部分,一共有四个寄存器:
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; //清空计数器
}
上一篇: Android发送邮件的方法实例详解