Activated:激活TIM6,把前面的方框选中局表示激活了TIM6
One Pulse Mode:STM32F103定时器的One Pulse Mode是一种特殊的计数模式,它只产生一个脉冲输出信号,而不是周期性的信号输出。在这种模式下,计数器只进行一次计数,当计数器计数到预设的值时,就会产生一个脉冲信号,然后计数器会停止计数。这种模式通常用于需要生成单个脉冲信号的应用场景,例如PWM控制、测量脉冲宽度等。在STM32F103系列中,定时器的One Pulse Mode可以通过设置TIM_CR1寄存器中的OPM位来实现。
Counter Setting:计数设置
Prescaler(PSC -16 bits value):预分频器,简写PSC,16位,可设置的值范围是0--65535。在STM32F103中,计数器的时钟源可以是内部时钟源或外部时钟源。当使用内部时钟源时,PSC可以将时钟信号频率除以一个固定的分频系数,以降低计数器的时钟频率,从而扩大计数器的计时范围。当使用外部时钟源时,PSC还可以将外部时钟信号的频率与内部时钟源的频率进行比较,以实现更高的精度。
//例如,如果使用内部时钟源,并将PSC设置为7199,
//则定时器的时钟频率将为72 MHz / (7199 + 1) = 10 kHz。
//这意味着计数器每计数10次,就会过去1毫秒。
//如果需要更长的计时范围,可以将PSC设置为更大的值。
Counter Mode:计数模式,基本定时器TIM6只能向上计数(UP)。
Counter Period(Auto Reload Register - 16 bit value):计数周期,STM32F103定时器的Auto Reload寄存器(ARR)用于设置定时器的计数周期。当定时器的计数器达到ARR的值时,定时器会自动重新加载ARR的值并继续计数。这样可以实现定时器的周期性计数,从而实现定时和计时的功能。
//以TIM6为例,如果ARR的值为9999,则定时器的计数周期为:
//计数周期 = ARR + 1 = 10000
//当定时器的计数器计数到9999时,定时器会自动重新加载ARR的值为999,并继续计数。
//这样就可以实现定时器的周期性计数,从而实现定时的功能。
//需要注意的是,ARR的值不能超过定时器的计数器的最大值(例如对于16位定时器,最大值为65535),
//否则会发生溢出。
//在实际应用中,需要根据具体的需求和系统时钟频率来选择合适的ARR的值,以实现所需的定时功能。
Auto-Reload Preload:自动重载预装载。STM32F103定时器的Auto Reload Preload(自动重载预装载)功能是用来控制定时器计数器的自动重装载和预装载的。它的作用是实现定时器计数器的精确控制和定时器溢出中断的触发。
Auto Reload Preload功能可以通过TIMx_CR1寄存器的ARPE位来开启或关闭。当该功能开启时,定时器会在计数器计满或达到比较值时自动装载计数器的初始值,从而实现计数器的自动重装载。同时,它还会预装载ARR寄存器的值,以确保在计数器重新装载之前,ARR的值已经被正确加载。
Auto Reload Preload功能的主要作用有两个:
精确控制定时器的计数范围:通过自动重装载功能,定时器可以在达到计数范围的上限时自动重新开始计数,从而实现更长的计时范围和更高的精度。
触发定时器溢出中断:当定时器计数器达到比较值或自动重装载时,定时器会触发溢出中断。通过预装载ARR寄存器的值,可以确保在溢出中断触发之前,ARR的值已经被正确加载,从而保证定时器溢出中断的精确性。
总之,STM32F103定时器的Auto Reload Preload功能可以实现定时器计数器的自动重载和预装载,从而实现更长的计时范围和更高的精度,并保证定时器溢出中断的精确性。
Trigger Output(TRGO)Parameter:
STM32F103定时器的Trigger Output功能可以用于同步多个定时器、DAC、ADC等外设的启动和停止。当一个定时器的计数器计数到预设值时,就会产生一个触发输出,可以将该输出信号连接到其他定时器或外设的启动输入端,以实现多个定时器或外设同步工作。
另外,Trigger Output还可以用于生成PWM信号。将定时器的输出比较模式设置为PWM模式,再将Trigger Output连接到PWM输出通道的更新触发输入端,就可以实现PWM信号的输出。这种方式可以在不占用CPU资源的情况下,生成高精度的PWM信号,广泛应用于电机控制、LED控制等领域。
Trigger event selection:触发事件选择
上图的三个备选项分别对应下面的配置
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
它指定了当定时器计数器达到自动重装载值时,输出触发信号将被置为低电平。
sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
它指定了当计数器达到定时器的重载值时,输出触发信号将被触发。这种配置可以用于实现定时中断、嵌套定时器、时间戳等应用。
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
它指定了当定时器计数器更新时,输出触发信号将被触发。这种配置可以用于控制PWM输出、测量脉冲宽度、生成周期性触发信号等应用。
STM32F103单片机的基本定时器是一个16位定时器,它可以产生定时中断,并且可以通过软件或硬件触发。其工作原理如下:
在定时器初始化时,需要设置定时器的时钟源和计数模式。时钟源可以选择内部时钟或外部时钟,计数模式只能向上计数。
定时器开始工作后,计数器会不断累加,直到计数器的值与预设的计数值相等。
当计数器的值与预设的计数值相等时,定时器会产生一个中断请求,并且将计数器的值清零,重新开始计数。
在中断服务程序中,可以进行需要定时的操作,例如控制外设的开关、采集数据等等。
STM32F103单片机基本定时器(TIM)是一种基于计数器的定时器,其工作原理是通过计数器对定时时间进行计数,当计数器计数到设定值时,产生中断或触发其他事件。
基本定时器有以下相关寄存器:
TIMx_CR1寄存器:定时器控制寄存器1,用于配置定时器工作模式、计数模式、时钟分频等。
TIMx_PSC寄存器:预分频器寄存器,用于设置定时器时钟的预分频值,即将主时钟分频后作为定时器时钟。
TIMx_ARR寄存器:自动重载寄存器,用于设置计数器的上限值,当计数器计数到该值时,自动将计数器清零并产生中断或触发其他事件。
TIMx_CNT寄存器:计数器寄存器,用于存储当前的计数值。
TIMx_SR寄存器:状态寄存器,用于标记定时器事件的状态,如计数器溢出、比较匹配等。
通过对这些寄存器的配置和操作,可以实现基本定时器的各种功能。
1、设置定时器的自动重载值;
2、设置定时器的计数值为0,从0 开始计数
3、开启定时器开始计数
4、读定时器的计数值,并判断计数值是否达到目标值;
5、到达目标值就关闭定时器
void Delay_us(uint16_t t)
{
uint16_t counter = 0;
__HAL_TIM_SET_AUTORELOAD(&htim6, t); //设置自动重载值
__HAL_TIM_SET_COUNTER(&htim6,0);//设置计数器的值为0,从0开始计数
__HAL_TIM_ENABLE(&htim6); //使能TIM6
while(counter != t)
{
counter = __HAL_TIM_GET_COUNTER(&htim6);//一直读计数器的值,直到计数器的值到达自动重载值
}
__HAL_TIM_DISABLE(&htim6);//关闭TIM6
}
void Delay_ms(uint16_t t)
{
uint16_t i;
for(i=0;i<1000;i++)
{
Delay_us(t);
}
}
定时器的参数设置
TIM_HandleTypeDef htim6;
void MX_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6;
htim6.Init.Prescaler = 72-1; //72MHz的时钟经过72分频之后就是1MHz,走一步就是1us
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
//htim6.Init.Period = 1000-1; //这个周期值就不用设置了,因为在延时函数里面设置了
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
这就用到定时器的溢出中断了,定时时间到了,在定时器中断回调函数中做某件事;
1、定时器的配置
void MX_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6;
htim6.Init.Prescaler = 72-1;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 1000-1;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6)
{
__HAL_RCC_TIM6_CLK_ENABLE();
/* 配置定时器中断*/
HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM6_IRQn);
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6)
{
__HAL_RCC_TIM6_CLK_DISABLE();
HAL_NVIC_DisableIRQ(TIM6_IRQn);
}
}
2、开启定时器中断
在main函数中调用开始定时器中断函数
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM6_Init();
HAL_TIM_Base_Start_IT(&htim6); //开启定时器中断
while (1)
{
}
}
3、回调函数中进行中断处理
void TIM6_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim6);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
cnt++;
//因为定时器设置的分频系数是72,计数周期是1000,所以每次1ms就中断,1000次就是1s钟
if(cnt == 1000)
{
cnt = 0;
HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin);
}
}
可以参考下面的博文,定时器触发ADC模数转换
STM32学习----ADC模数转换(轮询、中断、定时器、DMA)_资深流水灯工程师的博客-CSDN博客