基于STM8的TIM定时器操做---STM8-第三章

1. 综述html

  STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不一样功能但都基于共同的架构。此共同的架构使得采用各个定时器设计应用变得很是容易与方便(相同的寄存器映射,相同的基本功能)。架构

  本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每一个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。函数

 

2. 关于STM8S103手册的TIM简介ui

  每一个定时器的功能都有详细介绍,你们能够认真看下。spa

 

3. TIMx详细讲解设计

3.1 TIM1解析code

  TIM1_Prescaler          :即预分频系数,带有16位预分频的16位递增、递减和双向(递增/递减)自动重载计数器。htm

  TIM1_CounterMode      :即计数模式,共有3种计数模式,分别为是向上计数模式、向下计数模式、中央对齐模式(该模式又含有3种对齐模式)。blog

  TIM1_Period                 :自动重载值,此项可取1-65535任意数值。ip

  TIM1_RepetitionCounter :重复计数器值。

 

  假设咱们的系统时钟是16Mhz,咱们定时1秒钟,那咱们初始化设置应该为:  

  TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,100);  

计算方法:定时器的频率fcnk = 16Mhz/(15+1) = 1Mhz,说明一次计数为1us,1000次计数为1ms,而重复计数100次,则一次中断计时时间为100ms,为了到达1s的效果,咱们还须要在中断函数里面,进行一个10次的判断。(1MHZ = 1000KHZ = 1000000HZ, 至关于 1/1000000 = 1us)

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. 例程

4.1 编译环境

  个人编译环境是IAR,这款软件是如今STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,由于在用STM32的时候就是利用Keil5编译代码,的确很方便。

 

4.2 主芯片

  个人主芯片是STM8S系列中的103,其中STM8S的00三、00五、和10三、105,配置同样(外设和CPU频率,FLASH),在代码相同的状况下都可进行烧写。

 

4.3 库文件的添加

  咱们的工程能够在IAR中的官方例程中复制,操做过程:打开STM8S_StdPeriph_Lib(这是一个官方的库文件,下载IAR STM8包的时候就携带,里面有库文件和相对应的例程),将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,就能够开始编写代码了(若是你将所有的库文件都添加进来的话,编译程序后库文件还有红点报错的话,这是由于你选的芯片上没有该功能,你须要将其删掉才能不报错。)如图。

                   

 

4.4 代码

 

4.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   //定时器1参数初始化 (15分频,向上计数,计数次数,重复次数)
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 }

中断服务函数:

因为IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,因此此段代码须要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。

经过初始化所配置的参数,加上count 10次的累加,达到1S翻转一次LED的效果,每一次进行中断后都须要对定时器的标志位进行清零处理。

 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.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   //定时器2参数初始化 (16分频,计数次数)
11   TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000); 12 
13   //Clear TIM2 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 }

中断服务函数:

因为IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,因此此段代码须要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。

经过初始化所配置的参数,加上count 1000次的累加,达到1S翻转一次LED的效果,每一次进行中断后都须要对定时器的标志位进行清零处理。

 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   static uint16_t 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.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   //定数4初始化   (128分频,计数次数)
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 }

中断服务函数:

因为IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,因此此段代码须要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。

经过初始化所配置的参数,加上count 500次的累加,达到1S翻转一次LED的效果,每一次进行中断后都须要对定时器的标志位进行清零处理。

 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的定时器的说明和引用到这里结束,感谢各位看官的点击。

  若是以为有所收获请点下推荐,若认为该博客中存在错误的说明或者对博客中某方面有疑问请留言。

 

 

做 者:浩宇99✌ 出 处:https://www.cnblogs.com/zhenghaoyu/p/10704702.html
版权声明:本文原创发表于 博客园,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然视为侵权。

 

原文出处:https://www.cnblogs.com/zhenghaoyu/p/10704702.html

相关文章
相关标签/搜索