目录
定时器作用、重要性
精确的时间控制
定时器可以提供精确的时间基准,用于实现各种时间相关的功能,如定时执行任务、延时控制等。单片机系统通常需要在特定的时间点执行某些操作,例如定时采集传感器数据、发送数据、控制执行器等,定时器可以帮助实现这些功能。
事件计数
定时器可以用于计算事件的发生次数或持续时间。通过定时器可以统计外部事件的频率、测量脉冲的宽度、计算两个事件之间的时间间隔等。这对于许多应用场景如计时、频率测量、脉冲宽度调制(PWM)等至关重要。
中断触发
定时器通常可以配置为在特定时间点触发中断,从而实现及时响应某些事件或执行任务。中断可以使单片机在处理多任务时能够更加灵活,提高系统的实时性和响应能力。
功耗优化
定时器可以帮助实现功耗优化策略,例如周期性地使单片机从低功耗模式唤醒以执行任务,然后再进入低功耗模式等待下一次触发。这在对电池供电的嵌入式系统中尤为重要,可以延长系统的电池寿命。
HT32(BFTM0,BFTM1)
在单片机开发中基本都有用到定时,在HT32中有5中定时器实现方式,定时要用到计时控制单片机或者做时钟功能的一般是用基本定时器。现在对它进行分析编程理解。下面是它在芯片上一些关联配置。
AHB总线
下面是配置部分
Timer.c
#include "Timer.h"
// SystemCoreClock/1000 == 1ms , SystemCoreClock 1Hz= 1s
//100ms触发一次
void BFTM0_Configuration(void)
{
CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
CKCUClock.Bit.BFTM0 = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
// 设置定时器计数器初值和比较值
BFTM_SetCounter(HT_BFTM0, 0);
BFTM_SetCompare(HT_BFTM0, SystemCoreClock/10); //100ms产生中断
// 清除中断标志位
BFTM_ClearFlag(HT_BFTM0);
// 开启定时器中断
BFTM_IntConfig(HT_BFTM0, ENABLE);
// 使能中断向量
NVIC_EnableIRQ(BFTM0_IRQn);
// 启动定时器
BFTM_EnaCmd(HT_BFTM0, ENABLE);
}
BFTM1也是类似配置即可
Timer.h
#ifndef __TIMER_H__
#define __TIMER_H__
#include "ht32.h"
void BFTM0_Configuration(void);
#endif
main.c
#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "USART.h"
#include "IIC.h"
#include "SHT30.h"
//#include "modbus485.h"
#include "motor.h"
#include "DC_Motor.h"
//#include "Timer.h"
#include "Lock.h"
volatile u32 milliseconds = 0;
volatile u32 seconds = 0;
int main()
{
USART0_Configuration();
BFTM0_Configuration();
while(1)
{
}
}
// 定时器中断处理函数
void BFTM0_IRQHandler(void) {
// 每次定时器中断,毫秒数加1
milliseconds++;
// 每秒更新一次秒数
if (milliseconds >= 10) {
milliseconds = 0;
seconds++;
printf("%3d\n", seconds);
}
// 处理完成后清除中断标志位
BFTM_ClearFlag(HT_BFTM0);
}
视频演示
BFTM