STM32F407用HAL库的定时器10生成一个20HZ的定时器
时间: 2023-05-23 11:04:53 浏览: 281
STM32F407单片机(HAL库版本)软件例程源码- 定时器中断实验.rar
5星 · 资源好评率100%
A:
首先,我们需要了解一下HAL库中定时器的相关函数和配置。
定时器配置步骤:
1. 选择定时器
2. 配置定时器时间基数 Prescaler 和计数器ARR
3. 选择更新事件中断开启和定时器计数器自动重载开启
4. 启动定时器
接下来,具体步骤如下:
Step 1: 选择定时器10
首先我们需要选择使用的定时器,这里我们选用的是TIM10。
```
htim10.Instance = TIM10;
```
Step 2: 配置定时器时间基数 Prescaler 和计数器ARR
根据题目要求,我们需要让TIM10的溢出时间为50ms,也就是20Hz的频率,根据定时器计数器的计算公式,我们可以得出:
$$
T_{timer}=T_{ck\_psc} \times (arr+1)
$$
其中,$T_{timer}$ 为定时器的时间,$T_{ck\_psc}$ 表示定时器时钟的周期时间,$arr$ 表示定时器计数器的自动重装载寄存器的值。
因为 STM32F407 的时钟频率为 168MHz,所以我们可以配置 Prescaler 为:
```
htim10.Init.Prescaler = 8399;
```
这样,就可以将 TIM10 的时钟预分频为 20kHz。
然后,我们就需要计算 ARR 的值了,我们可以使用以下公式:
$$
arr=\frac{T_{timer}}{T_{ck\_p \_psc}}-1
$$
将所得结果赋值给 TIM10 的自动重装载寄存器中:
```
htim10.Init.Period = 999;
```
这里 999 就是 arr 的值。
Step 3: 选择更新事件中断开启和定时器计数器自动重载开启
我们需要开启定时器的更新事件中断开启和计数器自动重载,通过如下代码实现:
```
TIM_HandleTypeDef htim10;
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.RepetitionCounter = 0;
htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim10.Init.Period = 999;
htim10.Init.Prescaler = 8399;
htim10.Instance = TIM10;
if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
TIM_MasterConfigTypeDef sMasterConfig = {0};
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim10, &sMasterConfig) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}
__HAL_TIM_ENABLE_IT(&htim10, TIM_IT_UPDATE);
__HAL_TIM_ENABLE(&htim10);
```
Step 4: 启动定时器
通过如下代码启动 TIM10 定时器即可:
```
__HAL_TIM_ENABLE(&htim10);
```
此时,TIM10 就被启动了,可以开始产生一个频率为 20Hz 的定时器。
阅读全文