久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當前位置:單片機教程網(wǎng) >> STM32 >> 瀏覽文章

第三講 STM32 SysTick---系統(tǒng)滴答定時器

作者:鵬心飛漾   來源:轉(zhuǎn)自鵬心飛漾   點擊數(shù):  更新時間:2014年07月28日   【字體:

一、Systick簡介

    Systick也叫系統(tǒng)滴答定時器,滴答定時器就是一個非常基本的倒計時定時器。它存在的意義是為系統(tǒng)提供一個時基,能夠給操作系統(tǒng)提供一個硬件上的中斷。使用Systick能夠精準延時,對于時間要求嚴格的場所,意義十分重大,我將寫一個流水燈改進版----精確延時(可調(diào)控)的流水燈。
二、Systick timer
    Systick是一個24位的定時器,一次最多可以計數(shù)2^24個時鐘脈沖,這個脈沖計數(shù)值保存在當前計數(shù)值寄存器STK_VAL(Systick current value register)中,只能向下計數(shù),每接收到一個時鐘脈沖,STK_VAL的值就會向下減1,當減到0時,硬件會自動把重裝載寄存器STK_LOAD(Systick reload value register)中保存的數(shù)據(jù)加載到STK_VAL,重新開始向下計數(shù)。如果STK_VAL的值被減至0時,會觸發(fā)異常產(chǎn)生中斷。
三、相關(guān)寄存器介紹
除了上面說的STK_VAL,下面帶大家了解相關(guān)的寄存器和寄存器位。
1.  SysTick_CSR       控制狀態(tài)寄存器
 


Bit0: ENABLE
          SysTick timer的使能位,1使能Systick timer,0關(guān)閉Systick timer
Bit1: TICKINT
          異常觸發(fā)使能位,TICKINT=1,STK_VAL計數(shù)到0觸發(fā)異常;TICKINT=0,不觸發(fā)異常
Bit2: CLKSOURCE
          Systick時鐘選擇位,SysTick = 1,時鐘為AHB時鐘;0時鐘位AHB/8
Bit16:COUNTFLAG
          計數(shù)為0標志位, 當STK_VAL計數(shù)到0,此標志位會被置1       
 

2. SysTick_LOAD      重裝載寄存器
 
0-23 24位的重裝值,這也是為什么只能計數(shù)到2^24
3.  SysTick_VAL    當前值寄存器


 
 
4.  SysTick_CALRB    校準寄存器

 
由于我們要寫精確延時的LED流水燈,所以我們需要使用Systick進行精確延時,理論上它的最小計時單位為AHB的時鐘周期,1/72000000秒,72分之一微秒。
 
我們在昨天流水燈的基礎(chǔ)上,新建兩個文件,SysTick.c和SysTick.h
具體代碼如下
SysTick.h
#ifndef __SYSTICK_H__
#define __SYSTICK_H__
#include "stm32f10x.h"
void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
#endif
 
SysTick.c
#include "SysTick.h"
#include "stm32f10x.h"
static __IO u32 TimingDelay;
void SysTick_Init(void)
{
 if(SysTick_Config(SystemCoreClock/100000))
 {
  while(1);
 }
 //關(guān)閉滴答定時器
 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void TimingDelay_Decrement(void)
{
 if(TimingDelay != 0x00)
 {
  TimingDelay--;
 }
}
void Delay_us(__IO u32 nTime)
{
 TimingDelay = nTime;
 
 //使能滴答定時器
 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
 
 while(TimingDelay != 0);
}
 
中斷函數(shù),在stm32f10xit.c
void SysTick_Handler(void)
{
 TimingDelay_Decrement();
}
 
修改main.c如下
#include "stm32f10x.h"
#include "led.h"
#include "SysTick.h"


int main(void)
{
 //LED端初始化
 LED_GPIO_Config();
 
 //配置SysTick為10us中斷一次
 SysTick_Init();
 
 while(1)
 {
  LED1(0);
  Delay_us(50000);
  LED1(1);
  
  LED2(0);
  Delay_us(50000);
  LED2(1);
  
  LED3(0);
  Delay_us(50000);
  LED3(1);
  
  LED4(0);
  Delay_us(50000);
  LED4(1);
 }
}
這里面只有兩個函數(shù),SysTick_Init()和Delay_us(),一個是配置SysTick定時器,一個是進行精確延時
中斷函數(shù)也只是運行了一個自定義函數(shù),看看不難理解
SysTick_Config(SystemCoreClock/100000);
SystemCoreClock是系統(tǒng)時鐘的宏,SystemCoreClock = 72000000
我們的計時總時間 T = tick * (1/f),tick為SysTick_Config()的輸入?yún)?shù)
 
1/f為SysTick timer使用的時鐘源的時鐘周期,f為該時鐘源的時鐘頻率。
上面的語句中:tick = SystemCoreClock/100000=720,表示720個時鐘周期中斷一次,1/f是時鐘周期的時間,1/f = 1/72us,所以T = 720*(1/72) = 10us
SysTick_CTRL_ENABLE_Msk,這是一個宏,用來指示寄存器的特定位置或進行位屏蔽用的,那么他是如何定義的呢?


其中的寄存器位指示宏:SysTick_xxx_Pos, 宏展開后為xxx在相應(yīng)寄存器中的位置,如控制SysTick時鐘源的SysTick_CTRL_CLKSOURCE_Pos,宏展開后為2,正好是SysTick_CSR中的Bit2
寄存器的位屏蔽宏:SysTick_xxx_Msk,宏展開是xxx的位全部置1后,左移SysTick_xxx_Pos位,1ul使之無符號長整型,上圖中SysTick_CTRL_CLKSOURCE_Msk,宏展開為1ul<<SysTick_CTRL_CLKSOURCE_Pos,即1左移2位,得到的只有Bit2:CLKSOURCE位被置1,而其它位為0,這樣搭配& | 能夠很方便的修改寄存器的某些位,這樣就程序就不難理解了.就說這么多吧,已經(jīng)講得很多了,不懂得自己想想,琢磨一下就通了。

 

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 91看片免费 | 日韩欧美在线观看视频 | 精品成人免费视频 | 在线免费视频一区 | 久久国产精品免费一区二区三区 | 亚洲精品久久久一区二区三区 | 亚洲视频在线播放 | 91精品国产一区二区三区 | 亚洲精品视频观看 | 久久久精品视频免费看 | 日韩一区二区三区在线观看 | 中文字幕亚洲一区 | 亚洲一区三区在线观看 | 天天摸天天干 | 欧美日韩在线视频一区 | 国产精品毛片无码 | 婷婷五月色综合 | 欧美成人激情 | 欧美日韩在线一区二区三区 | 国产精品一区在线 | 国产农村妇女精品一二区 | 久久一级大片 | 日韩成人久久 | 国产色黄| 久久一区| 在线国产欧美 | 黄片毛片免费观看 | 精品一区二区不卡 | 日韩一区二区三区视频在线播放 | 美女二区 | 亚洲精品一区二区网址 | 国产精品精品视频一区二区三区 | 亚洲精品一区国语对白 | 亚洲精品中文字幕av | 亚洲一区二区av | 国产精品久久久久一区二区三区 | 亚洲日本一区二区三区四区 | 91视频网址| 天天草天天操 | 亚洲国产精品一区二区三区 | 91精品国产91久久久久久吃药 |