目录
1.定时器有很多类型:
通用定时器:TIM2(32位)、TIM3(16位)、TIM4(16位)、TIM5(32位)——常用于输入捕获、输出比较、PWM 生成等。
基本定时器:TIM6、TIM7——用于简单的任务,如基本时间基准、DAC 触发等。
高级控制定时器:TIM1、TIM8。——具有高级控制功能,适用于电机控制、PWM(脉宽调制)等复杂应用。
独立看门狗——独立于主时钟运行,通常用于系统恢复功能,防止系统死锁。
窗口看门狗——在特定时间窗口内喂狗,提供更高系统安全性。如果在窗口外喂狗,系统会复位。
实时时钟——RTC模块适用于需要长期时间跟踪的应用,如日历和时钟应用。
系统定时器——Cortex-M3 内核自带,用于产生系统时基,通常用于操作系统的节拍定时器。
——使用的芯片:STM32F103ZET6型号。
———————————————————————————————————————————
2.STM32Cubemax配置
——STM32F103系列配置时钟管脚
——需要注意的是,下载代码需要配置管脚,如果没有配置,需要手动改变BOOT0管脚的电平,才能下载代码。
——配置时钟树,配置最高时钟树主频72MHZ。——后面计算定时器的时钟可以用到。
——配置定时器,这里以通用定时器3为例子。
——打开中断
——命名项目——
——最后生成工程
3.代码部分
——HAL库部分
//main.c文件里面,主函数while之前的初始化加入语句
__HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE); //清空寄存器
//tim.c文件里面
uint32_t timer_ctr=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)//确定是定时器三中断,1秒
{
clear_time();
}
}
void clear_time(void)//传输完成之后,
{
timer_ctr++;//定时器定时一秒
if(timer_ctr%10==9)//定时器定时10秒,之后如果超过10秒,停止加热
{
// relay_on(MINI_XB);
// relay_on(OFF_REI);//大约9秒的样子做什么事情,功能部分;
timer_ctr=0;
}
}
标准库函数——定时器3定时代码部分。
——主函数需要增加的功能——定时器的配置
4.定时器计算时间的具体步骤和原理
——第一,我们应该知道时钟挂载的总线是哪一根,这个具体可以在芯片的参考手册上找
例如:——看挂载的总线时钟是多少频率的——TIM3挂载时钟总线是在APB1上。
——第二,看分到总线上的时钟是多少频率的时钟
标准库一般看代码。——例如——
系统时钟——72MHZ。
总线分频是2分频,因此AP1总线时钟是36MHZ。
——第三,要确定时钟的频率是多少,这个需要查看时钟的分频系数。因此时钟频率等于36MHZ/360=0.1MHZ。
——第四,时钟定时时间怎么计算
1.计算定时器的时钟频率,以上述的例子为例;
定时器的时钟频率是=(36*10^6)/(360-1+1)=100000HZ。
2.计算定时器的每个计数周期的时间
Ttimer=1/定时器的时钟频率=1/100000=0.00001秒。
3.计算定时器的溢出时间
Tover=Ttimer*(重载值+1)=0.00001秒*(99+1)=0.001秒=1ms。
——第五,定时器每1ms会产生一次中断。
计算过程知道了,现在我们来看代码HAL配置部分的时钟如何查看系统和总线时钟频率。
——系统时钟的计算
——总线时钟分频——APB1总线分频是2分频。——因此总线时钟是36MHZ。——但是APB1的定时器时钟是72MHZ,时钟树到定时器的时钟有固定2倍频。
——题外知识——
一般参考手册的总线架构上会出现外设挂载在哪个时钟总线上面。
——参考手册上可以看到时钟树的描述。若APB1总线时钟最大频率是36MHZ。时钟总线APB1的定时器是72MHZ。