概述
這次是STM32中定時器部分的介紹,他與51系統的不同是定時器數量的增加以及寄存器的調用,説白了,庫函數還是基於寄存器的。
STM32F103系列的單片機一共有11個定時器:
2個高級定時器、4個通用定時器、2個基本定時器、2個看門狗定時器、1個系統滴答定時器、除去看門狗定時器和滴答定時器,其他8個定時器列表:
其中,
TIM1和TIM8是高級定時器
TIM2 - TIM5是通用定時器
TIM6和TIM7是基本定時器
這8個定時器都是16位的,它們計數的類型除了基本定時器TIM6和TIM7,都支持向上、向下、向上/向下3種計數模式。
基本定時器(TIM6和TIM7)主要功能:
只有最基本的定時功能。基本定時器TIM6和TIM7各包含一個16位自動裝載計數器,由各自的可編程預分頻器驅動。
通用定時器(TIM2 - TIM5)主要功能:
除了基本的定時器的功能外,還可以測量輸入信號的脈衝長度( 輸入捕獲) 或者產生輸出波形( 輸出比較和PWM)。
高級定時器(TIM1和TIM8)主要功能:
高級定時器不但具有基本、通用定時器的所有的功能,還具有控制交直流電動機的所有功能。比如它可以輸出6路互補帶死區的信號,剎車功能等等。
以上摘自STM32官方數據手冊!!!
瞭解了一部分定時器的使用了的話我打算用定時器來實現一個精準的LED閃爍實驗:
1.首先新建工程不必説
2.新建兩個新建兩個文件,tim.c 和 tim.h
3.在tim.c中添加以下代碼
#include “tim.h”
void TIMx_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //聲明TIMx定時器結構體
NVIC_InitTypeDef NVIC_InitStructure; //聲明中斷優先級結構體
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中斷優先級分組
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能APB1總線上的TIMx時鐘
TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件活動的自動裝載寄存器週期的值
TIM_TimeBaseStructure.TIM_Prescaler = psc; //設置用來作為TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //根據指定的參數初始化TIMx的時間基數單位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允許TIMx中斷更新
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //配置外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //設置搶先優先級為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //設置子優先級為3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //初始化中斷優先級
TIM_Cmd(TIM3,ENABLE); //使能TIMx
}
void TIM3_IRQHandler(void) //TIMx中斷服務函數
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET) //檢查TIMx更新中斷
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIMx中斷標誌位
GPIOC->ODR ^= 0X0001<<13; //PC.13高低電平交替翻轉
}
}
定時器中斷配置步驟:
- NVIC優先級組配置
- 使能定時器時鐘
- 初始化定時器
- 設置定時器允許更新中斷
- 設置定時器中斷優先級
- 使能定時器
- 編寫中斷服務函數
實現閃爍,需要注意的是:在中斷函數中需要檢驗一下標誌位,因為定時器的所有事件共用一箇中斷。但只使用更新中斷不用檢驗也是沒有問題滴。這也是需要注意的地方之一。。。