目錄
前言
通用定時器類型
? ? ? ? 向上計數、向下計數、中心對齊
輸入捕獲與輸出比較概念
輸出比較典型例子:驅動舵機旋轉
通用定時器的輸出比較庫函數
代碼
通用定時器的輸出比較寄存器操作
代碼
這里提供數據手冊的寄存器
后言
前言
使用平臺:STM32F407ZET6
使用數據手冊:STM32F407數據手冊.pdf
使用參考手冊:STM32F4xx參考手冊(中文).pdf
使用cortex-M手冊:Cortex M3與M4權威指南.pdf
對于STM32F407微處理器而言,內部一共集成了14個定時器,其中有2個基本定時器(TIM6和TIM7)、10個通用定時器(TIM2~TIM5、TIM9~TIM14)、2個高級定時器(TIM1和TIM8)。
通用定時器類型
? ? ? ? 通用定時器相對于基本定時器增加了輸入捕獲與輸出比較功能。
可以確定,遞增計數是所有定時器通用的,保險起見,整體設置為遞增計數可以提高通用性。
? ? ? ? 向上計數、向下計數、中心對齊
STM32F407ZET6一共提供10個通用定時器(TIM2~TIM5、TIM9~TIM14),TIM2和TIM5是32bit定時器,其他的定時器都是16bit定時器。TIM2~TIM5的計數方式有三種可以選擇,分別為遞增計數、遞減計數、遞增/遞減計數。
遞增計數:計數器從 0 計數到自動重載值(TIMx_ARR 寄存器的內容),然后重新從 0 開始計數并生成計數器上溢事件。
遞減計數:計數器從自動重載值(TIMx_ARR 寄存器的內容)開始遞減計數到 0,然后重新從自動重載值開始計數并生成計數器下溢事件。
中心對齊:計數器從 0 開始計數到自動重載值(TIMx_ARR 寄存器的內容)- 1,生成計數器上溢事件;然后從自動重載值開始向下計數到 1 并生成計數器下溢事件。之后從 0 開始重新計數。
對于通用定時器TIM2~TIM5,都掛載在APB1外設總線下,定時器的頻率為84MHZ,對于TIM12~TIM14都掛載在APB1外設總線下,定時器的頻率為84MHZ,TIM9~TIM11是掛載在APB2總線下,所以定時器的頻率為168MHZ,如下圖
輸入捕獲與輸出比較概念
輸入捕獲:可以把定時器的某個通道連接到GPIO引腳上,然后從外部輸入脈沖信號,經過通道的濾波以及邊沿檢測之后,可以記錄某個電平信號的脈沖寬度以及周期。
輸出比較:可以把定時器的某個通道連接到GPIO引腳上,主動從引腳輸出一個固定的脈沖,原理很簡單,其實就是計數器(TIM_CNT)如果超過比較寄存器(CCR)中的值,就可以輸出一個電平信號(高電平或者低電平)。
對于TIM9~TIM14而言,也可以進行定時功能,同樣也具有輸入捕獲以及輸出比較功能,但是只能采用向上計數的方式,并且相比于TIM2~TIM5,只有2個獨立通道。
輸出比較典型例子:驅動舵機旋轉
? ? ? ? 驅動舵機旋轉需要調制PWM,PWM技術的關鍵參數有兩個,一個是頻率,一個是占空比。頻率指的是利用STM32的定時器通道輸出脈沖的次數。占空比是指在一個脈沖周期中通電時間相對于總時間所占的比例,也可以簡單理解為一個周期內高電平持續時間相對于總時間所占的比例(%)。
????????舵機(Servo Motor)是一種集成了電機、減速齒輪組、控制電路和位置反饋系統的微型伺服裝置,可通過接收外部控制信號實現高精度角度定位。與傳統電機不同,舵機無需持續旋轉,而是通過內置電位器或編碼器實時檢測輸出軸角度,形成閉環控制,從而精準到達指定位置并保持力矩。
????????一般180°控制旋轉的舵機,驅動的PWM參數:
通用定時器的輸出比較庫函數
代碼
本質調用了如下函數可以實現輸出比較功能
RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE)
RCC_AHBxPeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);GPIO_Init(GPIOx, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_TIMx);TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct);
TIM_OCxInit(TIMx, &TIM_OCInitStruct);TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_ENABLE);
TIM_ARRPreloadConfig(TIMx, ENABLE);TIM_Cmd(ENABLE)
庫函數代碼:
PF9的TIM14通用定時器實現的PWM
/*** @brief PF9的TIM14通用定時器實現的PWM**/
void TimerCaptureOutputInit(void)
{/* 開啟GPIOF與TIM14的時鐘 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);/* 配置GPIO為AF復用功能 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOF, &GPIO_InitStruct);GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);/* 配置定時器的時基配置 20ms*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 2000 - 1;TIM_TimeBaseInitStruct.TIM_Prescaler = 840 - 1;TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);/* 配置輸出捕獲配置 */TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = 1000;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM14, &TIM_OCInitStruct);TIM_ARRPreloadConfig(TIM14, ENABLE);TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);TIM_Cmd(TIM14, ENABLE);
}
通過操控CRR寄存器或者TIM_SetComparex函數
TIM_SetComparex(TIMx, Compare1)
或者
TIMx->CCRx = 1500;
通用定時器的輸出比較寄存器操作
代碼
/*** @brief 基本定時器TIM4 CH4 PB9* PWM波生成*/
void TimerNormalTIM4_4RegisterInit(void)
{// 初始化時鐘RCC->AHB1ENR |= (1 << 1); // GPIOBRCC->APB1ENR |= (1 << 2); // TIM4// 對GPIOB的模式配置GPIOB->MODER &= ~(3 << (2 * 9));GPIOB->MODER |= (2 << (2 * 9)); //復用功能GPIOB->OSPEEDR |= (3 << (2 * 9));GPIOB->OTYPER &= ~(1 << 9); //推挽GPIOB->PUPDR &= ~(3 << 18); // 先清零GPIOB->PUPDR |= (1 << 18); // 上拉(或 0 浮空,2 下拉)// 配置GPIOB與復用功能(TIM4_CH4)聯合GPIOB->AFR[1] &= ~(0xf << 4);GPIOB->AFR[1] |= (2 << 4); //綁定具體的復用功能 TIM4 CH4// 配置定時器參數TIM4->CR1 &= ~(1 << 0); // 關閉定時器/* 配置分頻系數等參數 */TIM4->ARR = 20000 - 1;TIM4->CNT = 0;TIM4->PSC = 84 - 1;TIM4->CCR4 = 1500 - 1;TIM4->CR1 |= (1 << 7); // 自動重載預裝載值TIM4->CR1 &= ~(1 << 4); // 計數器向上計數TIM4->CCMR2 &= ~(7 << 12);TIM4->CCMR2 |= (6 << 12); // PWM模式1TIM4->CCMR2 |= (1 << 11); // 輸出比較4預裝載使能TIM4->CCER |= (1 << 12); //使能通道CH4TIM4->DIER &= ~(1 << 0); //未使用中斷,所以禁止中斷TIM4->EGR |= (1 << 0); //TIM4->CR1 |= (1 << 0); // 開啟定時器
}
這里提供數據手冊的寄存器
GPIO的模式寄存器設置為復用功能模式
復用功能寄存器
此寄存器需要對照數據手冊
TIM的部分寄存器
控制寄存器
TIM捕獲/比較模式寄存器
TIM捕獲/比較使能寄存器
TIM事件生成寄存器