LPC1768實現精準延時 Systick的使用

2021-06-20 21:00:27 字數 1613 閱讀 6661

今天在寫用1768讀取溫度感測器ds18b20的程式,它是單匯流排的感測器,因此讀寫都需要按照手冊上的時序。這是問題就來了,如何在1768中寫乙個盡可能精確us級延時函式?以前用51微控制器寫延時函式是用巢狀的for迴圈就能完成的,但是在arm中我們是不能那麼用的,因為它是**流水線構架,不像51一樣能計算出每條指令的時間。幸好cortex-m3給我們提供了乙個精準延時的方法——systick定時器。

systick是乙個24位的倒計數器,存在於所有與m3構架的晶元中。在1768中,systick的時鐘源可以是fcclk或由引腳(stclk)輸入的時鐘訊號,通過stctrl暫存器(系統定時器控制和狀態暫存器)選擇,stick可以裝載2的24次方以內的數(設定streload),當裝載值被減到0是可以選擇產生中斷,接著計數器被復位,從頭開始遞減。這樣我們就能通過設定裝載值得到我們定時時間。

systick在1768中有四個暫存器,在不同的m3的晶元中大致一樣。

系統定時器控制暫存器和狀態暫存器(stctrl):

stctrl暫存器含有系統節拍定時器的控制資訊,還可以提供狀態標誌。

在"core_cm3.c"檔案中,該暫存器的0-2為都被配置成1,即節拍計數器使能,中斷使能,時鐘選擇fcclk。

系統定時器過載值暫存器(streload):

該暫存器用來裝載定時值,在定時器進行初始化時,該值由軟體裝入暫存器。

系統定時器當前值暫存器(stcurr):

當軟體讀計數器時,該暫存器就會返回計數器的當前計數值。

系統定時器校準值暫存器(stcalib):

用於在系統節拍定時器的時鐘頻率為100mhz時每隔10毫秒產生乙個中斷。存在乙個廠商程式設計的值。

systick的操作也很方便,因為在core_cm3.c檔案中已經把我們要用的配置函式寫好了,我們只要傳入裝載值就好。函式名為systick_config((uint32_t ticks),附上函式體:

static __inline uint32_t systick_config(uint32_t ticks)

每次裝載值變為0時都會進入中斷,在寫精確延時函式中,我們可以利用中斷實現精準延時,以延時2ms為例:

//寫入裝載值

if(systick_config( systemfrequency/1000))//時鐘源是fcclk,裝載值為1ms,重灌值超過了24位,是不可能的。返回失敗值1 

void systick_handler(void) //系統滴答

} 可傳參的延時程式可以簡化成這樣:

void delay(uint32_t ms)  //毫秒級別

lpc1768的網路通訊

這幾天找了一些源 easyweb,lpc1768 ucos ii,這兩個是可以編譯通過的。是在systick handler中斷中實現查詢通訊的。lpc1768 ucos lwip是iar的編譯環境的程式,沒有環境,沒能編譯成功。沒有硬體不好測試。16939 tcpudp.exe是助手,上位機 不知...

LPC1768串列埠使用

lpc1768內建了四個串列埠通訊模組,都是非同步通訊模組,其中,串列埠0 2 3是普通串列埠通訊,串列埠1與 uart0 2 3 基本相同,只是增加了乙個 modem 介面和 rs 486 eia 486 模 式,不支援 irda,我們今天以串列埠0來演示串列埠的使用.首先,使用串列埠0要開啟串列...

lpc1768的時鐘樹梳理和小結

可以看到,外部晶振我使用的是8mhz,這個在配置檔案的時候需要設定。不然keil計算就會出現錯誤。看到cclk是100mhz,因為這個晶元最快是100mhz的主頻,usb不能超過48,一般設定為48,可以低於48,但是也有限制,幾個pll都是有最大最小值的限制的,這個在參考手冊中有說明的,因此放大縮...