STM32F429IGT6 SYSTick为180MHZ时,用HAL库写延时1MS及1US代码
时间: 2024-10-13 19:03:02 浏览: 35
STM32F429IGT6 USB_host源代码,可实现对U盘的读写操作
在STM32F429IGT6微控制器上,如果你使用HAL库来实现定时器功能,尤其是SysTick定时器来实现1ms和1us级别的延时,你可以按照以下步骤进行:
首先,你需要包含必要的头文件并初始化系统定时器(SYSTICK):
```c
#include "stm32f4xx_hal.h"
#include "tim.h"
__TIM_HandleTypeDef htim SysTickHandle;
void SystemClock_Config(void);
```
然后,在`SystemClock_Config`函数里配置SYSTICK作为高精度定时器:
```c
void SystemClock_Config(void) {
// ... 其他时钟配置 ...
htim.Instance = TIM4; // 使用TIM4作为SysTick
htim.Init.Prescaler = ((CPUFreq / 1000000) - 1); // 根据实际频率调整分频系数(180MHz -> 分频至1M)
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = (1U << 16) - 1; // 16位计数,最大值减1,即得到大约1ms
HAL_TIM_Base_Init(&htim);
// 配置周期更新事件
HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM4_IRQn);
// 确保SysTick中断使能
__HAL_RCC_SYSTICK_CLK_ENABLE();
}
```
接下来,你可以创建两个函数来分别实现1ms和1us的延时,这里假设`延时_ms`和`延时_us`会调用SysTick中断服务程序来计算时间:
```c
void延时_ms(uint32_t ms) {
TIM4->CNT = 0; // 清零计数器
HAL_TIM_Base_Start_IT(&htim); // 开始定时
while (__HAL_TIM_GET Flag == HAL_TIM_FLAG_UPDATE) {} // 等待计数到1ms
HAL_TIM_Base_Stop_IT(&htim); // 停止定时
}
void延时_us(uint32_t us) {
uint32_t tick_count = htim.Instance->CNT + 1; // 计算剩余时间,假设已有一计时周期完成
if (tick_count > (1U << 16)) { // 超过1ms,需要重新计时
htim.Instance->CNT = 0;
HAL_TIM_Base_Start_IT(&htim);
while ((__HAL_TIM_GET Flag != HAL_TIM_FLAG_UPDATE) && (tick_count > (1U << 16))) {} // 等待直到1ms完成
tick_count = htim.Instance->CNT + 1;
HAL_TIM_Base_Stop_IT(&htim);
}
while (tick_count--) {} // 现在延时剩余时间
}
```
阅读全文