今天在寫用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都是有最大最小值的限制的,這個在參考手冊中有說明的,因此放大縮...