STM32學習筆記:通用定時器基本定時功能


STM32的Timer簡介
STM32中一共有11個定時器,其中2個高級控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒時鐘。今天主要是學習8個定時器。
定時器其中TIM1和TIM8是能夠產生3對PWM互補輸出的高級定時器,常用于三相電機的驅動,時鐘由APB2的輸出產生。TIM2-TIM5是普通定時器,TIM6和TIM7是基本定時器,其時鐘由APB1輸出產生。由于STM32的TIMER功能太復雜了,所以只能一點一點的學習。因此今天就從最簡單的開始學習起,也就是TIM2-TIM5普通定時器的定時功能。
2.普通定時器TIM2-TIM5
2.1 時鐘來源
計數器時鐘可以由下列時鐘源提供:
內部時鐘(CK_INT)
外部時鐘模式1:外部輸入腳(TIx)
外部時鐘模式2:外部觸發輸入(ETR)
內部觸發輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1而作為另一個定時器Timer2的預分頻器。
由于今天的學習是最基本的定時功能,所以采用內部時鐘。TIM2-TIM5的時鐘不是直接來自于APB1,而是來自于輸入為APB1的一個倍頻器。這個倍頻器的作用是:當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;當APB1的預分頻系數為其他數值時(即預分頻系數為2、4、8或16),這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率的2倍。通過倍頻器給定時器時鐘的好處:APB1不但要給TIM2-TIM5提供時鐘,還要為其他的外設提供時鐘;設置這個倍頻器可以保證在其他外設使用較低時鐘頻率時,TIM2-TIM5仍然可以得到較高的時鐘頻率。
2.2 計數器模式
TIM2-TIM5可以由向上計數、向下計數、向上向下雙向計數。向上計數模式中,計數器從0計數到自動加載值(TIMx_ARR計數器內容),然后重新從0開始計數并且產生一個計數器溢出事件。在向下模式中,計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然后從自動裝入的值重新開始,并產生一個計數器向下溢出事件。而中央對齊模式(向上/向下計數)是計數器從0開始計數到自動裝入的值-1,產生一個計數器溢出事件,然后向下計數到1并且產生一個計數器溢出事件;然后再從0開始重新計數。
2.3 編程步驟
1. 配置系統時鐘;
2. 配置NVIC;
3. 配置GPIO;
4. 配置TIMER;
其中,前3項比較簡單,在此就不再贅述了。第4項配置TIMER有如下配置:
(1) TIM_Perscaler來設置預分頻系數;
(2) TIM_ClockDivision來設置時鐘分割;
(3) TIM_CounterMode來設置計數器模式;
(4) TIM_Period來設置自動裝入的值
(5) TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
(6) TIM_ITConfig()來開啟TIMx的中斷
(7) TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
其中(1)-(4)步驟中的參數由TIM_TimerBaseInitTypeDef結構體給出。步驟(1)中的預分頻系數用來確定TIMx所使用的時鐘頻率,具體計算方法為:CK_INT/(TIM_Perscaler+1)。CK_INT是內部時鐘源的頻率,是根據2.1中所描述的APB1的倍頻器送出的時鐘,TIM_Perscaler是用戶設定的預分頻系數,其值范圍是從0 – 65535。
步驟(2)中的時鐘分割定義的是在定時器時鐘頻率(CK_INT)與數字濾波器(ETR,TIx)使用的采樣頻率之間的分頻比例。TIM_ClockDivision的參數如下表:
TIM_ClockDivision
數字濾波器(ETR,TIx)是為了將ETR進來的分頻后的信號濾波,保證通過信號頻率不超過某個限定。
ARM中,有的邏輯寄存器在物理上對應2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preload register(預裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadow register(影子寄存器);設計preload register和shadow register的好處是,所有真正需要起作用的寄存器(shadow register)可以在同一個時間(發生更新事件時)被更新為所對應的preload register的內容,這樣可以保證多個通道的操作能夠準確地同步。如果沒有shadow register,或者preload register和shadow register是直通的,即軟件更新preload register時,同時更新了shadow register,因為軟件不可能在一個相同的時刻同時更新多個寄存器,結果造成多個通道的時序不能同步,如果再加上其它因素(例如中斷),多個通道的時序關系有可能是不可預知的。
3. 程序源代碼
本例實現的是通過TIM2的定時功能,使得LED燈按照1s的時間間隔來閃爍
#include "stm32f10x_lib.h"
void RCC_cfg();
void TIMER_cfg();
void NVIC_cfg();
void GPIO_cfg();
int main()
{
RCC_cfg();
NVIC_cfg();
GPIO_cfg();
TIMER_cfg();
//開啟定時器2
TIM_Cmd(TIM2,ENABLE);
while(1);
}
void RCC_cfg()
{
//SystemInt中已經定義位72MHz
//允許TIM2的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//允許GPIO的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
}
void TIMER_cfg()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//重新將Timer設置為缺省值
TIM_DeInit(TIM2);
//采用內部時鐘給TIM2提供時鐘源
TIM_InternalClockConfig(TIM2);
//預分頻系數為36000-1,這樣計數器時鐘為72MHz/36000 = 2kHz
TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;
//設置時鐘分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//設置計數器模式為向上計數模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//設置計數溢出大小,每計2000個數就產生一個更新事件
TIM_TimeBaseStructure.TIM_Period = 2000 - 1;
//將配置應用到TIM2中
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
//清除溢出中斷標志
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//禁止ARR預裝載緩沖器
TIM_ARRPreloadConfig(TIM2, DISABLE);
//開啟TIM2的中斷
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
}
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);
}
void GPIO_cfg()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //選擇引腳5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出頻率最大50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //帶上拉電阻輸出
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
在stm32f10x_it.c中,我們找到函數TIM2_IRQHandler(),并向其中添加代碼
void TIM2_IRQHandler(void)
{
u8 ReadValue;
//檢測是否發生溢出更新事件
if(TIM_GetITStatus(TIM2,
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
//清除TIM2的中斷待處理位
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
//將PB.5管腳輸出數值寫入ReadValue
ReadValue = GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);
if(ReadValue == 0)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
}
}
【STM32】
STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex?-M0,M0+,M3, M4和M7內核(ST's product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex?-M0 and M0+, Cortex?-M3, Cortex?-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range to include an ultra-low-power MCU platform)[1] 。按內核架構分為不同產品:
主流產品(STM32F0、STM32F1、STM32F3)、超低功耗產品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能產品(STM32F2、STM32F4、STM32F7、STM32H7)。
產品介紹
在STM32F105和STM32F107互連型系列微控制器之前,意法半導體已經推出STM32基本型系列、增強型系列、USB基本型系列、互補型系列;新系列產品沿用增強型系列的72MHz處理頻率。內存包括64KB到256KB閃存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三種封裝,不同的封裝保持引腳排列一致性,結合STM32平臺的設計理念,開發人員通過選擇產品可重新優化功能、存儲器、性能和引腳數量,以最小的硬件變化來滿足個性化的應用需求。
截至2010年7月1日,市面流通的型號有:
基本型:STM32F101R6、STM32F101C8、STM32F101R8、STM32F101V8、STM32F101RB、STM32F101VB
增強型:STM32F103C8、STM32F103R8、STM32F103V8、STM32F103RB、STM32F103VB、 STM32F103VE、STM32F103ZE
STM32型號的說明:以STM32F103RBT6這個型號的芯片為例,該型號的組成為7個部分,其命名規則如下:
1· STM32~ STM32代表ARM Cortex-M內核的32位微控制器。
2· F~ F代表芯片子系列。
3· 103~ 103代表增強型系列。
4· R~ R這一項代表引腳數,其中T代表36腳,C代表48腳,R代表64腳,V代表100腳,Z代表144腳,I代表176腳。
5· B~ B這一項代表內嵌Flash容量,其中6代表32K字節Flash,8代表64K字節Flash,B代表128K字節Flash,C代表256K字節Flash,D代表384K字節Flash,E代表512K字節Flash,G代表1M字節Flash。
6· T~ T這一項代表封裝,其中H代表BGA封裝,T代表LQFP封裝,U代表VFQFPN封裝。
7· 6~ 6這一項代表工作溫度范圍,其中6代表-40——85℃,7代表-40——105℃。
互聯型
全新STM32互聯型(Connectivity)系列微控制器增加一個全速USB(OTG)接口,使終端產品在連接另一個USB設備時既可以充當USB主機又可充當USB從機;還增加一個硬件支持IEEE1588精確時間協議(PTP)的以太網接口,用硬件實現這個協議可降低CPU開銷,提高實時應用和聯網設備同步通信的響應速度。
全新互聯型系列還是STM32家族中首款集成兩個CAN2.0B控制器的產品,讓開發人員能夠研制可連接兩條工業標準CAN(控制器區域網)總線的網關設備。此外,新系列微控制器還支持以太網、USB OTG和CAN2.0B外設接口同時工作,因此,開發人員只需一顆芯片就能設計整合所有這些外設接口的網關設備。
STM32互聯型系列產品強化了音頻性能,采用一個先進的鎖相環機制,實現音頻級別的I2S通信。結合USB主機或從機功能,STM32可以從外部存儲器(U盤或MP3播放器)讀取、解碼和輸出音頻信號。設計人員還可以在新系列微控制器上開發人機界面(HMI)功能,如播放和停止按鍵,以及顯示器界面。這個功能使其可用于各種家庭音響設備,如音響底座系統、鬧鐘/音樂播放器和家庭影院。
新系列產品整合先進的面向連接的外設,標準的STM32外設(包括一個PWM定時器),高性能的32位ARM Cortex-M3 CPU,這些特性使開發人員可以在設備上(如家電、樓宇或工業自動化)整合多種功能,如馬達控制、用戶界面控制和設備互連功能。其它目標應用包括需要聯網、數據記錄或USB外設擴展功能的系統,如病患監視、銷售終端機、自動售貨機和保安系統。
包括新的互聯型系列在內的STM32系列微控制器具有多種配套軟件和開發工具,其中包括意法半導體免費提供的軟件庫以及第三方工具廠商的廣泛支持。意法半導體還將推出一個新的評估板,目前正在向大客戶提供STM32F105和STM32F107互聯型系列的樣片。
新系列
STM32互連型系列產品分為兩個型號: STM32F105和STM32F107。STM32F105具有USB OTG 和CAN2.0B接口。STM32F107在USB OTG 和CAN2.0B接口基礎上增加了以太網10/100 MAC模塊 。片上集成的以太網MAC支持MII和RMII,因此,實現一個完整的以太網收發器只需一個外部PHY芯片。只使用一個25MHz晶振即可給整個微控制器提供時鐘頻率,包括以太網和USB OTG外設接口。微控制器還能產生一個25MHz或50MHz的時鐘輸出,驅動外部以太網PHY層芯片,從而為客戶節省了一個附加晶振。
音頻功能方面,新系列微控制器提供兩個I2S音頻接口,支持主機和從機兩種模式,既用作輸入又可用作輸出,分辨率為16位或32位。音頻采樣頻率從8kHz到96kHz。利用新系列微控制器強大的處理性能,開發人員可以用軟件實現音頻編解碼器,從而消除了對外部組件的需求。
把U盤插入微控制器的USB OTG接口,可以現場升級軟件;也可以通過以太網下載代碼進行軟件升級。這個功能可簡化大型系統網絡(如遠程控制器或銷售終端設備)的管理和維護工作。
架構優勢
除新增的功能強化型外設接口外,STM32互連系列還提供與其它STM32微控制器相同的標準接口,這種外設共用性提升了整個產品家族的應用靈活性,使開發人員可以在多個設計中重復使用同一個軟件。新STM32的標準外設包括10個定時器、兩個12位1-Msample/s 模數轉換器 (交錯模式下2-Msample/s)、兩個12位數模轉換器、兩個I2C接口、五個USART接口和三個SPI端口。新產品外設共有12條DMA通道,還有一個CRC計算單元,像其它STM32微控制器一樣,支持96位唯一標識碼。
新系列微控制器還沿續了STM32產品家族的低電壓和節能兩大優點。2.0V到3.6V的工作電壓范圍兼容主流的電池技術,如鋰電池和鎳氫電池,封裝還設有一個電池工作模式專用引腳Vbat。以72MHz頻率從閃存執行代碼,僅消耗 27mA電流。低功耗模式共有四種,可將電流消耗降至兩微安。從低功耗模式快速啟動也同樣節省電能;啟動電路使用STM32內部生成的8MHz信號,將微控制器從停止模式喚醒用時小于6微秒。
低功耗性能
意法半導體的EnergyLite?超低功耗技術平臺是STM32L取得業內領先的能效性能的關鍵。這個技術平臺也被廣泛用于意法半導體的8位微控制器STM8L系列產品。EnergyLite?超低功耗技術平臺基于意法半導體獨有的130nm制造工藝,為實現超低的泄漏電流特性,意法半導體對該平臺進行了深度優化。在工作和睡眠模式下,EnergyLite?超低功耗技術平臺可以最大限度提升能效。此外,該平臺的內嵌閃存采用意法半導體獨有的低功耗閃存技術。這個平臺還集成了直接訪存(DMA)支持功能,在應用系統運行過程中關閉閃存和CPU,外設仍然保持工作狀態,從而可為開發人員節省大量的時間。
除最為突出的與制程有關的節能特色外,STM32L系列還提供更多其它的功能,開發人員能夠優化應用設計的功耗特性。通過六個超低功耗模式,STM32L系列產品能夠在任何設定時間以最低的功耗完成任務。這些可用模式包括:(在1.8V/25°C環境的初步數據)
· 10.4μA低功耗運行模式,32kHz運行頻率
· 6.1 μA低功耗睡眠模式,一個計時器工作
· 1.3 μA 停機模式:實時時鐘(RTC)運行,保存上下文,保留RAM內容
· 0.5 μA 停機模式:無實時時鐘運行,保存上下文,保留RAM內容
· 1.0μA待機模式:實時時鐘運行,保存后備寄存器
· 270nA待機模式:無實時時鐘運行,保存后備寄存器
STM32L系列新增低功耗運行和低功耗睡眠兩個低功耗模式,通過利用超低功耗的穩壓器和振蕩器,微控制器可大幅度降低在低頻下的工作功耗。穩壓器不依賴電源電壓即可滿足電流要求。STM32L還提供動態電壓升降功能,這是一項成功應用多年的節能技術,可進一步降低芯片在中低頻下運行時的內部工作電壓。在正常運行模式下,閃存的電流消耗最低230μA/MHz,STM32L的功耗/性能比最低185μA/DMIPS。
此外,STM32L電路的設計目的是以低電壓實現高性能,有效延長電池供電設備的充電間隔。片上模擬功能的最低工作電源電壓為1.8V。數字功能的最低工作電源電壓為1.65V,在電池電壓降低時,可以延長電池供電設備的工作時間。
STM32 ARM Cortex 32位微控制器
The STM32 family of 32-bit Flash microcontrollers based on the Arm? Cortex?-M processor is designed to offer new degrees of freedom to MCU users. It offers products combining very high performance, real-time capabilities, digital signal processing, and low-power and low-voltage operation, and connectivity, while maintaining full integration and ease of development.
The unparalleled and large range of STM32 devices, based on an industry-standard core and accompanied by a vast choice of tools and software, makes this family of products the ideal choice, both for small projects or an entire platforms.
STM32 celebrates 10 years of innovation
Watch our anniversary video and become inspired on how we can shape the future together.
See how we can help release your creativity for the next 10 years:
·Participate in the ST Community, a powerful social community application where you can ask and answer questions, share projects, events, videos, knowledge, or learn from and engage with other community members
·Subscribe to our newsletters to be the first informed about our innovative products and solutions as well as special events including seminars, conferences, webinars and on-line courses.
· Watch one of our recorded webinars available for on-demand viewing.
責任編輯:Davia
【免責聲明】
1、本文內容、數據、圖表等來源于網絡引用或其他公開資料,版權歸屬原作者、原發表出處。若版權所有方對本文的引用持有異議,請聯系拍明(marketing@iczoom.com),本方將及時處理。
2、本文的引用僅供讀者交流學習使用,不涉及商業目的。
3、本文內容僅代表作者觀點,拍明不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。
4、如需轉載本方擁有版權的文章,請聯系拍明(marketing@iczoom.com)注明“轉載原因”。未經允許私自轉載拍明將保留追究其法律責任的權利。
拍明擁有對此聲明的最終解釋權。