直接看第五节就是定时函数. 下面的内容都是在介绍原理
3.0 版以后的 STM32 固件库在标准外设库中移除了 SysTick 的驱动,因此用户必须调用
CMSIS 定义的函数。
CMSIS 只提供了一个 SysTick 设置的函数,替代了 STM32 原有 SysTick 驱动的全部函数。
SysTick_Config(uint32_t ticks);
-SysTick 计时器是 24 位的,所以设置参数的时候不要超过 24 位的范围。
一. 什么是系统定时器 SysTick
SysTick:系统定时器,24位,只能递减,存在于内核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。
- 系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间
基准。 - 默认systick中断优先级是最低的
二. systick的相关寄存器(了解)
三. 定时时间计算
一个计数循环的事件t = 重装载值RELOAD *(1 / 时钟Systick_CLK)
以9M 时钟, 9000计数值为例:
t= 9000*(1/9000000) = 0.001s = 1ms
四. SysTick_Type结构体和SysTick_Config()
都在 core_m3.h
中定义
SysTick_Config()函数
参数: ticks
SysTick 计时器是 24 位的,所以设置参数的时候不要超过 24 位的范围。
返回值: 1: 设置错误 0:设置成功
五. 实现1ms 1us定时函数
不用中断, 用1个方法实现计时
psb_systick.h
#ifndef PSB_SYSTICK_H
#define PSB_SYSTICK_H
#include "stm32f10x.h"
#include "core_cm3.h"
void SysTick_delay_ms(uint32_t ms);
void SysTick_delay_us(uint32_t us);
#endif /*PSB_SYSTICK_H*/
psb_systick.c
#include "psb_systick.h"
void SysTick_delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i=0; i<ms ; i++)
{
while(!((SysTick->CTRL) & (1<<16)));
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
void SysTick_delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72);
for(i=0; i<us ; i++)
{
while(!((SysTick->CTRL) & (1<<16)));
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
网友评论