1. 程式人生 > >15-HAL庫之定時器學習

15-HAL庫之定時器學習

1.基本定時器(TIM6/TIM7)

包含時鐘源(CK_INT),1個16位自動過載遞增計數器(CK_ARR),1個16位可程式設計預分頻器(CK_PSC),計數器暫存器(CK_CNT),觸發DAC的控制器組成。時鐘源為APB外設時鐘,定時事件生成事件主要由CK_PSC和CK_ARR兩個暫存器值覺得。例如需要1s延時,時鐘源週期為100us,設定CK_ARR為9999,CK_CNT從0開始到9999,總共技術10000次,即1s後更新事件和中斷標誌。

typedef struct
{
   uint32_t Prescaler;           //預分頻係數,0~65535,時鐘源經過該係數才是定時器時鐘
   uint32_t CounterMode;         //計數模式,向上或向下,基本定時器只有向上
   uint32_t Period;              //時鐘週期
   uint32_t ClockDivision;       //時鐘分頻,基本定時器無此功能
   uint32_t RepetitionCounter;   //重複計數,高階控制定時器所用
   uint32_t AutoReloadPreload;   //自動預裝載值
}TIM_Base_InitTypeDef;

應用例子如下:

void Basic_Tim_Config(void){
	
	 HAL_TIM_Base_MspInit(&Basic_Tim6);
	__HAL_RCC_TIM6_CLK_ENABLE();
	
	Basic_Tim6.Instance=TIM6;
	Basic_Tim6.Init.Prescaler=10799;  //TIM6頻率=APB2/(Prescaler+1)=10000Hz
	Basic_Tim6.Init.Period=9999; //累計10000個週期後產生中斷(1s)
	HAL_TIM_Base_Init(&Basic_Tim6);

	HAL_NVIC_SetPriority(TIM6_DAC_IRQn,1,1);
	HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);  //優先順序配置
}

2.高階定時器(TIM1/TIM8)

包含1個16位自動過載計數器,由可程式設計預分頻器驅動,多達6個獨立通道(6路輸出控制,4路輸入捕獲),在基礎定時器的基礎上引入了外部引腳,可用於多種用途,例如測量輸入訊號的脈衝寬度(輸入捕獲),生成輸出波形(輸出比較,PWM等)。發生更新(計數器上溢/下溢、計數器初始化),突發事件,輸入捕獲,輸出比較時會生成中斷/DMA請求。

3.通用定時器

TIM2和TIM5是32位遞增/遞減/遞增遞減自動過載計數器,TIM3和TIM4是16位,4個獨立通道。

TIM9~TIM15是16位自動過載遞增計數器,2個獨立通道。