LPC1114系統定時器(SysTick)

2021-01-13 電子產品世界
LPC1114內部有一個特殊的定時器——系統定時器SysTick),它位於Cortex-M0內核裡面,是ARM內核的一部分,主要用來給作業系統提供時間片輪轉的定時,一般固定為10ms的定時,所以中文也稱它為「嘀噠」定時器。在不跑作業系統時,可以把它當作普通定時器來用,一般用來進行程序延時。在前面的第一個演示示例中就用到過,下面就來討論一下如何運用SysTick來提供延時。

系統定時器也位於「私有外設總線」(Private peripheral bus)內,其地址為0xE000E010~0xE000E01F。下面先來看一下SysTick的內部結構,如下圖所示。

本文引用地址:http://www.eepw.com.cn/article/201611/316325.htm

從上圖中可以看出,SysTick定時器的位長度是24位,即最長的計數次數為16777216次,且計數為倒數計數形式,遞減到0時產生中斷請求。計數的脈衝可直接取系統時鐘,也可取半系統時鐘。下表給出了和SysTick相關的寄存器。

上表中,SYST_CSR是系統定時器的控制寄存器,負責SysTick的啟動、中斷使能、輸入時鐘選擇、溢出標誌讀取等操作;SYST_RVR是系統定時器的初始值重載寄存器,負責SysTick的24位初值載入;SYST_CVR是系統定時器的當前值寄存器,負責獲取SysTick的24位當前計數值,當對該寄存器進行寫操作時,該寄存器的數值將會被清零;SYST_CALIB是系統定時器的校準值寄存器,負責SysTick的校準。

下面給出的是上表中控制寄存器SYST_CSR的全部位結構。

從表中可以看出,第0位是使能SysTick,值為1啟動計數,值為0關閉計數;第1位是SysTick的中斷使能位,值為1使能中斷,值為0禁能中斷;第2位是輸入時鐘的選擇位,值為1時選擇系統時鐘做為計數脈衝,值為0時選擇半系統時鐘做為計數脈衝的參考時鐘;第16位是溢出標誌位,當計數的值遞減到0時,該位被置1,在讀取該置後自動清零。

從上述可以看出,其實系統定時器就是一個普通的定時器,在使用時順序進行如下操作即可:

1.給SYST_RVR寄存器寫入初始值;

2.寫SYST_CVR寄存器以對計數值進行清零;

3.設置SYST_CSR寄存器啟動定時、使能中斷以及選擇時鐘源。

下面給出系統時鐘SysTick的結構體定義。

typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
} SysTick_Type;

SysTick定時器組的基址為0xE000E000,所以要將基址指針強制轉換為上述結構體,還要加上下面的定義。

#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */

對於系統定時器SysTick產生的中斷,也有特定的入口函數,形式如下所示。

void SysTick_Handler(void)

{

系統定時中斷服務程序部分

}

接下來討論一下系統定時器的初始值設置,因為定時的時長由系統時鐘頻率、系統時鐘選擇和載入的初始值共同決定。假設系統時鐘為48MHz,默認情況下SysTick的CLKSOURCE值為0,即選擇半系統時鐘頻率。這樣,輸入給定時器計數的時鐘就是48/2=24MHz,計數周期為1/(24MHz)=1/24us,則計24次就是1us的定時,但實際上SysTick採用的是倒數計數方式,即從最大值依次遞減計數直到0產生溢出信號。所以24次計數實際上是0~23次,即最大值要減1,即24-1=23。同時要注意,由於計數位寬是24位,所以最大計數值不能超過2的24次方(即16777216),由此,可得出微秒級的初始值計算公式,如下:

LOAD=((24*us)-1),其中us取值範圍1~699000

同理可得出毫秒級的初始值計算公式:

LOAD=((24000*ms)-1),其中ms取值範圍1~699

上升到一般情況,定時初始值可用下面的公式來計算:

上式中,系統時鐘SysClk的單位是MHz,CLKSOURCE的值是0或1,得到的是微秒級別的定時,要注意LOAD的值不能大於16777216。

下面來看一下前面第一個演示示例中的延時部分,代碼如下:

static volatile uint32_t TimeTick = 0; //設置全局變量

void SysTick_Handler(void)

{

TimeTick++; //系統定時中斷中,全局變量加1

}

void delay_ms(uint32_t ms)

