STM32将PB3等IO用作普通IO

本文详细介绍了STM32F103系列微控制器中JTAG接口的默认配置及如何将其从JTAG模式切换为GPIO模式的具体步骤。文中特别强调了PB3引脚在不同模式下的作用,并给出了具体的代码示例。
STM32F103 的 JTAG, 默认状态是Full SWJ。
The default state after reset is “000” (whole pins assigned for a full JTAG-DP connection).

PB3作为JDO,被JTAG占用。
在 TRACE Asynchronous mode,PB3还是TRACESWO。

若系统不需要JTAG,将PB3当作GPIO,需要如下设置:

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE);
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);


第一句中的 RCC_APB2Periph_AFIO 设置 AFIOEN(如果没有这一句,后面两句失效)。

如果一个模块的clock DISABLE,那么,寄存器的值也无法读写。

有了上面两句,就可以进一步对PB3进行操作了。
例如:
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);


  GPIOB->ODR = 0x08;
<think>嗯,用户问的是如何将STM32PB3PB4配置为普通IO口。首先,我得回忆一下STM32的引脚复用功能。PB3PB4这些引脚默认是用于JTAG调试接口的,所以如果用户想当普通IO用,必须重新配置,关闭JTAG功能。 然后,我得查一下相关资料。根据提供的引用,有几个方法,包括使用HAL库和寄存器操作。比如引用1提到需要使能AFIO时钟,并进行重映射。引用3和4中的HAL库代码示例可能有用。 接下来,要考虑不同的开发环境,用户可能用标准库或者HAL库。需要分步骤说明,先开启时钟,再禁用JTAG,最后配置GPIO。可能还要注意是否需要复用功能时钟,比如AFIO的时钟必须开启,否则配置不生效。 另外,用户可能遇到的问题是,即使按照步骤了,PB3PB4还是无法正常使用,这时候需要检查是否有遗漏的步骤,比如是否忘记使能AFIO时钟,或者重映射配置是否正确。引用2和4提到了GPIO_PinRemapConfig函数,而HAL库可能需要调用__HAL_AFIO_REMAP_SWJ_NOJTAG()。 还要注意,不同的STM32型号可能配置方式略有不同,但用户提到的是STM32F103,所以按照给出的引用应该适用。最后,需要提醒用户测试输出,比如用示波器或LED检查是否成功,避免配置错误导致功能不正常。</think>### STM32PB3PB4配置为普通IO口的方法 要将STM32PB3PB4配置为普通IO口,需解除其默认的JTAG调试功能绑定,步骤如下: #### 1. 使能相关时钟 STM32PB3PB4等引脚默认复用为JTAG功能,需开启AFIO(复用功能)和GPIOB的时钟: ```c __HAL_RCC_AFIO_CLK_ENABLE(); // 使能AFIO时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟 ``` 若使用标准库,需同时开启`RCC_APB2Periph_AFIO`和`RCC_APB2Periph_GPIOB`时钟[^1][^2]。 #### 2. 禁用JTAG功能 通过重映射配置关闭JTAG功能,保留SWD调试(若需要): **HAL库方式**: ```c __HAL_AFIO_REMAP_SWJ_NOJTAG(); // 关闭JTAG,保留SWD ``` **标准库方式**: ```c GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); ``` 此操作会将PB3PB4、PA15从JTAG功能释放[^3][^4]。 #### 3. 配置GPIO模式 设置PB3PB4为输入或输出模式,例如推挽输出: **HAL库代码示例**: ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); ``` #### 注意事项 - **时钟顺序**:需先开启AFIO时钟,再进行重映射操作。 - **调试影响**:禁用JTAG后,仅能通过SWD调试,需确保调试器支持SWD模式[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值