在管脚映射的时候一定要记得开启映射的时钟RCC_APB2Periph_AFIO
如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//全部释放
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
映射了PD0,PD1(外部时钟管脚,默认为时钟输入)。
STM32中关于PD0和PD1的映射有如下说明:
The pins number 2 and 3 in the VFQFPN36 package, and 5 and 6 in the LQFP48 and LQFP64 packages are configured as
OSC_IN/OSC_OUT after reset, however the functionality of PD0 and PD1 can be remapped by software on these pins. For the LQFP100 package, PD0 and PD1 are available by default, so there is no need for remapping. For more details, refer to the Alternate function I/O and debug configuration section in the STM32F10xxx reference manual.
The use of PD0 and PD1 in output mode is limited as they can only be used at 50 MHz in output mode.
切记:PD0和PD1使用输出模式的时候被限制在只能用50MHz使用,否则无法输出高低电平。实测验证过,,,,
GPIO_Remap_SWJ_Disable是将JTAG所有的管脚全映射为GPIO了。
至于部分映射TIM3和全映射TIM2,等其他的映射可查看寄存器AFIO_MAPR的说明。如下图
我的程序使用的是PB4输出定时器3 通道1的PWM,故此处为GPIO_PartialRemap_TIM3部分重映射。
又如下图,
#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100)
#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200)
#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400)
可以通过选择GPIO_Remap_SWJ_NoJTRST ,将PB4的IO功能使用,就是释放了NJTRST的功能。
当选择GPIO_Remap_SWJ_Disable,所有相关的调试口均释放成了IO口。此时通过Jlink的SW方式下载时,无法下载程序,
解决方法:
1.需要复位下载(可将复位管脚对地短路,在点击下载后,释放复位管脚即可下载程序,复位时,管脚为默认功能)
2.将BOOT0拉高使用串口下载。
注意:
(1)TIM2_CH1 和 TIM2_ETR 共用一个引脚,但不能同时使用(因此在此使用这样的标记: TIM2_CH1_ETR)
(2)当不使用主振荡器HSE时(系统运行于内部的8MHz阻容振荡器), PD0和PD1可以映像到OSC_IN和OSC_OUT引脚。此功能只能适用于36、 48和64引脚的封装(PD0和PD1出现在100脚和144脚的封装上,不必重映像)。