{

SysTick->LOAD = (((24000)*ms)-1); //載入初始值

SysTick->VAL = 0;//寫當前值寄存器使其清零

SysTick->CTRL |= ((1<<1)|(1<<0)); //打開中斷,啟動定時器,選擇關系統時鐘

while(!TimeTick);

TimeTick = 0; //當定時時間到時,全局變量清零

SysTick->CTRL =0;//關閉定時器

}

可見上述定時是毫秒級別的,最長可定時699ms。

至此,第一個演示示例中的全部內容就都討論完了,可見在LPC1114中要實現一個簡單的十二個LED交替閃爍,涉及到的內容還是很多的。下面再來看一個流水燈的例子,要求實現一個12位的流水燈,時間間隔為100ms。假設LED採用共陽接法接在GPIO2埠,參考代碼如下:

#include
//===================系統定時器中斷服務程序============================
void SysTick_Handler(void)
{
uint32_t temp;//定義臨時中間變量
temp = LPC_GPIO2->DATA;//讀取當前埠2的值
temp = ~temp; //把中間變量進行取反
temp<<=1; //把中間變量進行左移一位
temp = ~temp; //再次把中間變量進行取反
LPC_GPIO2->DATA = temp; //把左移後的量賦給埠2
if(temp==0xFFF) //如果左移到頭,則從頭開始
{
LPC_GPIO2->DATA = 0xFFE;
}
}
//========================系統定時器初始化=============================
void SysTick_init(void)
{
SysTick->LOAD = (((24000)*100)-1);//設置100ms的定時
SysTick->VAL = 0; //計數清零
SysTick->CTRL |= ((1<<1)|(1<<0)); //允許中斷,選擇半系統時鐘,啟動定時器
}
//============================主函數==================================
int main(void)
{
LPC_GPIO2->DIR = 0xFFF; //設置埠2為輸出方向
LPC_GPIO2->DATA = 0xFFE;//埠2最低位輸出0,點亮最末一個LED
SysTick_init();//調用系統定時器
while(1)
{
;//空循環
}
}

把程序編譯後下載到LPC1114中,給系統上電,可看到接到埠2上的12個LED在閃爍流動。

