STM32定時器中斷顯示時間

2021-10-01 23:25:11 字數 1936 閱讀 6452

利用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...