時(shí)間記錄:2023/12/11
一、時(shí)間的計(jì)算
STM32F103C8T6單片機(jī)為例,系統(tǒng)時(shí)鐘為72MHz,則一個(gè)時(shí)鐘周期為(1/72M)秒,即1/72us
二、寄存器介紹
(1)CTRL控制及狀態(tài)寄存器
位段 | 名稱 | 描述 |
---|---|---|
16 | COUNTFLAG | 當(dāng)計(jì)數(shù)到0時(shí),該位置為1,當(dāng)讀取該位時(shí),自動(dòng)清零 |
2 | CLKSOURCE | 值為0時(shí)選擇外部時(shí)鐘源,值為1時(shí)選擇內(nèi)核時(shí)鐘 |
1 | TICKINT | 值為1時(shí),計(jì)數(shù)到0產(chǎn)生SysTick中斷,值為0時(shí),計(jì)數(shù)到0無(wú)動(dòng)作 |
0 | ENABLE | SysTick使能位 |
(2)LOAD重裝載數(shù)值寄存器
位段 | 名稱 | 描述 |
---|---|---|
23:0 | RELOAD | 當(dāng)計(jì)數(shù)到零時(shí),自動(dòng)加載的計(jì)數(shù)值 |
(3)VAL當(dāng)前數(shù)值寄存器
位段 | 名稱 | 描述 |
---|---|---|
23:0 | CURRENT | 讀取時(shí)返回當(dāng)前倒計(jì)數(shù)的值,向其中寫(xiě)入值時(shí),自動(dòng)清零并且會(huì)清除CTRL寄存器的COUNTFLAG位 |
三、配置步驟
3.1 配置時(shí)鐘源
3.2 計(jì)算延時(shí)1us和1ms的時(shí)鐘周期
3.3 裝入自動(dòng)重裝載值
3.4 向當(dāng)前值寄存器寫(xiě)入值
3.5 使能SysTick開(kāi)始計(jì)數(shù)
3.6 循環(huán)判斷是否到達(dá)計(jì)數(shù)值
3.7 清除SysTick使能位停止計(jì)數(shù)
四、代碼展示
頭文件(.h文件)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-821351.html
#ifndef __DELAY_H__
#define __DELAY_H__
#include "stm32f10x.h"
static int fac_us=0;
static int fac_ms=0;
//滴答定時(shí)器初始化
void vDelayInit(void);
//計(jì)時(shí)微妙
void vDelayUs(u32 nus);
//計(jì)時(shí)毫秒
void vDelayMs(u16 nms);
#endif
源文件(.c文件)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-821351.html
#include "delay.h"
void vDelayInit(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//配置時(shí)鐘源為外部時(shí)鐘9MHz,一個(gè)時(shí)鐘周期時(shí)間為1/9us
fac_us=SystemCoreClock/8/1000000;//計(jì)算1us的計(jì)數(shù)周期,9個(gè)周期,即9*1/9=1us
fac_ms=fac_us*1000;//計(jì)算1ms的計(jì)數(shù)周期
}
void vDelayUs(u32 nus)
{
u32 temp;
SysTick->LOAD = fac_us*nus; //自動(dòng)重裝載值寄存器,當(dāng)計(jì)數(shù)到0時(shí),將被重裝載的值
SysTick->VAL = 0x00; //當(dāng)前值寄存器,返回當(dāng)前倒計(jì)數(shù)的值,寫(xiě)它則使之清零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能,開(kāi)始計(jì)數(shù)
do{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //使能位沒(méi)有清零,并且COUNTFLAG=0(沒(méi)有數(shù)完)
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //失能,停止計(jì)數(shù)
SysTick->VAL = 0x00;
}
void vDelayMs(u16 nms)
{
if(nms>1864){//由于是24位寄存器,最大計(jì)數(shù)為0xFFFFFF=16777215/9000=1864
return;
}
u32 temp;
SysTick->LOAD = (u32)fac_ms*nms; //自動(dòng)重裝載值寄存器,當(dāng)計(jì)數(shù)到0時(shí),將被重裝載的值
SysTick->VAL = 0x00; //當(dāng)前值寄存器,返回當(dāng)前倒計(jì)數(shù)的值,寫(xiě)它則使之清零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能,開(kāi)始計(jì)數(shù)
do{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //使能位沒(méi)有清零,并且COUNTFLAG=0(沒(méi)有數(shù)完)
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //失能,停止計(jì)數(shù)
SysTick->VAL = 0x00;
}
到了這里,關(guān)于STM32系統(tǒng)滴答定時(shí)器SysTick實(shí)現(xiàn)精確ms和us延時(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!