定时器计数值的确定。
TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。
各个功能定时器的比较表。
Timer分布
systemtick的时钟直接来源于AHB,而且是24位的定时时钟,一般常用在实时操作系统中。定时非常准确。以下是systemtick的配置函数,由专门的中断void SysTick_Handler(void)。
/**
* @brief SysTick时钟配置。
* @note 调用的是系统中的配置函数,将其函数名改掉而已,便于统一管理。
* 只需要在该配置中加入计数值即可实现任意时间的定时配置,包括1us。
* <h2><center>需要结合中断函数。
* void SysTick_Handler(void){···}</center></h2>
* @param ticks : 计数值。该计数值可通过以下公式求得:AHB_Clk*需要定时值,
* 例如需要定时1ms,且60MHz的AHB,则计数值 = 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, ENABLE);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
- NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure1);
- TIM_DeInit(TIM3);
- TIM_TimeBaseStructure.TIM_Period = 599;
- TIM_TimeBaseStructure.TIM_Prescaler = 0;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- TIM_ClearFlag(TIM3, TIM_FLAG_Update);
- TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
- TIM_Cmd(TIM3, ENABLE);
- }
复制代码
30MHz APB1时钟1ms定时中断。
- void TIM_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure1;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
- NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure1);
- TIM_DeInit(TIM3);
- TIM_TimeBaseStructure.TIM_Period = (60000-1);
- TIM_TimeBaseStructure.TIM_Prescaler = 0;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- TIM_ClearFlag(TIM3, TIM_FLAG_Update);
- TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
- TIM_Cmd(TIM3, ENABLE);
- }
复制代码
|