[STM32F1] STM32定时器溢出模式计时设置

[复制链接]
750|0
 楼主| 734774645 发表于 2016-3-23 10:38 | 显示全部楼层 |阅读模式

环境:

主机:WIN7

开发环境:MDK4.23

MCU:STM32F103CBT6


源代码1:

说明:定时器采用TIM2,时钟源为内部8M晶振,向上溢出模式.此定时器用在延时函数,最小可以延时1us,故没有采用中断形式定时.

初始化代码:

  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  2. //重新将Timer设置为缺省值
  3. TIM_DeInit(TIM2);
  4. //采用内部时钟给TIM2提供时钟源
  5. TIM_InternalClockConfig(TIM2);

  6. timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;                           //定时器基准频率8MHz
  7. timInitStruct.TIM_Prescaler = 8 - 1;                                           //计数频率为1us跳转1次
  8. timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数
  9. timInitStruct.TIM_RepetitionCounter = 0;
  10. timInitStruct.TIM_Period = 0;                                                                 //这个值实际上就是TIMX->ARR,延时开始时重新设定即可

  11. TIM_TimeBaseInit(TIM2, &timInitStruct);
  12. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);                                         //计数溢出时触发中断
  13. TIM_Cmd(TIM2, ENABLE);                                                                                 //开启计数器

延时函数代码:

  1. //延时1us
  2. //最大65536us
  3. void _delay_us(uint16_t t)
  4. {
  5.         TIM_SetCounter(TIM2,0);
  6.         TIM_SetAutoreload(TIM2,t - 1);
  7.         //等待时间到
  8.         while (TIM_GetITStatus(TIM2,TIM_FLAG_Update) == 0);
  9.         //停止计数
  10.         TIM_SetAutoreload(TIM2,0);
  11.         //清中断标志
  12.         TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
  13. }

  14. //延迟1ms
  15. //最大65ms
  16. void _delay_ms(uint8_t t)
  17. {
  18.        
  19.         if (t > 65)
  20.         {
  21.                  t = 65;
  22.         }
  23.         _delay_us(t * 1000);
  24. }

源代码2:

说明:定时器采用TIM3,时钟源为内部8M晶振,向上溢出模式.此定时器用在长时间计时,最小计时间隔为100us,故采用中断形式定时.

初始化代码:

  1. //中断NVIC设置:允许中断,设置优先级
  2. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  3. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                            //更新事件
  4. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
  5. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;          //响应优先级1
  6. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
  7. NVIC_Init(&NVIC_InitStructure);                             //写入设置

  8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  9. //重新将Timer设置为缺省值
  10. TIM_DeInit(TIM3);
  11. //采用内部时钟给TIM3提供时钟源
  12. TIM_InternalClockConfig(TIM3);

  13. timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;                           //定时器基准频率8MHz
  14. timInitStruct.TIM_Prescaler = 800 - 1;                                   //计数频率为100us跳转1次
  15. timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数
  16. timInitStruct.TIM_RepetitionCounter = 0;
  17. timInitStruct.TIM_Period = 0;                                                                 //这个值实际上就是TIMX->ARR,延时开始时重新设定即可

  18. TIM_TimeBaseInit(TIM3, &timInitStruct);
  19. //清溢出中断标志
  20. TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  21. //禁止ARR预装载缓冲器
  22. TIM_ARRPreloadConfig(TIM3, DISABLE);
  23. //开启中断
  24. TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);                                
  25. TIM_Cmd(TIM3, ENABLE);                                                                                 //开启计数器

中断函数代码:

  1. //TIM3中断
  2. void TIM3_IRQHandler(void)
  3. {
  4.         if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
  5.     {
  6.                 TIM3->ARR = 0;
  7.         //清中断溢出标志
  8.                 TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
  9.        
  10.                 //发送信号
  11.                 Sig_Table.stop_require = 1;
  12.     }
  13. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

3588

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部