HAL库的学习 —— 定时器的使用

  首先配置时钟树,我的配置如下:

接着选择时钟源,在这里选择内部时钟即24MHZ。并配置预分频和计数值:

开启定时器全局中断:

定时时间的计算公式如下:

                                       定时时间 = (pre+1)*(per+1)/tclk;

在这里pre = 2399,per = 999,tclk = 24MHZ。所以定时间为0.1s。


设完定时时间后在代码里加入函数开启中断:

HAL_TIM_Base_Start_IT(&htim2);

在中断回调函数里根据自己的需求去实现想要的功能,中断回调函数如下:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim==(&htim2))
  {  

  }
}

### HAL 定时器使用方法 HAL 中的定时器模块提供了丰富的功能来实现时间管理、PWM 输出以及中断触发等功能。以下是关于如何配置和使用 HAL 定时器的具体说明。 #### 配置基础 在 STM32 的 HAL 中,TIM 器件通常用于生成周期性的事件或捕获外部信号的时间戳。要启用 TIM 中断并执行特定的功能逻辑,需完成以下几个部分的设置: 1. **初始化硬件资源** 在 `MX_TIM6_Init()` 函数中定义计数模式(向上/向下)、预分频系数及时基频率等参数[^1]。 2. **使能全局中断** 调用 `__HAL_RCC_TIM6_CLK_ENABLE();` 启动 TIM6 时钟,并通过 NVIC 设置优先级以允许响应中断请求。 3. **注册回调函数** 用户可以在自定义文件如 `tim.c` 中添加如下形式的回调处理程序: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6) { // 判断是否来自指定定时器实例 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); // 控制 GPIO 引脚状态切换 } } ``` 4. **启动定时器** 使用 `HAL_TIM_Base_Start_IT(&htim6)` 方法开启带中断支持的基础定时操作。 以上步骤展示了基本流程,实际项目可能还需要考虑更多细节比如错误检测机制或者多路复用情况下的冲突规避策略等等。 #### 示例代码展示 下面给出一段完整的示例代码用来演示上述理论的应用场景——利用 TIM6 实现每秒一次LED闪烁效果: ```c // 初始化结构体声明 TIM_HandleTypeDef htim6; void MX_TIM6_Init(void){ __HAL_RCC_TIM6_CLK_ENABLE(); htim6.Instance = TIM6; htim6.Init.Period = 8999; /* 自由运行模式下溢出时间为(ARR+1)*PSC/(TIMxCLK)*/ htim6.Init.Prescaler = 7199; /* 设定预分频值 */ htim6.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_Base_Init(&htim6)!= HAL_OK){ Error_Handler(); } HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0 ,0); HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); } int main(){ ... MX_TIM6_Init(); HAL_TIM_Base_Start_IT(&htim6); while(1){ ; } } ``` 此段代码片段实现了基于 HAL 对 TIM6 进行初始化的过程,并设置了相应的预分频数值与自动重装载寄存器值以便达到大约一秒间隔触发一次中断的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值