搜索
查看: 2333|回复: 6

[原创] 【STM8-SO8】04-定时器TIM4的使用

[复制链接]

该用户从未签到

26

主题

2070

帖子

6

蝴蝶豆

论坛元老

最后登录
2021-3-31
发表于 2019-1-30 20:45:42 | 显示全部楼层 |阅读模式
本帖最后由 slotg 于 2019-1-30 20:47 编辑

STM8S001 内部有 3 个定时器 TIM1、TIM2、TIM4,其中 TIM4 是一个 8 位的定时器,架构与功能算是比较简单的一个,很适合做为时基的使用,基本用法如下:

main 回圈:
  1. void main(void)
  2. {
  3.   /* Clock configuration -----------------------------------------*/
  4.   CLK_Config();  

  5.   /* TIM4 configuration -----------------------------------------*/
  6.   TIM4_Config();   
  7.   
  8.   while (1)
  9.   {
  10.   }
  11. }
复制代码

将系统时钟主频设定在 16Mhz:
  1. static void CLK_Config(void)
  2. {
  3.   /* Initialization of the clock */
  4.   /* Clock divider to HSI/1 */
  5.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  6. }
复制代码

将 TIM4 中断设定在 1ms 中断一次:
  1. #define TIM4_PERIOD       124
复制代码
  1. static void TIM4_Config(void)
  2. {
  3.   /* Time base configuration */
  4.   TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
  5.   /* Clear TIM4 update flag */
  6.   TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  7.   /* Enable update interrupt */
  8.   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  9.   
  10.   /* enable interrupts */
  11.   enableInterrupts();

  12.   /* Enable TIM4 */
  13.   TIM4_Cmd(ENABLE);
  14. }
复制代码

16Mhz / 128 = 125Khz
125Khz / 125 = 1Khz --> 1ms

TIM4 中断程序在 stm8s_it.c 这里:
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
  2. {

  3.   /* Clear Interrupt Pending bit */
  4.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  5. }
复制代码

前面的 LAB 有使用到按键输入的功能,对于按键输入的判断我习惯上都会搭配时基计数器的方式,在这一个程序当中我用这种方式再来实现一个按按键让 LED 翻转显示的功能。

P01.JPG

uint8_t key_cnt;

宣告一个全局变量 key_cnt 做为按键 KEY 的状态计数,按键放开时 key_cnt 清除为 0,按键按下时每一个时基 key_cnt 就会加一,在主回圈判断 key_cnt 等于 20 时为按键初按下状态。LED1 固定以 0.5s 的周期闪烁,而按下按键 KEY 之后 LED2 翻转显示。

main 回圈:
  1. void main(void)
  2. {
  3.   /* Clock configuration -----------------------------------------*/
  4.   CLK_Config();  

  5.   /* TIM4 configuration -----------------------------------------*/
  6.   TIM4_Config();

  7.   GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  8.   GPIO_Init(LED2_GPIO_PORT, LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  9.   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);
  10.   
  11.   while (1)
  12.   {
  13.     if(key_cnt == 20)
  14.     {
  15.       key_cnt++;
  16.       GPIO_WriteReverse(LED2_GPIO_PORT, LED2_GPIO_PINS);
  17.     }
  18.   }
  19. }
复制代码

TIM4 中断程序:
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
  2. {
  3.   static uint16_t x = 0;
  4.    
  5.   if(++x == 500)      // 0.5s
  6.   {
  7.     x = 0;
  8.     GPIO_WriteReverse(LED1_GPIO_PORT, LED1_GPIO_PINS);        // LED1 flash
  9.   }
  10.    
  11.   if(GPIO_ReadInputPin(KEY_GPIO_PORT, KEY_GPIO_PINS))
  12.   {
  13.     key_cnt = 0;
  14.   }
  15.   else
  16.   {
  17.     if(key_cnt != 0xff)
  18.       key_cnt++;
  19.   }

  20.   /* Clear Interrupt Pending bit */
  21.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  22. }
复制代码

运行结果:
20190130205830.gif

源代码:
B06.rar (966.02 KB, 下载次数: 9)
回复

使用道具 举报

该用户从未签到

8

主题

328

帖子

54

蝴蝶豆

金牌会员

最后登录
2021-4-14
发表于 2019-1-31 08:59:19 | 显示全部楼层
交通灯
回复

使用道具 举报

该用户从未签到

0

主题

66

帖子

0

蝴蝶豆

高级会员

最后登录
2021-3-30
发表于 2019-1-31 10:53:32 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

4

主题

456

帖子

2

蝴蝶豆

金牌会员

最后登录
2020-7-8
发表于 2019-2-1 09:30:06 | 显示全部楼层
学习了
回复

使用道具 举报

该用户从未签到

26

主题

2070

帖子

6

蝴蝶豆

论坛元老

最后登录
2021-3-31
 楼主| 发表于 2019-2-1 10:23:37 | 显示全部楼层

感谢关注
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

7

帖子

0

蝴蝶豆

新手上路

最后登录
2020-8-4
发表于 2019-7-17 14:10:18 | 显示全部楼层
学习了。。。
回复

使用道具 举报

该用户从未签到

0

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2019-9-13
发表于 2019-8-22 14:27:13 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-20 22:31 , Processed in 1.196232 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表