利用stm32的定時器中斷,實現時間的顯示。我們知道利用定時器中斷只能進行tick的計算,然而用來顯示時間我們應該怎麼辦呢?經過專案的實際運用,我發現利用定時器中斷配合串列埠通訊也能實現時間顯示。
這種方法應用的前提是,我們的板件不能裝電池無法儲存時鐘,我們的板件會與其他可以儲存時鐘的板件通訊。
(1)硬體資源:有通訊功能的stm32板件、可以儲存時鐘且能通訊的其他任意板件
(2)軟體設計:定時器中斷、通訊接收(串列埠接收)
(3)設計思路:利用定時器中斷獲得穩定的tick(假設tick為1ms,那麼我們就1ms進入定時器中斷計數一次),編寫時鐘進製函式,通過通訊獲得當前時間。
我們選用stm32的基本定時器,具體操作看**。
#include
"stm32f10x.h"
#define basic_tim tim6
#define basic_tim_apbxclock_fun rcc_apb1periphclockcmd
#define basic_tim_clk rcc_apb1periph_tim6
#define basic_tim_irq tim6_irqn
#define basic_tim_irqhandler tim6_irqhandler
void
basic_tim_config
(void);
void
basic_tim_nvic_config
(void);
void
system_time_increase
(void);
void
basic_tim_config
(void
)void
basic_tim_nvic_config
(void
)
以上為stm32定時器中斷的配置部分**,要想實現計數我們還要編寫中斷服務函式,**如下:
void
basic_tim_irqhandler
(void
)}
我們中斷服務函式的關鍵就是時鐘進製,這個函式的具體**如下:
void
system_time_increase
(void);
//每月的天數
time.msec++;if
(time.msec >=
1000
)//1ms進入中斷一次,1000次就是1ms}}
}}}}
}
這裡說明一下,我們做了乙個time的結構體,我們可以通過訪問操作這個結構體實現通訊,實現時間顯示等後續功能。結構體如下:
typedef
struct _tdatetime
tdatetime;
我們在定時器中斷服務函式中實現時間進製功能,到這一步我們就能實現正確的計時了。但是我們每次開啟的時候時間都會是00年00月00日00:00:00。我們要想實現實時顯示時間還需要最後一步:通訊。
在這裡我們利用串列埠通訊的方式獲取其他板件的當前時間。我們使用私有協議報文的方式獲得當前時間報文,當然也有其他的方式。大致的原理就是,時間板件把時間資訊封裝成一串十六進製制報文,我們的程式進行解析獲取當前時間,然後在進行進製。具體的**量比較大,這裡就不貼出來了。我們還可以把時間通過液晶屏顯示出來,關於液晶屏的操作可以借鑑這篇部落格stm32f103成功點亮12864點陣液晶屏。
最後給大家展示一下效果
STM32定時器中斷
本實驗的目的是通過定時器中斷控制led燈的亮滅。筆者所用ide為iar,採用標準庫 3.5韌體庫 通過定時器產生中斷來控制led。ifndef led h define led h include stm32f10x gpio.h include stm32f10x.h include stm32f...
stm32 定時器中斷
stm32f1的定時器非常多,由2個基本定時器 tim6 tim7 4個通用定時器 tim2 tim5 和2個高階定時器 tim1 tim8 組成。基本定時器的功能最為簡單,類似於51微控制器內定時器。通用定時器是在基本定時器的基礎上擴充套件而來,增加了輸入捕獲與輸出比較等功能。高階定時器又是在通用...
stm32 定時器中斷實驗
led.h ifndef led h define led h include sys.h void led init void define led0 pbout 5 紅燈 define led1 peout 5 綠燈 endif led.c include led.h include stm32...