本文採用晶元為stm32f103rc,定時器為systick。
systick—系統定時器是屬於 cm3 核心中的乙個外設,內嵌在 nvic 中。系統定時器
是乙個 24bit 的向下遞減的計數器,計數器每計數一次的時間為 1/sysclk,一般我們設定系統時鐘 sysclk 等於 72m。當重裝載數值暫存器的值遞減到 0 的時候,系統定時器就產生一次中斷,以此迴圈往復。
先明確思路:總共分成4各部分來實現:
1、初始化定時器。
2、led_gpio 初始化。
3、計算精確延時,這裡配置為1s。
4、點亮、熄滅led燈。
編寫初始化函式systick_init();,從core_cm3中呼叫庫函式systick_config();
systick_config();函式原型:
static __inline uint32_t systick_config(uint32_t ticks)
void systick_init(void)
}}
led_gpio的初始化:啟動時鐘、配置引腳、設定輸入輸出、speed。經查原理圖可知led0對應引腳為pa8。
void led_gpio_config()
計算延時:
當設定好中斷時間 tint 後,我們可以設定乙個變數 t,用來記錄進入中斷的次數,那
麼變數 t 乘以中斷的時間 tint就可以計算出需要定時的時間。定義乙個微秒級別的延時函式,形參為 ntime,當用這個形參乘以中斷時間tint 就得出我們需要的延時時間,其中 tint 我們已經設定好為 10us。
定義一下timingdelay:uint32_t timingdelay = 0;
`
void delay_us(__io u32 ntime)
函式 delay_us()中我們等待 timingdelay 為 0,當 timingdelay 為 0 的時候表示延時時
間到。變數 timingdelay 在中斷函式中遞減,即 systick 每進一次中斷即 10us 的時間
timingdelay 遞減一次。
配置一下中斷函式:這個函式在庫函式stm32f10x_it.c中。
void systick_handler(void)
中斷復位函式呼叫了另外乙個函式 timingdelay_decrement(),原型如下:
void timingdelay_decrement(void)
}
timingdelay 的值等於延時函式中傳進去的 ntime 的值,比如 ntime=100000,則延時
的時間等於 100000*10us=1s。因此我們能夠精確得到1s的延時函式。
點亮、熄滅led
gpio_resetbits(gpioa,gpio_pin_8);//低電平
gpio_setbits(gpioa,gpio_pin_8);//高電平
主函式:
#include "stm32f10x.h"
#include "stm32f10x_it.h"
int main()
}
stm32關定時器 STM32定時器TIM3程式
include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...
stm32的定時器
stm32一共有8個都為16位的定時器。其中tim6 tim7是基本定時器 tim2 tim3 tim4 tim5是通用定時器 tim1和tim8是高階定時器。1.基本定時器 基本定時器tim6和tim7只具備最基本的定時功能,就是累加的時鐘脈衝數超過預定值時,能觸發中斷或觸發dma請求。由於在晶元...
STM32定時器中斷
本實驗的目的是通過定時器中斷控制led燈的亮滅。筆者所用ide為iar,採用標準庫 3.5韌體庫 通過定時器產生中斷來控制led。ifndef led h define led h include stm32f10x gpio.h include stm32f10x.h include stm32f...