五、SysTick系统滴答定时器
1.寄存器介绍
(1)CTRL控制及状态寄存器。
| 位段 | 名称 | 描述 |
| 16 | COUNTFLAG | 当读取该寄存器时,计数到0,则该位为1,读取该位,自动清零 |
| 2 | CLKSOURCE | 0=外部时钟源,1内核时钟 |
| 1 | TICKINT | 1=倒数到0时产生SysTick异常请求,0=数到0时无动作 |
| 0 | ENABLE | 定时器使能位 |
(2)LOAD重装载数值寄存器。
| 位段 | 名称 | 描述 |
| 23:0 | RELOAD | 当倒数到0时,将被重装载的值 |
(3)VAL当前数值寄存器。
| 位段 | 名称 | 描述 |
| 23:0 | CURRENT | 读取时返回当前倒计数的值,写它则使之清零,同时会清除CTRL控制及状态寄存器中的COUNTFLAG标志 |
2.开发延时函数步骤
(1)选择时钟源;
(2)计算计数周期;
(3)编写延时函数。
3.代码示例
(1)选择时钟源、计算计数周期
1 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//配置时钟源 2 fac_us=SystemCoreClock/8/1000000;//计算1us的计数周期,9个周期 3 fac_ms=fac_us*1000;//计算1ms的计数周期9000个周期
(2)编写延时函数
1 void Delay_Us(u32 nus) 2 { 3 u32 temp; 4 SysTick->LOAD = fac_us*nus; //自动重装载值寄存器,当计数到0时,将被重装载的值 5 SysTick->VAL = 0x00; //当前值寄存器,返回当前倒计数的值,写它则使之清零 6 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能,开始计数 7 do{ 8 temp=SysTick->CTRL; 9 }while((temp&0x01)&&!(temp&(1<<16))); //使能位没有清零,并且COUNTFLAG=0(没有数完) 10 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //失能,停止计数 11 SysTick->VAL = 0x00; 12 }
4.库函数位置讲解
SysTick_CLKSourceConfig:时钟配置函数,misc.c文件中定义。
SystemCoreClock:系统时钟定义,system_stm32f10x.h中定义。
SysTick_CTRL_ENABLE_Msk:使能标志位定义,core_cm3.h中定义。

浙公网安备 33010602011771号