STM32菜鳥成長記錄 普通定時器應用

2021-10-08 13:56:25 字數 2877 閱讀 2195

一、stm32通用定時器原理                        

stm32 系列的cpu,有多達8個定時器,其中tim1和tim8是能夠產生三對pwm互補輸出的高階定時器,常用於三相電機的驅動,它們的時鐘由apb2的輸出產生。其它6個為普通定時器,時鐘由apb1的輸出產生。

從圖中可以看出,定時器的時鐘不是直接來自apb1或apb2,而是來自於輸入為apb1或apb2的乙個倍頻器,圖中的藍色部分。

下面以通用定時器2的時鐘說明這個倍頻器的作用:當apb1的預分頻係數為1時,這個倍頻器不起作用,定時器的時鐘頻率等於apb1的頻率;當apb1的預分頻係數為其它數值(即預分頻係數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等於apb1的頻率兩倍。

可能有同學還是有點不理解,ok,我們舉乙個例子說明。假定ahb=36mhz,因為apb1允許的最大頻率為36mhz,所以apb1的預分頻係數可以取任意數值;

當預分頻係數=1時,apb1=36mhz,tim2~7的時鐘頻率=36mhz(倍頻器不起作用);

當預分頻係數=2時,apb1=18mhz,在倍頻器的作用下,tim2~7的時鐘頻率=36mhz。

有人會問,既然需要tim2~7的時鐘頻率=36mhz,為什麼不直接取apb1的預分頻係數=1?答案是:apb1不但要為tim2~7提供時鐘,而且還要為其它外設提供時鐘;設定這個倍頻器可以在保證其它外設使用較低時鐘頻率時。

stm32外設使用者手冊,如圖:

再舉個例子:當ahb=72mhz時,apb1的預分頻係數必須大於2,因為apb1的最大頻率只能為36mhz。如果apb1的預分頻係數=2,則因為這個倍頻器,tim2~7仍然能夠得到72mhz的時鐘頻率。能夠使用更高的時鐘頻率,無疑提高了定時器的解析度,這也正是設計這個倍頻器的初衷。

二、stm32通用定時器程式設計

定時器程式設計,就是中斷的程式設計。因為使用定時器必定要使用到中斷。

步驟一:rcc_configuration();//設定系統時鐘,包括時鐘rcc的配置,倍頻到72mhz。

步驟二: gpio的配置,使用函式為gpio_cfg();,該函式的實現如下:

void

gpio_cfg

()

gpio_inittypedef gpio_initstructure;

rcc_apb2periphclockcmd( rcc_apb2periph_usart1 |rcc_apb2periph_gpioa | rcc_apb2periph_gpiob | rcc_apb2periph_gpioc | rcc_apb2periph_gpiod , enable);

gpio_initstructure.gpio_pin = gpio_pin_6; //選擇引腳6

gpio_initstructure.gpio_speed = gpio_speed_50mhz; //輸出頻率最大50mhz

gpio_initstructure.gpio_mode = gpio_mode_out_pp; //帶上拉電阻輸出

gpio_init(gpioc,&gpio_initstructure);

實際上定時器的講解,不需要配置gpio的引腳,只是我們在定時器實驗中,

使用每隔一秒點亮一次led燈來做實驗,所以需要配置對應gpio的引腳。

步驟三:巢狀中斷控制器的配置,我們照樣使用函式nvic_config();只是初始化的過程略有不同。這裡我們也把函式實現列出來:

從以上函式實現來看,實際上只是改動了結構體成員nvic_irqchannel的值,現在需要的通道是tim2的通道,因此初始化值為tim2_irqchannel。從這裡也可以看出,這個函式實際上可以看做乙個模型,可以拿去別的程式中改動後直接使用。

void

nvic_cfg

()

nvic_inittypedef nvic_initstructure;

//選擇中斷分組1

nvic_prioritygroupconfig(nvic_prioritygroup_1);

//選擇tim2的中斷通道

nvic_initstructure.nvic_irqchannel = tim2_irqchannel;

//搶占式中斷優先順序設定為0

nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;

//響應式中斷優先順序設定為0

nvic_initstructure.nvic_irqchannelsubpriority = 0;

//使能中斷

nvic_initstructure.nvic_irqchannelcmd = enable;

nvic_init(&nvic_initstructure);

步驟四:定時器的初始化配置,使用timer_config();。ok,關鍵部分出來了。

我們來看下實現過程:

timer_cfg(); //定時器的配置//開啟定時器2
tim_cmd(tim2,enable);

voidtimer_config(void)

else

//若該埠當前為高電平,

}普通定時器工作原理圖

STM32 菜鳥學習記錄 TFTLCD屏學習記錄

1.tftlcd 簡介 tft lcd 即薄膜電晶體液晶顯示器。tft lcd與無源 tn lcd stn lcd 的簡單矩陣不同,它在液晶顯示屏的每乙個象素上都設定有乙個薄膜電晶體 tft 可有效地克服非選通時的串擾,使顯示液晶屏的靜態特性與掃瞄線數無關,因此大大提高了影象質量。tft lcd 也...

菜鳥必看 stm32定時器的妙用

摘要 本文為你帶來關於stm32定時器的使用的便利和優勢之處。使用定時器去計算獲取一條的時間 stm32定時器時鐘圖如下 定時器2 7 普通定時器 定時器1 8 高階定時器 以下,我使用定時器7 以下tim7 去實現計算獲取一條指令的執行時間。1.tim7初始化 以下初始化函式中 void time...

stm32學習記錄

讓自己別忘了大學裡學的東西,那麼就把它記錄下下來,效率會比忘記然後重新再去找資料再重頭學高的多 先講講定時器的基礎定時功能 1.先做乙個形象的比喻 手錶 秒鐘 時鐘 定時器 定時器內部時鐘 定時器輸出時鐘 它們倆基本相同,不同的是,對於手錶是秒鐘和分鐘之間的進製是固定為60,而對於定時器,定時器內部...