大家好,我是单片机爱好者-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、数据手册等所有相关资料。