STM32F103 SystemTick和delay的应用

24位的倒计数定时器,计数到0,产生一次中断,从LOAD寄存器中自动重装载,就这样永不停息。

与之相关的四个寄存器:

LOAD自动重装载值

VAL当前值寄存器

CALIB校准值寄存器

CTRL控制和状态

 外部时钟源是HCLK(AHB时钟总线)的1/8.

内核时钟是HCLK时钟。

配置函数SysTick_CLKSourceConfig();

 SysTick_Config(uint32_t ticks);

中断服务函数

void SysTick_Handler();

无OS的情况下,delay相关函数的说明

首先定义2个全局变量

static u8 fac_us=0; //
static u16 fac_ms=0;

含义是延时1个us或者ms需要的tick数

因为AHB时钟频率是72MHz,意味着1秒钟有72M个节拍,一个节拍的时间为1/72M 秒

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

fac_us=SystemCoreClock/8000000;

fac_ms=(u16)fac_us*1000;

system tick时钟源为HCLK的1/8分频,意味着时钟频率是9MHz。一个tick时间1/9M 秒=1/9 us

所以一个us需要9个tick,一个ms需要9×1000个tick。

void delay_us(u32 nus)
{        
    u32 temp;             
    SysTick->LOAD=nus*fac_us; 
    SysTick->VAL=0x00;                
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;    
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));        //
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;    //
    SysTick->VAL =0X00;                           //
}

 注意:倒计时为0的时候,SysTick->CTRL的COUNTFLAG(第16位)就会为1

dowhile循环终止。

posted on 2017-12-11 14:02  legion  阅读(1104)  评论(0编辑  收藏  举报

导航