您的位置 首页 被动

STM32延时函数剖析

Cortex-M3内核处理器有个systick24位倒计时定时器,当计数到0时,重新装载初值delay_init(u8SYSCLK)定时初始化函数分析{

Cortex-M3内核处理器有个systick 24位倒计时守时器,当计数到0时,从头装载初值.

delay_init(u8 SYSCLK) //守时初始化函数剖析
{
Systick->CTRL&=0xfffffffb; //bit2清空,挑选外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}

摘自STM32手册
6.2.6

体系时钟(SYSCLK)挑选
体系复位后,HSI振荡器被选为体系时钟。当时钟源被直接或通过PLL直接作为体系时钟时,它将不能被中止。
只有当方针时钟源预备安排妥当了(通过发动安稳阶段的推迟或PLL安稳),从一个时钟源到另一个时钟源的切换才会产生。在被挑选时钟源没有安排妥当时,体系时钟的切换不会产生。直至方针时钟源安排妥当,才产生切换。
在时钟操控寄存器(RCC_CR)里的状况位指示哪个时钟现已预备好了,哪个时钟现在被用作体系时钟。

Systick时钟那里来?

Systick时钟由体系时钟8分频后决议.

解析delay_us(u32 nus)函数

void delay_us(u32 nus)
{
u32 temp;
Systick->LOAD=nus*fac_us; //装入守时值
Systick->VAL=0x00; //清空计数器值
Systick->CTRL=0x01; //敞开倒计时守时器
do
{
temp=Systick->CTRL; //守时器状况赋给变量
}while((temp&0x01)&&(temp&(1<<16))); //判别敞开和是否计数到了0 (抵达设定值)
Systick->CTRL=0x00; //封闭守时
Systick->VAL=0x00; //清空计数值

}

守时1us剖析:
由于Systick时钟设置为是体系时钟的8分频 ,假定SYSCLK=72M 则Systick=9MHZ

由于fac_us是基数无单位

fac_us=SYSCLK/8; 即72/8=9 则Systick->LOAD=nus*fac_us, 假定守时1us 则Systick->LOAD=9.
由于Systick是9M的速度倒计时 所以9个计数时刻为9*(1/9M) 便是1us

有必要确保nus<=(2^24)/fac_us 编程实例: I/O口输出500us方波

#include
#include “sys.h”
#include “delay.h”
#include “usart.h”
#define LED0 PBout(0)
#define LED1 PBout(1)
void led_init(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0xffffff00;
GPIOB->CRL|=0x00000033; //推挽输出
GPIOB->ODR|=0xffff;
}
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
led_init();
while(1)
{
LED0=0;
delay_us(500);
LED0=1;
delay_us(500);
}
}

delay_ms(u16 nms)函数剖析:

void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时刻加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开端倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时刻抵达
SysTick->CTRL=0x00; //封闭计数器
SysTick->VAL =0X00; //清空计数器
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/318353.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部