STM32F103调试接口重定义GPIO

   今天调试新硬件,一不小心,又被端口的默认功能复用给坑了——PB3上电后直接按照GPIO口的方式配置为上拉输入,但是电平怎么都拉不上来。想起几天前被PD0配置GPIO的经历,这次很快就确定是复用引起的问题。
       F103的部分封装由于引脚数量有效,很多接口功能都是复用的。调试接口的复用情况如下:
        
       由于仿真调试使用的是SWJ-DP接口,PA13\PA14两个IO口默认,但是由于PA15\PB3\PB4上电默认复用为JTAG的相关功能引脚,所以采用直接配置为GPIO的方式配置输入输出功能是不能得到正确的结果的,需要配置之前重新映射过,具体映射方法如下:
 

  1.  
  2.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//// RCC_APB2Periph_AFIO被使能,否则操作无效
  3.         //// 1. 操作之前必须确保RCC_APB2Periph_AFIO被使能,否则操作无效
  4.         //// 2. 根据自己的情况选择:
  5.         ////    a.GPIO_Remap_SWJ_NoJTRST——使能JTAG-DP和SW-DP,但是没有JNTRST,及JNTRST(PB4)重映射为GPIO口;
  6.         ////    b.GPIO_Remap_SWJ_JTAGDisable——禁止JTAG-DP和使能SW-DP;
  7.         ////    c.GPIO_Remap_SWJ_Disable——禁止JTAG-DP和SW-DP,此时两个调试接口都不能使用,慎重选择
  8.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

复制代码

      增加上面函数后,PB3的输入配置功能正常使用,具体如下:

  1. void BspGpioInInit(void)
  2. {
  3.      GPIO_InitTypeDef    gpioInit;
  4.   
  5.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  6.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  7.      GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  8.  
  9.      gpioInit.GPIO_Mode = GPIO_Mode_IPU;
  10.      gpioInit.GPIO_Speed = GPIO_Speed_2MHz;
  11.      gpioInit.GPIO_Pin = GPIO_Pin_3;
  12.      GPIO_Init(GPIOB, &gpioInit);

复制代码

       也许会有人问,怎么知道具体哪些GPIO需要重新映射呢,这个可以看看数据手册引脚定位,如果选项栏“主功能(复位后)”对应的不是GPIO,而在重定义功能里面有GPIO口,那么就需要重新映射,如上面的引脚的引脚定位为:

          
                   其余的参考查找数据手册...

### STM32F103C8T6 引脚功能重定义 STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的微控制器,其引脚可以通过配置 GPIO 的模式来实现多种功能。通过修改寄存器或使用 HAL 库/LL 库函数可以轻松完成引脚的功能重定义。 #### 配置方法概述 GPIO 引脚的功能通常由 `AFR` 寄存器(Alternate Function Register)控制。每个 GPIO 可以被设置为不同的外设功能或者普通的输入/输出模式。具体操作如下: 1. **初始化 GPIO 端口**:启用对应的时钟并配置端口模式。 2. **选择 Alternate 功能**:如果需要将引脚用于特定外设,则需将其配置为 alternate function 并指定具体的 AF 编号。 3. **使能外设模块**:确保目标外设已正确初始化并运行。 以下是详细的代码示例说明如何重新定义某个引脚的功能。 --- #### 示例代码:将 PA9 重定义为 USART1 TX 引脚 假设我们希望将 PA9 设置为 USART1 的发送引脚 (TX),下面是完整的代码实现过程。 ```c #include "stm32f1xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void) { // 初始化系统时钟 SystemClock_Config(); // 初始化 GPIO 和 UART 外设 MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { char data[] = "Hello, STM32!\n"; HAL_UART_Transmit(&huart1, (uint8_t *)data, sizeof(data) - 1, HAL_MAX_DELAY); // 发送数据 HAL_Delay(1000); // 延迟一秒 } } // 配置 GPIO static void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 将 PA9 配置为复用推挽输出模式 (USART1_TX) GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;// 高速模式 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } // 配置 USART1 static void MX_USART1_UART_Init(void) { __HAL_RCC_USART1_CLK_ENABLE(); // 启用 USART1 时钟 huart1.Instance = USART1; huart1.Init.BaudRate = 115200; // 波特率 115200 bps huart1.Init.WordLength = UART_WORDLENGTH_8B; // 数据长度 8 位 huart1.Init.StopBits = UART_STOPBITS_1; // 停止位 1 位 huart1.Init.Parity = UART_PARITY_NONE; // 无校验 huart1.Init.Mode = UART_MODE_TX_RX; // 收发模式 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 关闭硬件流控 huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { // 初始化失败处理逻辑 Error_Handler(); } } ``` 上述代码展示了如何将 PA9 定义为 USART1 的 TX 引脚,并通过串口发送字符串消息[^1]。 --- #### 注意事项 - 在更改引脚功能之前,请务必查阅《STM32F103 Reference Manual》中的 AFR 寄存器描述部分,确认所选引脚支持的目标外设功能。 - 如果使用标准库而非 HAL 库,则需要手动编写寄存器级的操作代码。 - 对于某些特殊用途的引脚(如 SWD 调试接口),建议仅在调试完成后才对其进行重新定义,以免影响正常开发流程。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值