相關焦點

  • LPC1114時鐘配置
    要讓LPC1114正常工作,首先要對它的時鐘源進行配置。LPC1114的最高工作頻率為50MHz,因此給它的主時鐘頻率最大不能超過50MHz。實際上,通常都是使用頻率較低的晶振,以降低外部電磁幹擾,然後再通過內部倍頻的方式把主時鐘頻率提高。
  • LPC1114外部中斷
    外部中斷作為處理器響應外部事件的通道,在控制系統中起著非常重要的作用。下面就來討論一下LPC1114外部中斷的使用情況。LPC1114的每一個引腳都可以響應一個外部中斷,所以有多少個引腳就有多少個外部中斷。但LPC1114的中斷系統非常強大,外部中斷只是它其中的一小部分。
  • LPC1114/LPC11U14和LPC1343對比學習(四)定時器
    在PWM模式下,2個32位可編程定時器/計數器均有3個匹配寄存器用於提供單邊沿的PWM輸出,剩下的那個匹配寄存器則用於控制PWM周 期長度。在PWM模式下,16位定時器0(CT16B0)與32位定時器相同,而16位定時器1(CT16B1)只有其中的兩個匹配可用於向匹配輸出管腳 提供單邊沿的PWM輸出。
  • LPC1114的簡易數碼相框設計
    摘要:以NXP公司基於ARM Cortex—M0的LPC1100系列MCU LPC1114為控制核心,配合SD存儲卡、外圍電路和TFT液晶顯示屏,提出了一種簡易數碼相框的設計方案。
  • 基於LPC1114的學習型紅外遙控器
    本設計就是採用LPC1114+OLED+紅外接收頭構成一個學習型紅外遙控器,  安裝LPCxpress,後插入LPC-Link 自動識別,  系統多出一個     然後打開11XX的例程,正常安裝路徑在C:\nxp \lpcxpresso_3.1\Examples\LPC1000\LPC11xx下  文件名字 LPCXpresso1114_v1.00.zip
  • NXP_LPC1114延時函數集合
    #include "LPC11XX.h"#include "gpio.h"#include "timer16.h"/*系統時鐘配置為48MHz,AHB不分頻,一次定時器時鐘為48Mhz,因此得出以下分頻值,匹配值*/void Delay_Us(unsigned int DelayTimes){/* *
  • 基於LPC1114的智能節能LED檯燈控制器設計
    LED檯燈使用距離和亮度進行對比,從而調節LPC1114的PWM輸出佔空比,驅動LED檯燈驅動器,在保證LED檯燈使用視野亮度恆定的情況下,實現人走燈滅和根據環境光線強度智能調節LED檯燈亮度兩大功能,實現智能節能效果。
  • NXP_LPC1114_LED燈程序
    Delay_Sec(u8 Time){u16 i;while(Time){for(i=0;i<3000000;i++);Time--;}}void Delay_Ms(u16 Time){u16 i;while(Time){for(i=0;i<3000;i++);Time--;}}int main(void){SystemInit(); //系統初始化
  • LPC1114/LPC11U14和LPC1343對比學習(三)SysTick
    從Cortex開始ARM公司在內核中添加SysTick,為系統運行提供了便捷。通過學習這三種處理器的結構和寄存器可知,這三種SysTick的結構和寄存器都是一樣的完全兼容,SysTick的結構如下:
  • LPC1114外中斷應用
    LPC1114微處理器每一個GPIO都可以中斷,不過在設計中斷時需要注意,下面就舉例說明:/*************************************************************************************** global variable*******************
  • LPC1114如何使用MDK與JLINK連接使用問題
    在前不久我應用LPC1114做了個MP3開發板,在使用JLINK工具下的SWD方式下載非常完美。但在在最近在用LPC1114做另外一個項目時,發現,用JLINK工具的SWD方向調試,總是會提示如下(mdk4.13),很多網友也遇到了這個問題:
  • LPC1114_時鐘系統解析
    Frequency (Core Clock) */uint32_t SystemAHBFrequency = IRC_OSC;void Main_PLL_Setup ( void ){uint32_t regVal;ClockSource = OSC_CLK;LPC_SYSCON->SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val; /* Select system OSC--系統振蕩器
  • 基於stm32的精確延時利用系統滴答systick
    利用系統滴答定時器來實現精確延時,需要以下五步:1、設置滴答定時器的時鐘,通過設置其控制寄存器,選擇外部時鐘,即為系統時鐘的八分之一,若系統時鐘為72M,則滴答定時器時鐘為
  • LPC1114/LPC11U14和LPC1343對比學習(八)USB
    LPC1114沒有USB功能,所以這裡只能針對LPC1343和LPC11U14進行說明。對於這兩種有USB功能的晶片其還是區 別,LPC1343內部集成了USB驅動,而LPC11U14沒有此功能,所以LPC1343USB開發比較簡單一點,價格也要貴一點。
  • LPC1114_Timer16_0中斷程序_MDK編譯環境
    關於Timer16_0代碼: LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); //開啟定時器時鐘 LPC_TMR16B0->PR=1000;//1000-1;
  • LPC1114通用輸入/輸出埠(GPIO)續
    雖然DIR寄存器也是32位結構,但由於LPC1114每組只有12個引腳,所以只用了其中的低12位。當位為0 時做輸入,為1時做輸出,12位與12個引腳一一對應,每位設置對應一個引腳。在默認狀態下DIR的值為全0,所以在默認狀態下所有的引腳為輸入狀態。要改變引腳狀態,可通過寫DIR寄存器對應的位來實現。
  • 基於定時器的PLC交通燈控制系統研究
    打開APP 基於定時器的PLC交通燈控制系統研究 發表於 2018-01-09 10:09:59 (4)系統循環工作。具體控制要求如表1所示。
  • 《成語小秀才》第1114關答案是什麼 第1114關答案介紹
    導 讀 【九遊攻略】成語小秀才第1114關答案是什麼?很多小夥伴都不知道,下面九遊網小編就為大家帶來成語小秀才第1114關答案介紹,一起和小編來看看吧!
  • 定時器
    定時器是一項偉大的發明,它可以對相當多需要精準時間控制的工作變得簡單了許多。現在我們已經將定時器用在了軍事方面,製成了定時炸彈,定時雷管。       定時器主要分為五種類型:    1.接通延時類定時器:這類定時器主要運用在PLC中;是最常見最基本的定時器,我們稱為SD型定時器。
  • 單片機定時器/計數器基本原理
    目前常用的單片機中往往都配備了定時器/計數器。在AT89S52晶片內包含有三個16位的定時器/計數器:T0、T1和T2,其核心是加1計數器。我們主要要求掌握T0和T1的結構和功能。學習中要注意從電路結構上來理解功能的實現。定時器/計數器方式寄存器TMOD和定時器/計數器控制寄存器TCON是用以設定定時器/計數器的工作方式、定時或計數功能,控制啟動或停止以及產生溢出中斷的重要模塊,應該對這兩個寄存器中的逐位的定義和功能進行學習和掌握。