一、SysTick使用詳解
1. SysTick簡介
SysTick是一個24位的系統節拍定時器system tick timer,SysTick,具有自動多載和溢位中斷功能,所有基于Cortex_M3處理器的微控制器都可以由這個定時器獲得一定的時間間隔,
2. SysTick相關暫存器
狀態暫存器-CTRL
STCLK外部時鐘源:AHB總線時鐘的 1/8
FCLK 內部時鐘:AHB總線時鐘——STM32F103是72MHz

重裝載數值暫存器-LOAD

當前值暫存器-VAL

校準暫存器-CALIB

二、撰寫精準延時——delay
delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
void delay_s(u16 s);
void delay_ms(u16 ms);
void delay_us(u32 us);
#endif
delay.c
#include "delay.h"
#define AHB_INPUT 72 //請按RCC中設定的AHB時鐘頻率填寫到這里(單位MHz)
void delay_us(u32 uS) //uS微秒級延時程式(參考值即是延時數,72MHz時最大值233015)
{
u32 temp;
SysTick->LOAD=AHB_INPUT*uS; //重裝計數初值(當主頻是72MHz,72次為1微秒)
SysTick->VAL=0x00; //清空定時器的計數器
SysTick->CTRL=0x00000005; //內部時鐘FCLK,打開定時器
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16))); //等待時間到達
SysTick->CTRL=0x00000004; //關閉定時器
SysTick->VAL=0x00; //清空定時器的計數器
}
void delay_ms(u16 ms) //mS毫秒級延時程式(參考值即是延時數,最大值65535)
{
while( ms-- != 0)
{
delay_us(1000); //呼叫1000微秒的延時
}
}
void delay_s(u16 s) //S秒級延時程式(參考值即是延時數,最大值65535)
{
while( s-- != 0)
{
delay_ms(1000); //呼叫1000毫秒的延時
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254824.html
標籤:其他
