STM32定时器溢出模式设置

STM32定时器溢出模式设置


本文博客链接:http://blog.youkuaiyun.com/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN7

开发环境:MDK4.23

MCU:STM32F103CBT6


源代码1:

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

初始化代码:

[cpp]  view plain copy
  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  
  2. //重新将Timer设置为缺省值  
  3. TIM_DeInit(TIM2);  
  4. //采用内部时钟给TIM2提供时钟源  
  5. TIM_InternalClockConfig(TIM2);  
  6.   
  7. timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;             //定时器基准频率8MHz  
  8. timInitStruct.TIM_Prescaler = 8 - 1;                        //计数频率为1us跳转1次  
  9. timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;         //向上计数  
  10. timInitStruct.TIM_RepetitionCounter = 0;  
  11. timInitStruct.TIM_Period = 0;                               //这个值实际上就是TIMX->ARR,延时开始时重新设定即可  
  12.   
  13. TIM_TimeBaseInit(TIM2, &timInitStruct);  
  14. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);                  //计数溢出时触发中断  
  15. TIM_Cmd(TIM2, ENABLE);                                      //开启计数器  


延时函数代码:

[cpp]  view plain copy
  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.   
  15. //延迟1ms  
  16. //最大65ms  
  17. void _delay_ms(uint8_t t)  
  18. {  
  19.       
  20.     if (t > 65)  
  21.     {  
  22.         t = 65;  
  23.     }  
  24.     _delay_us(t * 1000);  
  25. }  

源代码2:

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

初始化代码:

[cpp]  view plain copy
  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.   
  9. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  
  10. //重新将Timer设置为缺省值  
  11. TIM_DeInit(TIM3);  
  12. //采用内部时钟给TIM3提供时钟源  
  13. TIM_InternalClockConfig(TIM3);  
  14.   
  15. timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;             //定时器基准频率8MHz  
  16. timInitStruct.TIM_Prescaler = 800 - 1;                      //计数频率为100us跳转1次  
  17. timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;         //向上计数  
  18. timInitStruct.TIM_RepetitionCounter = 0;  
  19. timInitStruct.TIM_Period = 0;                               //这个值实际上就是TIMX->ARR,延时开始时重新设定即可  
  20.   
  21. TIM_TimeBaseInit(TIM3, &timInitStruct);  
  22. //清溢出中断标志  
  23. TIM_ClearFlag(TIM3, TIM_FLAG_Update);  
  24. //禁止ARR预装载缓冲器  
  25. TIM_ARRPreloadConfig(TIM3, DISABLE);  
  26. //开启中断  
  27. TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);                
  28. TIM_Cmd(TIM3, ENABLE);                                      //开启计数器  

中断函数代码:

[cpp]  view plain copy
  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. }  


版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值