定时器计数值的确定。 
 
    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);
 
  
- }
 
  
  复制代码 
 |