您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页STM32定时器溢出模式计时设置

STM32定时器溢出模式计时设置

来源:飒榕旅游知识分享网


STM32定时器溢出模式设置

环境:

主机:WIN7

开发环境:MDK4.23

MCU:STM32F103CBT6

源代码1:

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

初始化代码:

[cpp] view plaincopy

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); //开启计数器

延时函数代码:

[cpp] view plaincopy

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,故采用中断形式定时.

初始化代码:

[cpp] view plaincopy

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); //开启计数器

中断函数代码:

[cpp] view plaincopy

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. }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务