用PB13作为互补输出引脚为什么没反应?PA7却没问题?

文章导读
结论:PB13作为TIM1的CH1N互补输出引脚需要开启重映射GPIO_PartialRemap_TIM1,否则默认是PA7。直接在代码中添加GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);就能解决PB13没反应的问题。
📋 目录
  1. 问题原因
  2. 完整解决方案代码
  3. STM32F10x TIM1引脚重映射表
  4. 常见配置步骤
A A

结论:PB13作为TIM1的CH1N互补输出引脚需要开启重映射GPIO_PartialRemap_TIM1,否则默认是PA7。直接在代码中添加GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);就能解决PB13没反应的问题。

问题原因

在STM32F10x中,TIM1的CH1N默认引脚是PA7,要使用PB13作为CH1N互补输出,必须开启TIM1的部分重映射:GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);。你的代码中有注释掉的重映射行,开启它即可。

PB13和PB14/PB15是TIM1互补输出的重映射引脚,默认情况下这些引脚不工作。只有开启PartialRemap后,CH1N才会映射到PB13,CH2N到PB14,CH3N到PB15。

用PB13作为互补输出引脚为什么没反应?PA7却没问题?

完整解决方案代码

#include "stm32f10x.h"
void PWM_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); // 这行必须开启

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

很多人在使用PB13做互补输出时忘记了重映射这一步,默认TIM1 CH1N只在PA7上输出,PB13没反应很正常。开启重映射后PB13就能正常输出了。

用PB13作为互补输出引脚为什么没反应?PA7却没问题?

STM32F10x TIM1引脚重映射表

TIM1_CH1N: PA7 (默认) / PB13 (PartialRemap)
TIM1_CH2N: PB0 (默认) / PB14 (PartialRemap)
TIM1_CH3N: PB1 (默认) / PB15 (PartialRemap)
一定要根据需要选择开启相应的重映射配置。

另外注意AFIO时钟也要开启,你的代码里已经有了。重映射后记得将PB13配置为复用推挽输出GPIO_Mode_AF_PP。

用PB13作为互补输出引脚为什么没反应?PA7却没问题?

常见配置步骤

1. 开启TIM1、AFIO、GPIOB时钟
2. GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
3. PB13配置为GPIO_Mode_AF_PP
4. TIM1互补输出使能,设置死区等参数
这样PB13就能正常输出互补PWM了。

FAQ
Q: 为什么PA7能直接用不用重映射?
A: 因为PA7是TIM1 CH1N的默认引脚,不需要重映射。

Q: 重映射后原PA7还会输出吗?
A: 不会,重映射后CH1N输出转移到PB13,PA7不再输出该信号。

Q: PB14 PB15也要重映射吗?
A: 是的,它们也是PartialRemap的引脚,一起开启即可。

Q: 代码中还需要其他配置吗?
A: 是的,还要配置TIM1的互补通道使能、死区时间、极性等参数。