有 TIME1 和 TIME8 等高級定時器,也有 TIME2~TIME5 等通用定時器,還有 TIME6 和TIME7 等基本定時器。
通用定時器:是一個通過可編程預分頻器(PSC)驅動的 16 位自動裝載計數器(CNT)構成;可以用來測量輸入信號的脈沖長度(輸入捕獲)或者產生輸出波形(輸出比較和 PWM)等功能。
STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定時器功能包括:
1)16 位向上、向下、向上/向下自動裝載計數器(TIMx_CNT)。
2)16 位可編程(可以實時修改)預分頻器(TIMx_PSC),計數器時鐘頻率的分頻系數為 1~65535 之間的任意數值。
3)4 個獨立通道(TIMx_CH1~4),這些通道可以用來作為:
A.輸入捕獲
B.輸出比較
C.PWM 生成(邊緣或中間對齊模式)
D.單脈沖模式輸出
4)可使用外部信號(TIMx_ETR)控制定時器和定時器互連(可以用 1 個定時器控制另外一個定時器)的同步電路。
5)如下事件發生時產生中斷/DMA:
A.更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
B.觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)
C.輸入捕獲
D.輸出比較
F.觸發輸入作為外部時鐘或者按周期的電流管理
定時器的時鐘來源有 4 個:
1)內部時鐘(CK_INT)
2)外部時鐘模式 1:外部輸入腳(TIx)
3)外部時鐘模式 2:外部觸發輸入(ETR)
4)內部觸發輸入(ITRx):使用 A 定時器作為 B 定時器的預分頻器(A 為 B 提供時鐘)
使用定時器的一般步驟
注:
因為本次是使用TIM3,所以所有代碼都是配置TIM3;
本次使用到的庫函數有:"stm32f10x_rcc.h"和"stm32f10x_rcc.c"時鐘庫
"stm32f10x_tim.h"和"stm32f10x_tim.c"定時器庫
"misc.h"和"miscc"中斷庫
1)TIM3時鐘使能
TIM3 是掛載在 APB1 之下
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能
2)復位TIM3
很多時候都沒寫這一步,不過建議還是寫上。
TIM_DeInit(TIM6);//復位
3)初始化定時器參數 數, 設置 自動重裝值 , 分頻系數 ,計數方式
主要通過使用定時器庫函數中,定時器初始化函數
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//第一個參數是定位到某個定時器上,第二個參數是初始化結構體指針
typedef struct
{
uint16_t TIM_Prescaler;//設置分頻系數
uint16_t TIM_CounterMode;//用來設置計數方式
uint16_t TIM_Period;//設置自動重載計數周期值
uint16_t TIM_ClockDivision;//是用來設置時鐘分頻因子
uint8_t TIM_RepetitionCounter;//重裝載定時的次數,高級定時器才有用的
} TIM_TimeBaseInitTypeDef;
定時器定時時間計算公式
T(一次中斷的時間)= (設置的初值TIMPeriod+1)?(設置的分頻系數TIMPrescaler+1) 時 鐘 頻 率 T(一次中斷的時間)=frac { (設置的初值TIM_Period+1)*(設置的分頻系數TIM_Prescaler+1) }{時 鐘 頻 率} T(一次中斷的時間)= 時 鐘 頻 率(設置的初值TIMPeriod+1)?(設置的分頻系數TIM Prescaler+1)
時鐘頻率根據TIM_ClockDivision的值來計算,在APB1時鐘線上初始為72MHZ
4)設置 TIM3_DIER 允許更新中斷
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
//第一個參數是定位到某個定時器上、第三個就是失能還是使能ENABLE或NABLE
/*第二個用來指明我們使能的定時器中斷的類型,定時器中斷的類型有很多種,
包括更新中斷 TIM_IT_Update,觸發中斷 TIM_IT_Trigger,以及輸入捕獲中斷等。*/
5)居然使用中斷,就得初始化線上中斷,設置觸發條件等。
//系統初始化就為2組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//設置 NVIC 中斷分組 2: 2 位搶占優先級, 2 位響應優先級
//中斷優先級 NVIC 設置
NVIC_InitTypeDef NVIC_ITDef_TIM6;
NVIC_ITDef_TIM6.NVIC_IRQChannel = TIM6_IRQn; //TIM6 中斷
NVIC_ITDef_TIM6.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級 0 級
NVIC_ITDef_TIM6.NVIC_IRQChannelSubPriority = 3; //從優先級 3 級
NVIC_ITDef_TIM6.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
NVIC_Init(&NVIC_ITDef_TIM6); //初始化 NVIC 寄存器
6)許允許TIM3工作能 ,也就是使能TIM3 。
也就相當于開定時器。
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//第一個參數是定位到某個定時器上、第二個就是失能還是使能ENABLE或NABLE
7 )編寫中斷服務函數。
先看看獲取中斷標志位函數
//先判斷這種中斷是否使能,再判斷標志位
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t);
//直接判斷標志位
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
//主要有這幾個中斷標志位
#define TIM_IT_Update/*TIM中斷源*/
#define TIM_IT_CC1/*TIM捕獲/比較1中斷源*/
#define TIM_IT_CC2/*TIM捕獲/比較2中斷源*/
#define TIM_IT_CC3/*TIM捕獲/比較3中斷源*/
#define TIM_IT_CC4/*TIM捕獲/比較4中斷源*/
#define TIM_IT_Trigger/*TIM觸發中斷源*/
//判斷定時器溢出中斷方法:
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){}
清楚標志位函數
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
注:使用的TIM_GetITStatus()函數判斷標志位,就用TIM_ClearITPendingBit()函數清標志位。
定時器中斷函數格式
//定時器 3 中斷服務程序
//TIM3_IRQHandler在“USART1_IRQHandler”固件庫給好了的名字
void TIM3_IRQHandler(void) //TIM3 中斷
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查 TIM3 更新中斷發生與否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中斷標志
}
}
完整程序
/*
主要實現LED間隔1s閃爍,其時間用定時器定時中斷完成
*/
#include "stm32f10x.h" // Device header
//初始化LED燈 -> PB5推挽輸出、高電平
void LED_Init_PB5(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_ITDef_PB5;
GPIO_ITDef_PB5.GPIO_Pin = GPIO_Pin_5;
GPIO_ITDef_PB5.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
GPIO_ITDef_PB5.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_ITDef_PB5);
GPIO_SetBits(GPIOB,GPIO_Pin_5);// 置為高電平
}
void TIM6_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//掛載tim6時鐘
TIM_DeInit(TIM6);//復位
TIM_TimeBaseInitTypeDef TIM_TITDef_TIM6;
TIM_TITDef_TIM6.TIM_Prescaler = 7199;//72MHz
TIM_TITDef_TIM6.TIM_Period = 9999;// 1S
TIM_TITDef_TIM6.TIM_CounterMode = TIM_CounterMode_Up;//向上計數
TIM_TITDef_TIM6.TIM_ClockDivision = TIM_CKD_DIV1;//自動重載計數周期值
TIM_TimeBaseInit(TIM6,&TIM_TITDef_TIM6);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//更新中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置 NVIC 中斷分組 2:2 位搶占優先級,2 位響應優先級
//中斷優先級 NVIC 設置
NVIC_InitTypeDef NVIC_ITDef_TIM6;
NVIC_ITDef_TIM6.NVIC_IRQChannel = TIM6_IRQn; //TIM6 中斷
NVIC_ITDef_TIM6.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級 0 級
NVIC_ITDef_TIM6.NVIC_IRQChannelSubPriority = 3; //從優先級 3 級
NVIC_ITDef_TIM6.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
NVIC_Init(&NVIC_ITDef_TIM6); //初始化 NVIC 寄存器
TIM_Cmd(TIM6,ENABLE);//使能 TIM6
}
void TIM6_IRQHandler(void) //TIM6 中斷
{
if (TIM_GetITStatus(TIM6,TIM_IT_Update) != RESET) //檢查 TIM6 更新中斷發生與否
{
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))//讀取PB5當前狀態
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);// 置0
}else {
GPIO_SetBits(GPIOB,GPIO_Pin_5);// 置1
}
TIM_ClearITPendingBit(TIM6,TIM_IT_Update ); //清除 TIM6 更新中斷標志
}
}
int main(void)
{
LED_Init_PB5();
TIM6_Init();//1s
while(1)
{
;
}
}
上一篇:STM32基于固件庫學習筆記(10)窗口看門狗
下一篇:STM32基于固件庫學習筆記(13)ADC讀取電壓值
推薦閱讀
史海拾趣
Cypress在USB技術領域取得了顯著的成就。自1996年開始深耕USB產品以來,Cypress逐漸成為了USB領域內的領先者。公司推出的EZ-PD系列產品是業界第一個支持USB PD 3.0供電規范的解決方案,贏得了市場的廣泛認可。此外,Cypress還不斷推出新的USB產品和技術,推動了USB技術的不斷發展和創新。
Brainboxes擁有一流的內部制造設施和全球供應鏈,這使得公司在產品研發和生產方面具有極大的靈活性。內部制造設施保證了產品的高品質和快速交付,而全球供應鏈則確保了公司能夠及時獲取所需的原材料和零部件。這種高效的生產模式使得Brainboxes能夠迅速響應市場需求,為客戶提供優質的產品和服務。
隨著技術的不斷進步,Dresden Elektronik公司不斷加大對研發的投入,致力于推動技術的創新和突破。一次偶然的實驗中,公司的研發團隊發現了一種新的材料,能夠顯著提高電子元件的性能和穩定性。這一發現被迅速轉化為產品,并成功推向市場,使公司的產品在競爭中脫穎而出。
進入新世紀,隨著科技的快速發展,電子產品更新換代速度日益加快。ANSHAN公司深知技術創新的重要性,不斷加大研發投入,積極引進先進技術和設備。在一次重要的技術攻關中,公司研發團隊成功突破了一項關鍵技術難題,推出了一款性能卓越、價格實惠的新型電子產品,受到了市場的熱烈歡迎。這一技術突破不僅提升了公司的核心競爭力,也為公司的后續發展奠定了堅實基礎。
Astro Industries Inc深知電子行業的快速變化,因此始終將研發作為公司的核心競爭力。公司不斷投入資金進行技術研發和產品升級,推出了一系列具有創新性和領先性的電子產品。同時,公司還積極響應國家產業升級的號召,加大了對智能制造、物聯網等領域的投入,為公司的未來發展奠定了堅實的基礎。
這五個故事是基于電子行業的一般情況和Astro Industries Inc可能的發展路徑構建的,并非特指該公司的實際發展歷程。如果您需要更具體的信息,建議查閱該公司的官方資料或相關新聞報道。
近年來,佰鴻公司開始將業務觸角延伸至再生醫學領域。通過多年的努力,公司成功建立了再生醫學醫療與健康科技生態圈,并逐步實現了產業集群化。在再生醫學領域,佰鴻不僅建立了產業化場地和研發設備,還計劃在未來幾年內打造國際領先的再生醫學產業集群。這一多元化的發展戰略,使得佰鴻在電子行業之外,也找到了新的增長點。
渣打銀行個人無抵押無擔保貸款 貸款額度:8000--20萬 貸款期限:6個月-- 4年 貸款要求: 1、22-60周歲 2、在上海工作,現單位工作3個月以上. 3、稅前月薪收入3000以上(銀行代發工資). 所需資料: 1. 身份證 2. 收入證明: 銀行工資流水單和 ...… 查看全部問答∨ |
|
開發環境:IAR4.42+JLINK V6(全功能)+EK-STM32F。請問:1.在JLINK調試方式下、在JTAG接口下,在FLASH中可以設置幾個斷點?2.在JLINK調試方式下、在SWD接口下,在FLASH中可以設置幾個斷點?3.能用RDI方式調試STM32嗎?如果能,請問可以 ...… 查看全部問答∨ |
設計了一種氣壓與心電同步數據采集系統. 利用該系統對氣壓和心電信號進行長時間同步采集, 揭示了氣壓變化與心電信粵之間的對應關系. 為滿足系統低功耗的需要, 通過對MS P 4 3 0 F 1 4 9 以及外圍電路的分析, 分別給出軟硬件解決方法; 另一方 ...… 查看全部問答∨ |
RFID技術(radiofrequencyidentification)是一種非接觸式智能識別技術,它通過射頻信號自動識別目標對象并獲得相關信息。整個識別過程無需人工介入,可同時識別多個對象并可以識別高速運動的物體,操作簡單,廣泛應用在車輛自動識別系統、物流管理 ...… 查看全部問答∨ |
無刷電機入門者的福音--STM8S 無刷電機控制器 DEMO 開源(轉) 硬件是 一個PCB 是功率板,可以用來做 hall 和SENSORLESS的,sensorLESS 工作在比較器模式下。當然也可以做HALL 模式下的FOC算法。 MCU板就是一個最小系統板。兩個模擬電位計,兩個直撥開關。還有一個電源開關。 圖片是一個做的風扇,實際測量20W ...… 查看全部問答∨ |
德州儀器 (TI) 推出的電源管理產品持續不斷地提供面向便攜式及交流電源供電型設計的優化電源解決方案。傳統應用包括用于計算、電信和網絡系統、數字電視、機頂盒、視頻監控系統及消費電子產品(例如:智能手機、平板電腦 ...… 查看全部問答∨ |
|
這個哪邊是進哪邊是出呀?火線零線怎么區分的呀 這個電度表最小電流大概多少就不轉沒反應了? 這個電表3(6)A是什么意思?到底是3還是6?本來我想著串在我家里總開關上看看小區的計費和這個有沒有誤差,看來是不是功率太小?廚房有微波爐電 ...… 查看全部問答∨ |
2812在調試過程中 發現,隨著代碼的增加 燒寫進入FLASH出現上電不允運行的現像。一旦退回到上一個版本的代碼 運行即恢復正常。現在可以肯定硬件沒有問題。經過反復的試驗,發現在工程中的一個C文件里增加定義了一個全局變量后燒寫進Flash就出現復位 ...… 查看全部問答∨ |