基於STM32F103ZET6實現定時器中斷

爲了實現定時器中斷的判斷,將利用 TIM3 的定時器中斷來控制 DS1 的翻轉,在主函數用 DS0的常亮轉來提示程序正在運行。
STM32F1 的定時器功能很多,有 TIME1 和 TIME8 等高級定時器,也有TIME2~TIME5 等通用定時器,還有 TIME6和 TIME7 等基本定時器。STM32F1 的通用定時器是一個通過可編程預分頻器(PSC)驅動的 16 位自動裝載計數器(CNT)構成。
STM32 的通用定時器可以被用於:
(1)測量輸入信號的脈衝長度(輸入捕獲)
(2)產生輸出波形(輸出比較和 PWM)等。
使用定時器預分頻器RCC 時鐘控制器預分頻器,脈衝長度和波形週期可以在幾個微秒到幾個毫秒間調整。每個通用定時器都是完全獨立的,沒有互相共享的任何資源。
那麼什麼時候可以出發定時器中斷呢?
(1)更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
(2)輸入捕獲
(3)輸出比較
(4)計數器啓動、停止、初始化或者由內部/外部觸發計數
講這麼多,我們該如何配置可編程的寄存器呢?
1.控制寄存器
在這裏插入圖片描述
最低位是使能位,該位必須置 1,第 4 位 DIR 可以看出默認的計數方式是向上計數,同時也可以向下計數,第 5,6位是設置計數對齊方式的。從第 8 和第 9 位可以看出,我們還可以設置定時器的時鐘分頻因子爲 1,2,4。
2.DMA/中斷使能寄存器
在這裏插入圖片描述
只需要配置第 0 位,該位是更新中斷允許位,我們用到的是定時器的更新中斷,所以該位要設置爲 1,來允許由於更新事件所產生的中斷。
3.預分頻寄存器(TIMx_PSC)
該寄存器用設置對時鐘進行分頻,然後提供給計數器,作爲計數器的時鐘。
高級定時器的時鐘不是來自 APB1,而是來自 APB2 的。
4. TIMx_CNT 寄存器
該寄存器是定時器的計數器,該寄存器存儲了當前定時器的計數值。
5.自動重裝載寄存器(TIMx_ARR)
在這裏插入圖片描述
該寄存器在物理上實際對應着 2 個寄存器。一個是程序員可以直接操作的,另外一個是程序員看不到的,被叫做影子寄存器。
寄存器介紹完了,直接開始實踐我爲我們的代碼!
定時器中斷頭文件timer.h
#ifndef TIMER_H
#define TIMER_H
extern void timer_init(void);
#endif
定時器中斷源文件timer.c
#include “timer.h”
#include “sys.h”
#include “led.h”
void timer_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
LED_Init();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period= 5000;
TIM_TimeBaseInitStructure.TIM_Prescaler=7199;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStructure);

}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
LED1=!LED1;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
}
主要就是定時器的初始化,有的讀者就要問了,這樣初始化那樣初始化,到底怎麼才能比較全面的初始化流程呢?
打個比方:定時器中斷
包含
定時器:想要用到定時器,必須有提供的時鐘,初始化定時器參數設置好了(TIM_TimeBaseInit()),我們就要去打開定時器(TIM_Cmd(TIM3, ENABLE)),然後(打開)使能更新中斷(TIM_ITConfig( )
中斷:中斷初始化(包括優先級,中斷類型NVIC_Init()),中斷開啓**(TIM_Cmd())**,
定時器中斷主函數main.c
#include “led.h”
#include “sys.h”
#include “wwdg.h”
#include “timer.h”
int main(void)
{
LED_Init();
timer_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
while(1)
{
LED0=0;
}
}
現象
TIM3 的定時器中斷來控制 DS1 的翻轉,在主函數用 DS0的常亮

程序格式比較固定,希望大家能在以後的工作中舉一反三,清楚原理就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章