STM8S_库函数_TIM4定时器用法_自动重载计数

大家好,我是单片机爱好者-MCU起航。这一节我们介绍如何使用库函数方式控制STM8S103F3P6片上的定时器4,也就是TIM4。

前面几节分别说了TIM1和TIM2的用法,这两个都是功能强大的定时器/计数器。包括基本的定时、捕获、输入PWM测量、输出PWM等等,而TIM4的功能相比前两个,就没有那么强大了,只有一个基本的定时器、计数器的功能。但不管怎样,能满足我们的使用就好。

我们看一下数据手册中,TIM4的功能。这里我直接截图:

如图所示,虽然只有定时、计数的功能,但是自动重载、分频、中断这些,该有的都有,也算是麻雀虽小,五脏俱全!

接下来,咱们依然通过代码实现功能来演示,功能实现: 1秒的一个定时,时间到了以后,板上的LED闪烁。LED依然使用地心一号上的LED,如图:

用到的功能: 分频,向上计数, 自动重装载。

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "timer4_config.h"
/* Private variables ---------------------------------------------------------*/
__IO uint32_t TimingDelay = 0;
/* Private function prototypes -----------------------------------------------*/
void Delay(__IO uint32_t nTime);
void TimingDelay_Decrement(void);
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void main(void)
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_SLOW);
  timer4_init();
  while (1)
  {
    GPIO_WriteReverse(GPIOB, GPIO_PIN_4);
    Delay(1000);
  }
  
}
    
/**
  * @brief  Inserts a delay time.
  * @param  nTime: specifies the delay time length, in milliseconds.
  * @retval None
  */
void Delay(__IO uint32_t nTime)
{
  TimingDelay = nTime;

  while (TimingDelay != 0);
}

/**
  * @brief  Decrements the TimingDelay variable.
  * @param  None
  * @retval None
  */
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

如上所示,主函数里面实现了五个操作:

1、系统时钟1分频,也就是16MZH。

2、PB4初始化为推挽输出,高电平,低速。

3、TIM4初始化,具体看后面的代码。

4、while(1)中对PB4进行翻转。

5、while(1)中延时1秒。

这样一看,貌似没有TIM4什么事。但其实这次的延时函数是和TIM4定时计数相关的,咱们往下看。接着看TIM4的初始化。

#include "timer4_config.h"
/* Private define ------------------------------------------------------------*/
#define TIM4_PERIOD       124
/***************************************
*               TIMER1初始化
*           检测外部频率和脉冲
***************************************/
void timer4_init(void)
{
//  disableInterrupts();
  /* TIM4 configuration:
   - TIM4CLK is set to 16 MHz, the TIM4 Prescaler is equal to 128 so the TIM4 counter
   clock used is 16 MHz / 128 = 125 000 Hz
  - With 125 000 Hz we can generate time base:
      max time base is 2.048 ms if TIM4_PERIOD = 255 --> (255 + 1) / 125000 = 2.048 ms
      min time base is 0.016 ms if TIM4_PERIOD = 1   --> (  1 + 1) / 125000 = 0.016 ms
  - In this example we need to generate a time base equal to 1 ms
   so TIM4_PERIOD = (0.001 * 125000 - 1) = 124 */

  /* Time base configuration */
  TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
  /* Clear TIM4 update flag */
  TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  /* Enable update interrupt */
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  
  /* enable interrupts */
  enableInterrupts();

  /* Enable TIM4 */
  TIM4_Cmd(ENABLE);
  
//  enableInterrupts();
}

注释已经写的比较清楚了。16MHZ时钟进行128分配,得到TIM4的时钟125000,然后周期设置为125(124+1),所以中断一次就是125/125000=0.001秒,也就是1毫秒。

接着看中断函数:

 INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
 {
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  TimingDelay_Decrement();
  /* Cleat Interrupt Pending bit */
  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
 }

每次进TIM4中断,执行一次函数TimingDelay_Decrement(),这个函数与上面的“Delay(__IO uint32_t nTime)”和“void TimingDelay_Decrement(void)”相结合,从而实现一个延时的效果。

最后,编译、下载、上电,LED每1秒变化一次,功能正常!

打完收工!

要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据