You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L432KC的LPTIM1初始化及LSI时钟配置问题求助

STM32L432KC LPTIM1中断初始化与LSI时钟配置方案

1. 正确初始化LPTIM1以触发中断(含PB1 LED测试)

以下是手动寄存器配置的完整步骤与代码,解决CNT寄存器为0、中断不触发的问题:

步骤拆解与代码

#include "stm32l4xx.h"

void init_lptim1(void) {
    // 1. 开启所需时钟:LPTIM1、GPIOB、LSI
    RCC->APB1ENR1 |= RCC_APB1ENR1_LPTIM1EN; // 使能LPTIM1外设时钟
    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN;    // 使能GPIOB时钟
    RCC->CSR |= RCC_CSR_LSION;              // 开启LSI内部低速时钟
    while(!(RCC->CSR & RCC_CSR_LSIRDY));    // 等待LSI稳定就绪

    // 2. 配置PB1为推挽输出(用于中断测试)
    GPIOB->MODER &= ~GPIO_MODER_MODE1_Msk;
    GPIOB->MODER |= GPIO_MODER_MODE1_0;     // 设为通用输出模式
    GPIOB->OTYPER &= ~GPIO_OTYPER_OT1;      // 推挽输出
    GPIOB->OSPEEDR &= ~GPIO_OSPEEDR_OSPEED1_Msk; // 低速输出

    // 3. 设置LPTIM1时钟源为LSI(提前适配第二个需求)
    RCC->CCIPR |= RCC_CCIPR_LPTIM1SEL_0;    // LPTIM1SEL=01 -> 选择LSI时钟

    // 4. 配置LPTIM1计数参数
    LPTIM1->CFGR &= ~LPTIM_CFGR_PRESC_Msk;
    LPTIM1->CFGR |= LPTIM_CFGR_PRESC_2;     // 预分频系数8(LSI=32kHz → 4kHz计数时钟)
    LPTIM1->ARR = 3999;                     // 自动重装载值,每1秒触发一次中断(4kHz×1s=4000周期)

    // 5. 开启更新中断
    LPTIM1->IER |= LPTIM_IER_UIE;

    // 6. 配置NVIC中断优先级并使能
    NVIC_SetPriority(LPTIM1_IRQn, 0);
    NVIC_EnableIRQ(LPTIM1_IRQn);

    // 7. 启动LPTIM1计数器
    LPTIM1->CR |= LPTIM_CR_ENABLE;          // 使能LPTIM1
    LPTIM1->CR |= LPTIM_CR_CNTSTRT;         // 启动连续计数模式
}

// LPTIM1中断服务函数
void LPTIM1_IRQHandler(void) {
    if(LPTIM1->ISR & LPTIM_ISR_UIF) {       // 检查更新中断标志
        LPTIM1->ICR |= LPTIM_ICR_UIC;       // 清除中断标志
        GPIOB->ODR ^= GPIO_ODR_OD1;         // 翻转PB1 LED状态
    }
}

常见问题排查(CNT为0、中断不触发)

  • 未启动计数器:必须执行LPTIM1->CR |= LPTIM_CR_CNTSTRT启动计数
  • 时钟源未配置:LSI未开启或LPTIM1未选择LSI时钟
  • 外设时钟未使能:忘记设置RCC->APB1ENR1_LPTIM1EN
  • 中断未正确配置:NVIC未使能LPTIM1中断,或未清除中断标志

2. 将TIM16与LPTIM1的时钟源设置为LSI,及默认时钟源说明

LPTIM1的LSI时钟配置

已包含在上述init_lptim1()函数中,核心配置是:

RCC->CSR |= RCC_CSR_LSION;
while(!(RCC->CSR & RCC_CSR_LSIRDY));
RCC->CCIPR |= RCC_CCIPR_LPTIM1SEL_0; // LPTIM1选择LSI时钟

TIM16的LSI时钟配置(含PWM输出)

以下是TIM16配置为LSI时钟并输出PWM的代码:

void init_tim16_pwm(void) {
    // 1. 开启TIM16时钟
    RCC->APB2ENR |= RCC_APB2ENR_TIM16EN;

    // 2. 设置TIM16时钟源为LSI
    RCC->CCIPR |= RCC_CCIPR_TIM16SEL_1;    // TIM16SEL=10 -> 选择LSI时钟

    // 3. 配置TIM16通道1(PA6)为复用功能
    GPIOA->MODER &= ~GPIO_MODER_MODE6_Msk;
    GPIOA->MODER |= GPIO_MODER_MODE6_1;     // 复用功能模式
    GPIOA->AFR[0] &= ~GPIO_AFRL_AFSEL6_Msk;
    GPIOA->AFR[0] |= GPIO_AFRL_AFSEL6_0;    // AF1对应TIM16_CH1

    // 4. 配置PWM参数
    TIM16->PSC = 31;                        // LSI=32kHz,分频32后得到1kHz计数时钟
    TIM16->ARR = 999;                       // PWM周期1ms(1kHz)
    TIM16->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM模式1(向上计数)
    TIM16->CCMR1 |= TIM_CCMR1_OC1PE;        // 使能捕获/compare预装载
    TIM16->CCR1 = 500;                      // 50%占空比
    TIM16->CCER |= TIM_CCER_CC1E;           // 使能通道1输出
    TIM16->CR1 |= TIM_CR1_CEN;              // 启动TIM16
}

默认时钟源说明

配置LSI作为时钟源后,原默认时钟源会被完全替换,定时器不再使用默认时钟:

  • LPTIM1默认时钟源为APB1总线时钟(LPTIM1SEL=00),切换为LSI后,仅使用LSI时钟
  • TIM16默认时钟源为APB2总线时钟(TIM16SEL=00),切换为LSI后,仅使用LSI时钟
  • 若需恢复默认时钟,只需将对应时钟选择位改回00即可(如RCC->CCIPR &= ~RCC_CCIPR_LPTIM1SEL_Msk)

内容的提问来源于stack exchange,提问作者Dillan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:13:18