1. 综述
STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。
本文只针对STM8S103该芯片进行介绍,STM8S的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。
2. 关于STM8S103手册的TIM简介
每个定时器的功能都有详细介绍,大家可以认真看下。
3. TIMx详细讲解
3.1 TIM1解析
TIM1_Prescaler :即预分频系数,带有16位预分频的16位递增、递减和双向(递增/递减)自动重载计数器。
TIM1_CounterMode :即计数模式,共有3种计数模式,分别为是向上计数模式、向下计数模式、中央对齐模式(该模式又含有3种对齐模式)。
TIM1_Period :自动重载值,此项可取1-65535任意数值。
TIM1_RepetitionCounter :重复计数器值。
假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:
TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,100);
计算方法:定时器的频率fcnk = 16Mhz/(15+1) = 1Mhz,说明一次计数为1us,1000次计数为1ms,而重复计数100次,则一次中断计时时间为100ms,为了到达1s的效果, 我们还需要在中断函数里面,进行一个10次的判断。
3.2 TIM2解析
TIM2_Prescaler :15位的预分频系数,分频系数可调整为1~32768之间的2次幂数值。
TIM2_Period :自动重载值,此项可取1-65535任意数值。
假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000);
计算方法:定时器的频率fcnk = 16Mhz/(16) = 1Mhz,说明一次计数为1us,1000次计数为1ms,重复计数默认1次,则中断一次时时间为1ms,为了到达1s的效果,我们还需 要载中断函数里面,进行一个1000次的判断。
3.3 TIM4解析
TIM4_Prescaler :8位自动装载可调整的预分频系数,分频系数可调整为1~128之间2次幂数值。
TIM4_Period :自动重载值,此项可取1-255任意数值。
假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);
计算方法:定时器的频率fcnk = 16Mhz/(128) = 0.125Mhz,说明一次计数为8us,250次计数为2ms,重复计数默认1次,则中断一次时时间为2ms,为了到达1s的效果,我们 还需要载中断函数里面,进行一个500次的判断。
4. 代码
所有的参数配置和计算过程都有在3.TIMx中讲解,看官们可以认真看下。
4.1 TIM1
初始化:
1 /******************************************************************************* 2 * Function Name : MX_TIM1_Init 3 * Description : TIM1 Init 4 * Input : None 5 * Output : None 6 * Return : None 7 ********************************************************************************/ 8 void MX_TIM1_Init(void) 9 { 10 11 TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 1000, 100); 12 13 //Clear TIM1 update flag 14 TIM1_ClearFlag(TIM1_FLAG_UPDATE); 15 16 //Enable update interrupt 17 TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE); 18 TIM1_Cmd(ENABLE); 19 20 //使能中断 21 enableInterrupts(); 22 }
中断服务函数:
1 INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11) 2 { 3 /* In order to detect unexpected events during development, 4 it is recommended to set a breakpoint on the following instruction. 5 */ 6 static uint8_t count = 0; 7 8 if(count++ == 10) 9 { 10 //翻转LED 11 GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin); 12 13 count = 0; 14 } 15 //定时器1的标志位清零 16 TIM1_ClearITPendingBit(TIM1_IT_UPDATE); 17 }
4.2 TIM2
初始化:
1 /******************************************************************************* 2 * Function Name : MX_TIM2_Init 3 * Description : TIM1 Init 4 * Input : None 5 * Output : None 6 * Return : None 7 ********************************************************************************/ 8 void MX_TIM2_Init(void) 9 { 10 //TIM2 Init 11 TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000); 12 13 //Clear TIM1 update flag 14 TIM2_ClearFlag(TIM2_FLAG_UPDATE); 15 16 //Enable update interrupt 17 TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); 18 TIM2_Cmd(ENABLE); 19 20 //使能中断 21 enableInterrupts(); 22 }
中断服务函数:
1 INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13) 2 { 3 /* In order to detect unexpected events during development, 4 it is recommended to set a breakpoint on the following instruction. 5 */ 6 uint16_t static count = 0; 7 8 if(count++ == 1000) 9 { 10 //翻转LED 11 GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin); 12 13 count = 0; 14 } 15 //定时器2的标志位清零 16 TIM2_ClearITPendingBit(TIM2_IT_UPDATE); 17 }
4.3 TIM4
初始化:
1 /******************************************************************************* 2 * Function Name : MX_TIM4_Init 3 * Description : TIM1 Init 4 * Input : None 5 * Output : None 6 * Return : None 7 ********************************************************************************/ 8 void MX_TIM4_Init(void) 9 { 10 11 //TIM4 Init 12 TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250); 13 14 //Clear TIM4 update flag 15 TIM4_ClearFlag(TIM4_FLAG_UPDATE); 16 17 //Enable update interrupt 18 TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); 19 TIM4_Cmd(ENABLE); 20 21 //使能中断 22 enableInterrupts(); 23 }
中断服务函数:
1 INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) 2 { 3 /* In order to detect unexpected events during development, 4 it is recommended to set a breakpoint on the following instruction. 5 */ 6 7 static uint16_t count = 0; 8 9 if(count++ == 500) 10 { 11 //翻转LED 12 GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin); 13 14 count = 0; 15 } 16 //定时器4的标志位清零 17 TIM4_ClearITPendingBit(TIM4_IT_UPDATE); 18 19 }
5. 结尾
本博客只介绍了如何控制LED翻转,但定时器的功能远不止于此,详情请大家自行去了解。
相对来说,STM8的定时器功能还是比较有用的,希望该博客能够帮助到大家实现TIM功能。
对STM8的GPIO的说明和引用到这里结束,感谢各位看官的点击。
如果觉得有所收获请点下推荐,若认为该博客中存在错误的说明或者对博客中某方面有疑问请留言。
作 者:浩宇99? 出 处:https://www.cnblogs.com/zhenghaoyu/p/10704702.html版权声明:本文原创发表于 博客园,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
原文地址:https://www.cnblogs.com/zhenghaoyu/p/10704702.html