好的,WWDG 👨🏫,我们按照你给出的结构,用 STM32CubeMX + Keil + HAL库 来实现:
✅ 1:用 500ms 翻转 LED 灯为例 —— STM32CubeMX + Keil + HAL
目标: 使用 TIM6 定时器,每 500ms 产生一次中断,在中断中翻转 LED(PC13)。
🧮 步骤一:定时器参数计算
-
系统主频(SYSCLK):72 MHz
-
目标中断周期:500ms(0.5秒)
设:
-
预分频器(Prescaler)设为
7199
→ 得到 10kHz 的定时器时钟 -
自动重装载(ARR)设为
4999
→ 每 5000 次 10kHz = 0.5 秒
计算公式:
T=(PSC+1)×(ARR+1)FCLK=7200×500072×106=0.5sT = \frac{(PSC + 1) \times (ARR + 1)}{F_{\text{CLK}}} = \frac{7200 \times 5000}{72 \times 10^6} = 0.5s
🧰 步骤二:STM32CubeMX 设置
打开 STM32CubeMX 工程,完成如下配置:
✅ 基础配置
项目 | 设置 |
---|---|
MCU 型号 | STM32F103ZETx |
RCC | HSE 使能,SYSCLK 72MHz |
SYS | Debug 设置为 Serial Wire |
✅ 引脚配置
引脚 | 设置 |
---|---|
PC13 | GPIO_Output,用于控制 LED |
✅ TIM6 设置
-
在“Timers”中选择 TIM6
-
设置为 Internal Clock
-
配置参数:
参数 | 值 |
---|---|
Prescaler | 7199 |
Auto-Reload | 4999 |
Counter Mode | Up |
AutoReloadPreload | Disable |
Interrupt | 启用 Update event 中断 ✔️ |
✅ NVIC 中断设置
-
在 “Configuration → NVIC” 中使能 TIM6 global interrupt
完成后点击 Project → Generate Code
并用 Keil uVision 打开工程 🔧
🧱 步骤三:TIM6 初始化代码(自动生成)
在 tim.c
中自动生成:
void MX_TIM6_Init(void)
{
htim6.Instance = TIM6;
htim6.Init.Prescaler = 7199;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 4999;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&htim6);
}
⚙️ 步骤四:中断配置(自动生成)
在 stm32f1xx_it.c
中:
void TIM6_DAC_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim6);
}
在 tim.c
中的 MSP 初始化:
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM6)
{
__HAL_RCC_TIM6_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
}
}
🔁 步骤五:实现中断服务函数和回调
✅ IRQ Handler(自动调用)
位置:
stm32f1xx_it.c
void TIM6_DAC_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim6); // 自动调用回调函数
}
✅ 回调函数(需要自己实现)
位置:
main.c
或新建user.c 其实这个放在tim.c最下面就可以了-看个人目录结构喜好吧,因为常使用STM32CUBE所以,基本对于STM32CUBE生成的目录结构 不会过于修改。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 翻转LED
}
}
✅ 启动定时器(在 main.c
中)
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM6_Init();
HAL_TIM_Base_Start_IT(&htim6); // 启动定时器中断
while (1)
{
// 主循环无需操作,中断中翻转LED
}
}
💡 最终效果
-
每 0.5 秒触发一次 TIM6 中断
-
中断中翻转 PC13 引脚 → LED 闪烁频率 1Hz