1.cubemx设置
参考文章
时钟设置
高速时钟配置
将HCLK设置为最大频率72MHz
定时器设置
Internal Clock
:(内部时钟)
Prtscaler
: 3600-1
Counter Mode
: Up
Counter Period
: 10000-1
CKD
:No Division (不分频 )
auto-reload-preload
: Enable
NVIC设置
记得把中断给勾上
2.使用函数
电平翻转
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
定时器溢出中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
时基中断开启函数
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
这个函数用于以下目的:
- 初始化定时器并开始计时。
- 当定时器的计数值达到设定的自动重装载寄存器(ARR)的值时,触发中断。
- 在对应的中断处理函数(比如 HAL_TIM_PeriodElapsedCallback)中执行用户定义的代码
3.定时器基础知识
频率计算
下面是频率计算公式:
f = 主频 ( A R R + 1 ) × ( P S C + 1 ) f = \frac{主频}{(ARR+1) \times (PSC+1)} f=(ARR+1)×(PSC+1)主频
文章把设置主频为72MHz, ARR为10000 -1,PSC为3600 -1,得:
f = 72 , 000 , 000 10000 × 3600 = 2 H z f = \frac{72,000,000}{10000 \times 3600} = 2 Hz f=10000×360072,000,000=2Hz
所以定时周期为0.5s。
计数模式
-
向上计数模式:最常见的模式,计数器从0开始,向上计数到预设的重装载值(ARR),然后重置为0并重新开始计数。这种模式通常用于创建周期性的时间基准。
-
向下计数模式:在这种模式下,计数器从预设的重装载值开始,向下计数到0。这种模式在某些特定的应用中比向上计数提供了更好的控制。
-
中心对齐模式:定时器的计数器在这种模式下会先向上计数到预设的值,然后向下计数回到0。这种模式可以生成对称的波形,常用于电机控制应用中。
本文采用的是向上计数模式。
4.代码
main函数里开启中断
int main(void)
{
/*----------------------- 把语句加到这下面 -----------------------*/
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim6);//开启定时器1
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
定时中断中翻转电平
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance != htim6.Instance)
return;
HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_GPIO_PIN);
HAL_GPIO_TogglePin(LED5_GPIO_Port,LED5_GPIO_PIN);
}
可以在主函数里面,也可以在.c文件里面或者说直接在tim.c
文件里面修改该函数。
4.效果展示
5.附
其他几个常用的定时器相关函数
HAL_TIM_Base_Start_IT(&htim1); //启动定时器
HAL_TIM_Base_Stop_IT(&htim1); //停止定时器
HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource);//通过软件产生更新事件
四种中断
定时器6中断只有1个选项,因此不必过多考虑。但像定时器1,如下图,它有4个选项,我们需要勾选update interrupt
,下面是四种中断类型的区别。
-
TIM1 break interrupt: 这个中断通常与定时器的高级功能有关,例如电机控制。当定时器的一个错误条件发生(如电机驱动中的死区时间错误),将会触发"break interrupt"。
-
TIM1 update interrupt: 当定时器的计数器溢出或下溢时(也就是达到了它的重装载值),会触发"update interrupt"。这通常用于周期性任务,如更新变量或切换LED状态。
-
TIM1 trigger and commutation interrupts: 这些中断用于更复杂的电机控制应用,其中"trigger interrupt"可以同步定时器的操作,而"commutation interrupt"与电机换相有关,特别是在使用无刷直流电机(BLDC)时。
-
TIM1 capture compare interrupt: 这个中断在定时器的捕获比较寄存器(CCRx)与定时器的计数器匹配时触发。这可以用于精确的时间测量,如测量脉冲宽度或产生精确的时间间隔。