已知STM32的系统时钟为72MHz,如何设置相关寄存器,实现20ms定时
时间: 2024-03-10 17:48:03 浏览: 260
为实现20ms定时,需要使用STM32的定时器模块,具体实现步骤如下:
1. 选择一个可用的定时器模块,例如TIM2。
2. 根据72MHz系统时钟和20ms定时的要求,计算出自动重装载寄存器(ARR)和预分频器寄存器(PSC)的值:
- ARR = 72MHz / (预分频器 x 定时周期) - 1
- PSC = 预分频器 - 1
例如,预分频器为3600时,定时周期为20ms,计算得到ARR=3999,PSC=3599。
3. 将PSC和ARR的值分别写入TIM2的预分频器寄存器(TIM2_PSC)和自动重装载寄存器(TIM2_ARR)中。
4. 配置TIM2的工作模式为向上计数模式,并使能自动重载功能。
5. 配置TIM2的中断,使能更新中断(UIE)。
6. 在中断服务程序中处理定时器更新事件,即可实现20ms定时。
下面是对应的C语言代码实现:
```
#include "stm32f10x.h"
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
// 在这里执行定时任务
// ...
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 3999; // ARR
TIM_TimeBaseStructure.TIM_Prescaler = 3599; // PSC
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
int main(void)
{
TIM2_Configuration();
while (1)
{
// 主循环
// ...
}
}
```
阅读全文