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

專注電子技術學習與研究
當前位置:單片機教程網 >> STM32 >> 瀏覽文章

第三講 STM32 SysTick---系統滴答定時器

作者:鵬心飛漾   來源:轉自鵬心飛漾   點擊數:  更新時間:2014年07月28日   【字體:

一、Systick簡介

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


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

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


 
 
4.  SysTick_CALRB    校準寄存器

 
由于我們要寫精確延時的LED流水燈,所以我們需要使用Systick進行精確延時,理論上它的最小計時單位為AHB的時鐘周期,1/72000000秒,72分之一微秒。
 
我們在昨天流水燈的基礎上,新建兩個文件,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);
 }
 //關閉滴答定時器
 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);
}
 
中斷函數,在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);
 }
}
這里面只有兩個函數,SysTick_Init()和Delay_us(),一個是配置SysTick定時器,一個是進行精確延時
中斷函數也只是運行了一個自定義函數,看看不難理解
SysTick_Config(SystemCoreClock/100000);
SystemCoreClock是系統時鐘的宏,SystemCoreClock = 72000000
我們的計時總時間 T = tick * (1/f),tick為SysTick_Config()的輸入參數
 
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在相應寄存器中的位置,如控制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,這樣搭配& | 能夠很方便的修改寄存器的某些位,這樣就程序就不難理解了.就說這么多吧,已經講得很多了,不懂得自己想想,琢磨一下就通了。

 

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲免费在线观看 | 一区二区三区在线 | 精品伦精品一区二区三区视频 | 中日韩欧美一级片 | 麻豆国产一区二区三区四区 | 日本一区二区高清不卡 | 天堂资源最新在线 | 日韩精品在线看 | 精品欧美色视频网站在线观看 | 亚洲黄色网址视频 | 免费观看色 | 人人看人人射 | 97国产一区二区精品久久呦 | 久久三区 | 中文字幕精品一区二区三区精品 | 天堂视频中文在线 | 中文字幕视频一区二区 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 国产成人区 | 精品久久久久久 | 亚洲一区二区三区四区五区中文 | 国产在线播放一区二区三区 | 日日夜夜狠狠操 | av片免费观看 | 久久久999国产精品 中文字幕在线精品 | 国产精品久久久久久久久 | 男人av在线 | 中文字幕一区二区在线观看 | 国产午夜精品一区二区三区 | 亚洲欧洲精品成人久久奇米网 | 日本午夜精品 | 中文字幕在线观看一区 | 干干干操操操 | 久久91av| 欧美久久视频 | 亚洲 中文 欧美 日韩 在线观看 | 国产成人麻豆免费观看 | 国产精品免费视频一区 | www.99热.com| 狠狠操电影 | 日韩欧美二区 |