定時器計數(shù)值的確定。
TIMER的時鐘不是直接來源于APB1或者APB2,而是來自經(jīng)過APB1或者APB2一個倍頻器后的時鐘。當APBx的預(yù)分頻數(shù)為1時,這個倍頻器不起作用,此時定時器的時鐘頻率等于APBx的頻率;當APBx倍頻數(shù)為其他數(shù)值時(即預(yù)分頻數(shù)位2,4,8,16時),這個倍頻數(shù)起作用,定時器時鐘為APBx的兩倍。例如AHB=60MHz,APB1為AHB的2分頻,即為30MHz,則掛載在APB1下的時鐘的頻率為60MHz(2倍頻)。
各個功能定時器的比較表。
Timer分布
TIM號
引腳映射
說明
TIMER
TIM1
TIM1_BKIN-PA6
TIM1_CH1N-PA7
TIM1_CH2N-PB0
TIM1_CH3N-PB1
TIM1_ETR-PE7
TIM1_CH1N-PE8
TIM1_CH1-PE9
TIM1_CH2N-PE10
TIM1_CH2-PE11
TIM1_CH3N-PE12
TIM1_CH3-PE13
TIM1_CH4-PE14
TIM1_BKIN-PE15
TIM1_CH1N-PB13
TIM1_CH2N-PB14
TIM1_CH3N-PB15
TIM1_CH1-PA8
TIM1_CH2-PA9
TIM1_CH3-PA10
TIM1_CH4-PA11
TIM1_ETR-PA12
高級控制定時器。可作為三相六通道PWM波形發(fā)生器。
也可以當做普通功能的定時器。
可以使用以下四種獨立通道:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
TIM2
TIM2_CH1_ETR-PA0
TIM2_CH2-PA1
TIM2_CH3-PA2
TIM2_CH4-PA3
TIM2_CH1_ETR-PA5
TIM2_CH3-PB10
TIM2_CH4-PB11
TIM2_CH1_ETR-PA15
TIM2_CH2-PB3
通用功能定時器。
32位定時器,32位自動重裝的上升或者下降計數(shù)器和一個16位預(yù)分頻器。
TIM3
TIM3_CH1-PA6
TIM3_CH2-PA7
TIM3_CH3-PB0
TIM3_CH4-PB1
TIM3_CH1-PC6
TIM3_CH2-PC7
TIM3_CH3-PC8
TIM3_CH4-PC9
TIM3_CH1-PB4
TIM3_CH2-PB5
通用功能定時器。
16位定時器,16位自動重裝的上升或者下降計數(shù)器和一個16位預(yù)分頻器。
TIM4
TIM4_CH1-PD12
TIM4_CH2-PD13
TIM4_CH3-PD14
TIM4_CH4-PD15
TIM4_CH1-PB6
TIM4_CH2-PB7
TIM4_CH3-PB8
TIM4_CH4-PB9
TIM4_ETR-PE0
通用功能定時器。
16位定時器,16位自動重裝的上升或者下降計數(shù)器和一個16位預(yù)分頻器。
TIM5
TIM5_CH1-PA0
TIM5_CH2-PA1
TIM5_CH3-PA2
TIM5_CH4-PA3
TIM5_CH1_ETR-PH10
TIM5_CH2-PH11
TIM5_CH3-PH12
TIM5_CH4-PI0
通用功能定時器。
32位定時器,32位自動重裝的上升或者下降計數(shù)器和一個16位預(yù)分頻器。
TIM6
基本時鐘。
主要作為DAC的觸發(fā)器和波形發(fā)生器;也可以用作通用16位定時器。
TIM7
基本時鐘。
主要作為DAC的觸發(fā)器和波形發(fā)生器;也可以用作通用16位定時器。
TIM8
TIM8_ETR-PA0
TIM8_BKIN-PA6
TIM8_CH1N-PA7
TIM8_CH2N-PB0
TIM8_CH3N-PB1
TIM8_CH2N-PB14
TIM8_CH3N-PB15
TIM8_CH1-PC6
TIM8_CH3-PC8
TIM8_CH4-PC9
TIM8_CH1N-PH13
TIM8_CH2N-PH14
TIM8_CH3N-PH15
TIM8_CH4-PI2
TIM8_ETR-PI3
TIM8_BKIN-PI4
TIM8_CH1-PI5
TIM8_CH2-PI6
TIM8_CH3-PI7
高級控制定時器??勺鳛槿嗔ǖ繮WM波形發(fā)生器。
也可以當做普通功能的定時器。
可以使用以下四種獨立通道:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
TIM9
TIM9_CH1-PE5
TIM9_CH2-PE6
TIM9_CH1-PA2
TIM9_CH2-PA3
基于自動重裝的16位上升計數(shù)器和一個16位預(yù)分頻器。兩個獨立通道??梢宰鳛楹唵蔚臅r鐘基準。
功能:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
TIM10
TIM10_CH1-PF6
TIM10_CH1-PB8
基于自動重裝的16位上升計數(shù)器和一個16位預(yù)分頻器。1個獨立通道??梢宰鳛楹唵蔚臅r鐘基準。
功能:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
TIM11
TIM11_CH1-PF7
TIM11_CH1-PB9
基于自動重裝的16位上升計數(shù)器和一個16位預(yù)分頻器。1個獨立通道??梢宰鳛楹唵蔚臅r鐘基準。
功能:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
TIM12
TIM12_CH1-PH6
TIM12_CH2-PH9
TIM12_CH1-PB14
TIM12_CH2-PB15
基于自動重裝的16位上升計數(shù)器和一個16位預(yù)分頻器。1個獨立通道??梢宰鳛楹唵蔚臅r鐘基準。
功能:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
TIM13
TIM13_CH1-PF8
TIM13_CH1-PA6
基于自動重裝的16位上升計數(shù)器和一個16位預(yù)分頻器。1個獨立通道??梢宰鳛楹唵蔚臅r鐘基準。
功能:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
TIM14
TIM14_CH1-PF9
TIM14_CH1-PA7
基于自動重裝的16位上升計數(shù)器和一個16位預(yù)分頻器。1個獨立通道??梢宰鳛楹唵蔚臅r鐘基準。
功能:
1. 輸入捕捉;
2. 輸出比較;
3.PWM發(fā)生器;
4. 單相輸出模式。
Independent watchdog
獨立看門狗。
基于12位向下計數(shù)器和八位預(yù)分頻器,可以由獨立的32K內(nèi)部RC??梢灾餍酒瑪嚯娤掠杉~扣電池繼續(xù)工作。
Window watchdog
窗口看門狗。
基于7位可以自由運行的向下計數(shù)器。
SysTick timer
主要用于實時操作系統(tǒng),也可以用在標準的向下計數(shù)器。
1.24位向下計數(shù)器;
2. 重載功能;
3. 當計數(shù)到0產(chǎn)生一個系統(tǒng)中斷標志;
4. 可編程時鐘資源。
systemtick的時鐘直接來源于AHB,而且是24位的定時時鐘,一般常用在實時操作系統(tǒng)中。定時非常準確。以下是systemtick的配置函數(shù),由專門的中斷void SysTick_Handler(void)。
/**
* @brief SysTick時鐘配置。
* @note調(diào)用的是系統(tǒng)中的配置函數(shù),將其函數(shù)名改掉而已,便于統(tǒng)一管理。
*只需要在該配置中加入計數(shù)值即可實現(xiàn)任意時間的定時配置,包括1us。
*
* void SysTick_Handler(void){···}
* @param ticks : 計數(shù)值。該計數(shù)值可通過以下公式求得:AHB_Clk*需要定時值,
*例如需要定時1ms,且60MHz的AHB,則計數(shù)值= 60MHz*1ms = 600000。
* @retval返回配置是否成功標志。
*/
60MHz AHB1時鐘systemtick定時中斷。
uint32_t BSP_CLK_SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
30MHz APB1時鐘10us定時中斷。
void TIM_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,