你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM8-SO8】04-定时器TIM4的使用

[复制链接]
slotg 发布时间:2019-1-30 20:45
本帖最后由 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, 下载次数: 11)
收藏 评论6 发布时间:2019-1-30 20:45

举报

6个回答
mzy2364 回答时间:2019-1-31 08:59:19
交通灯
lwg8458 回答时间:2019-1-31 10:53:32
xujiantj 回答时间:2019-2-1 09:30:06
学习了
slotg 回答时间:2019-2-1 10:23:37

感谢关注
wangdexin 回答时间:2019-7-17 14:10:18
学习了。。。
linjue 回答时间:2019-8-22 14:27:13
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版