STM8S定时器操作
2022-05-09 来源:eefocus
综述
STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。
本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。
关于STM8S103手册的TIM简介
每个定时器的功能都有详细介绍,大家可以认真看下。
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次的判断。(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.1 编译环境
我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为在用STM32的时候就是利用Keil5编译代码,的确很方便。
4.2 主芯片
我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、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 }
结尾
本博客只介绍了如何控制LED翻转,但定时器的功能远不止于此,详情请大家自行去了解。
相对来说,STM8的定时器功能还是比较有用的,希望该博客能够帮助到大家实现TIM功能。
对STM8的定时器的说明和引用到这里结束,感谢各位看官的点击。
上一篇:同一个STM8工程换目录位置后生成的HEX校验和不一致的问题
下一篇:IAR FOR STM8S 错误 An error occurred while retrieving GDI features: gdi-error [40201]解决方法
- STM8S 使用IAR在线调试配置
- IAR FOR STM8S 错误 An error occurred while retrieving GDI features: gdi-error [40201]解决方法
- IAR调试STM8S遇到函数返回值错误的问题
- STM8S 定时器第一次使用时间不准确的问题
- 解决stm8s配置timer2中断时间不准
- STM8S被设定读保护的芯片如何解除读保护,重新下载程序
- STM8S单片机红外接收解码程序 带1602显示
- stm8 stm8s stm8af 485接口 modbus协议代码
- STM8S学习笔记之三(STM8 SysClk)
- 轻松操作STM32F10X系列单片机的定时器