一、編程要點
1、初始化時基結構體
2、配置中斷優先級
3、寫中斷服務函數
4、寫主函數
二、定時時間計算
定時時間 = 中斷週期 * 中斷次數 (以1S爲例)
TIM_Prescaler -> TIMxPSC 寄存器
TIM_Period -> ARR (自動重裝載寄存器)
TIMxCLK 系統時鐘
CK_CLK = 1/(TIMxCLK/(PSC+1)) =1
中斷週期 = 1/(CK_CLK * ARR) =0.001s
中斷次數(time) =1000 定時時間 1*0.001*1000=1s
三、結構體&庫函數
1、定時器初始化結構體
typedef struct
{
uint16_t TIM_Prescaler; /*!< 預分頻器 配置TIMxPSC 寄存器 */
//uint16_t TIM_CounterMode; /*!< 計數器模式 向上/向下 基本定時器不用配置 */
uint16_t TIM_Period; /*!< 定時週期 配置 ARR (自動重裝載寄存器) */
//uint16_t TIM_ClockDivision; /*!< 時鐘分頻,設置定時器時鐘 CK_INT 頻率與數字濾波器採樣時鐘
頻率分頻比,基本定時器不用配置 */
//uint8_t TIM_RepetitionCounter; /*!< 重複計數器 高級定時器專屬 用於產生多少個PWM波 */
} TIM_TimeBaseInitTypeDef;
2、清除中斷標誌函數
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
TIM_ClearFlag( BASIC_TIMx , TIM_FLAG_Update); //清除中斷標誌
@brief 清除中斷標誌
@param1:TIM外設號
@param2:要清除的標誌位
3、TIM中斷使能函數
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
TIM_ITConfig(BASIC_TIMx ,TIM_IT_Update,ENABLE); //開啓中斷使能
@brief :開啓中斷使能
@param1:TIM外設號
@param2:中斷源
@param3:使能或失能
四、中斷服務函數
void TIM6_IRQHandler(void)
{
Timer++;
TIM_ClearFlag( BASIC_TIMx, TIM_FLAG_Update);//清除中斷標誌位
}
五、程序源碼
1、BASIC_Timer.h
#ifndef __BASIC_TIMER_H
#define __BASIC_TIMER_H
#include "stm32f10x.h"
#define RCC_APBxPeriphClockCmd RCC_APB1PeriphClockCmd
#define RCC_APBx_Periph RCC_APB1Periph_TIM6
#define BASIC_TIMx TIM6
#define TIM_INQx TIM6_IRQn
void TIM6_Init(void);
#endif //__BASIC_TIMER_H
2、BASIC_Timer.c
#include "BASIC_Timer.h"
static void TIM_NVIC_Config(void) //配置嵌套向量中斷控制器
{
NVIC_InitTypeDef NVIC_InitStructure; //定義初始化結構體
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC 爲優先級組1
NVIC_InitStructure.NVIC_IRQChannel = TIM_INQx; //中斷源 TIM6
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶佔優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子優先級
NVIC_Init(&NVIC_InitStructure);
}
static void BASIC_TimerInit(void)
{
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APBxPeriphClockCmd( RCC_APBx_Periph, ENABLE);
TIM_InitStructure.TIM_Prescaler = 71;
TIM_InitStructure.TIM_Period = 1000;
TIM_TimeBaseInit(BASIC_TIMx, &TIM_InitStructure);
TIM_ClearFlag( BASIC_TIMx , TIM_FLAG_Update); //清除中斷標誌
TIM_ITConfig(BASIC_TIMx ,TIM_IT_Update,ENABLE); //開啓中斷使能
TIM_Cmd( BASIC_TIMx, ENABLE);
//RCC_APBxPeriphClockCmd( RCC_APBx_Periph, DISABLE);
}
void TIM6_Init(void)
{
TIM_NVIC_Config();
BASIC_TimerInit();
}
3、main.c
#include "stm32f10x.h" // 相當於51單片機中的 #include <reg51.h>
#include "bsp_led.h"
#include "exti.h"
#include "BASIC_Timer.h"
uint32_t Timer=0;
int main(void)
{
// 來到這裏的時候,系統的時鐘已經被配置成72M。
LED_GPIO_Config();
EXTI_Key_Config();
TIM6_Init();
while(1)
{
if(Timer==1000)
{
GPIOB->ODR^=GPIO_Pin_5;// LED1 取反
Timer=0;
}
}
}