STM32_管脚 部分映射和全映射

在管脚映射的时候一定要记得开启映射的时钟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脚的封装上,不必重映像)。



 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32的引脚重映射功能是通过修改对应的寄存器实现的。在某些情况下,我们可能需要使用特定的引脚,但是这些引脚与默认的功能不匹配。此时,我们可以使用引脚重映射功能将引脚的功能映射到我们需要的功能上。 以STM32F103C8T6为例,该芯片有四个串口(USART1、USART2、USART3、UART4)和两个I2C总线(I2C1、I2C2)。默认情况下,这些串口和I2C总线的引脚分别是: | 引脚 | USART1 | USART2 | USART3 | UART4 | I2C1 | I2C2 | | :----: | :---: | :----: | :----: | :---: | :---: | :---: | | TX/RX | PA9/PA10 | PA2/PA3 | PB10/PB11 | PC10/PC11 | PB6/PB7 | PB10/PB11 | 但是,如果我们需要使用其他的引脚来实现这些功能,就可以使用引脚重映射功能。以USART1为例,它的引脚重映射有两种方式,分别是: 1. 使用PB6/PB7作为USART1的TX/RX引脚: 首先需要将USART1的TX和RX引脚映射到PB6和PB7上,可以通过如下代码实现: ``` RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); ``` 然后需要将USART1的TX和RX引脚重映射到PB6和PB7上,可以通过如下代码实现: ``` GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); ``` 2. 使用PA2/PA3作为USART1的TX/RX引脚: 首先需要将USART1的TX和RX引脚映射到PA9和PA10上,可以通过如下代码实现: ``` RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 然后需要将PA9和PA10引脚重映射到PA2和PA3上,可以通过如下代码实现: ``` GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); ``` 这样,我们就可以使用不同的引脚来实现USART1功能了。同样地,I2C总线的引脚也可以通过引脚重映射的方式来修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值