STM32L151 CubeIDE下AFIO14复用PC13为TIM输入捕获引脚的实现
STM32L151 CubeIDE中利用AFIO14将PC13配置为TIM_IC2输入捕获引脚
一、CubeIDE图形化基础配置
- 新建STM32L151工程,完成时钟树配置,确保APB1总线时钟正常,TIM5挂载于APB1。
- 配置TIM5输入捕获基础参数:
- 进入
Timers->TIM5,设置Clock Source为Internal Clock。 - 切换到
Input Capture标签页,启用CH2通道,根据需求设置捕获极性(如上升沿)、预分频器、滤波器等参数。
- 进入
- 配置PC13引脚:
- 进入
GPIO配置页,将PC13设置为Alternate Function Mode,输入类型选Floating Input(或根据信号特性选上拉/下拉),设置对应速度等级。 - 注意:CubeIDE图形界面无法直接选择AF14,需后续手动配置寄存器完成复用映射。
- 进入
二、手动配置AFIO复用映射(关键步骤)
STM32L1中TIM5_CH2重映射到PC13需通过SYSCFG寄存器配置,需在初始化阶段添加以下代码:
// 使能SYSCFG时钟 __HAL_RCC_SYSCFG_CLK_ENABLE(); // 将TIM5_CH2重映射到PC13(对应AFIO14) SYSCFG->CFGR1 |= SYSCFG_CFGR1_TIM5CH2_REMAP;
三、完整代码示例
1. TIM5初始化函数(CubeIDE生成后补充)
void MX_TIM5_Init(void) { TIM_HandleTypeDef htim5; TIM_IC_InitTypeDef sConfigIC = {0}; // TIM5核心配置 htim5.Instance = TIM5; htim5.Init.Prescaler = 31; // 假设APB1时钟为32MHz,分频后计数频率1MHz htim5.Init.CounterMode = TIM_COUNTERMODE_UP; htim5.Init.Period = 0xFFFF; // 最大计数周期 htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_IC_Init(&htim5) != HAL_OK) { Error_Handler(); } // 输入捕获通道2配置 sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; // 无滤波,可按需调整 if (HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } // 使能TIM5捕获中断 HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2); }
2. GPIO初始化补充(指定AF14)
void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能GPIOC时钟 __HAL_RCC_GPIOC_CLK_ENABLE(); // PC13复用功能配置 GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF14_TIM5; // 手动指定AF14映射 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); }
3. 捕获中断回调函数
uint32_t capture_value = 0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM5 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { // 读取捕获值 capture_value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); // 此处添加自定义处理逻辑(如计算频率、脉宽) __HAL_TIM_SET_COUNTER(htim, 0); // 重置计数器,准备下一次捕获 } }
四、注意事项
- 必须确保SYSCFG时钟已使能,否则寄存器配置无效。
- PC13的AF14仅对应TIM5_CH2,需确认定时器通道与业务需求匹配。
- 输入捕获的预分频器、滤波器等参数需根据实际信号特性调整。
内容的提问来源于stack exchange,提问作者Kuno
相关产品推荐
相关产品推荐

