微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 之初探定时器

之初探定时器

时间:10-02 整理:3721RD 点击:

    stm32好久没怎么鼓捣了,最近想写个定时器程序,查看下历程没有最简单的定时器,我就复制例程中比较基础的进行修改。看了下stm32f412参考手册,感觉f412的定时器功能很全,而且我简单的看了下f412的时钟树,感觉挺强大比我看到的f103的时钟。
    因为需求是最基本的定时器产生50us的中断,所以采用定时器6,最后研读代码时发现定时器的时钟源没有在参考手册上找到详细的介绍,后来发现412的数据手册上有简单的介绍定时器的时钟源由APB1和APB2决定的其中APB1最高时钟是50MHz而APB2最高事100Hz。

  1. <div>/*定时器频率 50us 进一次中断*/
  2. #define timerINTERRUPT_FREQUENCY 20000
  3. /* 中断优先级 */
  4. #define timerHIGHEST_PRIORITY 1
  5. /* 系统调用 */
  6. volatile uint32_t ulHighFrequencyTimerTicks = 0UL;

  7. void HAL_TIM6_Init(void)
  8. {
  9.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  10.         NVIC_InitTypeDef NVIC_InitStructure;

  11. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
  12.     NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;</div><div>
  13. /* Compute the prescaler value
  14.            To get TIM6 counter clock at 20000Hz, the prescaler is computed as follows:
  15.        Prescaler = (TIM6CLK / TIM6 counter clock) - 1
  16.        Prescaler = ((SystemCoreClock /2) /20000Hz) - 1*/</div><div>
  17. TIM_DeInit(TIM6);
  18.         TIM_TimeBaseStructure.TIM_Period = timerINTERRUPT_FREQUENCY;
  19.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  20.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_div1;//TIM_CKD_div1 means no division
  21.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  22.         TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
  23.         TIM_ARRPreloadConfig(TIM6, ENABLE);
  24.         /* Enable the TIM6 global Interrupt */
  25.         NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
  26.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = timerHIGHEST_PRIORITY;
  27.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  28.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  29.         NVIC_Init(&NVIC_InitStructure);

  30. /* TIM Interrupts enable */
  31.         TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

  32.         /* TIM6 enable counter */
  33.         TIM_Cmd(TIM6, ENABLE);
  34. }

  35. void TIM6_IRQHandler(void)
  36. {
  37.         if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
  38.         {
  39.                 ulHighFrequencyTimerTicks++;
  40.                 TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
  41.         }
  42. }</div>

复制代码

上面是我修改后的代码最基础的定时器功能。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top