已知STM32的系统时钟为72MHZ,如何设置系统定时器寄存器,实现20ms定时
时间: 2024-09-09 22:04:52 浏览: 17
在STM32单片机中,若想使用系统定时器实现20毫秒定时,通常我们使用SysTick定时器,因为它的精度相对较高且不受预分频器影响。以下是步骤:
1. 首先,需要配置SysTick寄存器:
- 将SysTick中断使能:`RCC_APB1PeriphClockCmd(RCC_APB1Periph_SYSTICK, ENABLE);`
- 确定时钟源:由于72MHz作为系统时钟,大部分STM32系列MCU默认SysTick从APB1总线获取时钟,无需额外配置。
2. 设置SysTick周期长度(Prescaler):
- 对于72MHz系统时钟,想要得到20ms定时,首先计算SysTick频率(72MHz / (SysTickPrescaler+1)),然后选择合适的预分频值使得20ms时间落在 SysTick 中断触发范围内。
- 如果 SysTick 最大计数值是 65536(即 2^16),那么20ms相当于大约4096个时钟周期,可以取一个接近这个数的整数作为预分频值。比如,假设选择预分频系数为8,那么SysTick频率将是72M / (8+1) = 8MHz。
3. 设置SysTick溢出值:
- 在 `EXTI_InitStructure` 结构体中设置溢出寄存器(`SysTick_LOAD_RELOAD`),根据选择的周期长度计算:
```c
uint16_t load_value = ((SystemCoreClock / 8) * 4096);
SysTick->LOAD = load_value; // 4096对应20ms
```
4. 开启SysTick功能并清零:
- `SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;`
- 清零计数器:`SysTick->VAL = 0;`
5. 设置SysTick中断处理函数,并开启中断:
- 编写一个中断服务程序(例如 `void SysTick_Handler(void)`),并在适当的地方启用 SysTick 中断:
```c
NVIC_SetPriority(SysTick_IRQn, 0x0F); // 设置较高的优先级
NVIC_EnableIRQ(SysTick_IRQn);
```
现在,每当 SysTick 计数达到设定的溢出值,就会引发一个中断,此时你需要在中断服务程序中更新你的定时任务,或者通过其他方式回调你的20ms定时事件。