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
相关产品推荐
相关产品推荐

