找回密码
 立即注册
首页 业界区 安全 STM32F103ZET6开发板串口只发不收问题解决

STM32F103ZET6开发板串口只发不收问题解决

辜酗徇 5 天前
问题描述

最近在使用 STM32F103ZET6 开发板调试串口时,遇到了一个诡异的问题:单片机能正常向 PC 发送数据,但始终无法接收 PC 下发的数据,甚至连串口接收中断都没触发。更奇怪的是,相同的代码在STM32F103C8T6 最小系统板上能完美运行收发双向通信。经过多轮排查,发现串口重定向可以解决问题,在此记录完整过程,给遇到类似问题的开发者避坑。
解决:引脚重定向

将 USART1 默认引脚(A9/A10)重定向到 GPIOB 的备用引脚,无需修改串口核心配置,仅调整引脚相关代码即可。
硬件展示

第一个是问题开发板STM32F103ZET6,第二个是STM32F103C8T6

2.png

原始代码 (A9/A10 配置,仅发不收)

以下代码配置 USART1 默认引脚 A9(TX)、A10(RX),可正常发送但无法接收:
  1. void USART_Init(void) {  
  2.     // 1. 时钟使能  
  3.   
  4.     // 引脚时钟  
  5.     RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;  
  6.   
  7.     // 配置USART1时钟  
  8.     RCC->APB2ENR |= RCC_APB2ENR_USART1EN;  
  9.   
  10.     // 复用功能时钟  
  11.     RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;  
  12.   
  13.     // 2. 引脚配置  
  14.   
  15.     // 配置PA9为复用推挽输出  
  16.     GPIOA->CRH |= GPIO_CRH_MODE9;  
  17.     GPIOA->CRH |= GPIO_CRH_CNF9_1;  
  18.     GPIOA->CRH &= ~GPIO_CRH_CNF9_0;  
  19.   
  20.     // 配置PA10为复用输入浮空  
  21.     GPIOA->CRH &= ~GPIO_CRH_MODE10;  
  22.     GPIOA->CRH &= ~GPIO_CRH_CNF10_1;  
  23.     GPIOA->CRH |= GPIO_CRH_CNF10_0;  
  24.   
  25.     // 3. USART1配置  
  26.   
  27.     // 波特率  
  28.     USART1->BRR = 0x271;  
  29.   
  30.     // 使能  
  31.     USART1->CR1 |= USART_CR1_UE; // 使能USART1  
  32.     USART1->CR1 |= USART_CR1_TE; // 发送使能  
  33.     USART1->CR1 |= USART_CR1_RE; // 接收使能  
  34.   
  35.     // 其他配置  
  36.     USART1->CR1 &= ~USART_CR1_M; // 数据字长8位  
  37.     USART1->CR1 &= ~USART_CR1_PCE; // 禁止奇偶校验  
  38.     USART1->CR2 &= ~USART_CR2_STOP; // 1个停止位  
  39.   
  40.     // 中断使能  
  41.     USART1->CR1 |= USART_CR1_IDLEIE;  
  42.     USART1->CR1 |= USART_CR1_RXNEIE;  
  43.   
  44.     NVIC_SetPriorityGrouping(3);  
  45.     NVIC_SetPriority(USART1_IRQn, 3);  
  46.     NVIC_EnableIRQ(USART1_IRQn);  
  47. }
复制代码
改进代码(重定向到 PB6/PB7,收发正常)

通过 AFIO 开启 USART1 部分重映射,将引脚切换为 PB6(TX)、PB7(RX),核心配置不变:
  1. void USART_Init(void) {  
  2.     // 1. 时钟使能  
  3.     RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;  // 改为GPIOB时钟  
  4.     RCC->APB2ENR |= RCC_APB2ENR_USART1EN;  
  5.     RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;  
  6.   11
  7.     // 2. 使能部分重映射  
  8.     AFIO->MAPR |= AFIO_MAPR_USART1_REMAP;  // 部分重映射到PB6, PB7  
  9.   
  10.     // 3. 引脚配置 - PB6(TX), PB7(RX)  
  11.     // 配置PB6为复用推挽输出 (USART1_TX)    GPIOB->CRL &= ~GPIO_CRL_CNF6;  // 清除配置位  
  12.     GPIOB->CRL |= GPIO_CRL_CNF6_1;  // 复用推挽输出  
  13.     GPIOB->CRL |= GPIO_CRL_MODE6;   // 输出模式,最大速度50MHz  
  14.   
  15.     // 配置PB7为浮空输入 (USART1_RX)    GPIOB->CRL &= ~GPIO_CRL_MODE7;  // 输入模式  
  16.     GPIOB->CRL &= ~GPIO_CRL_CNF7;   // 清除配置位  
  17.     GPIOB->CRL |= GPIO_CRL_CNF7_0;  // 浮空输入  
  18.   
  19.     // 4. USART1配置 (保持不变)  
  20.     USART1->BRR = 0x271;  
  21.     USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;  
  22.     USART1->CR1 &= ~USART_CR1_M;  
  23.     USART1->CR1 &= ~USART_CR1_PCE;  
  24.     USART1->CR2 &= ~USART_CR2_STOP;  
  25.   
  26.     // 中断配置  
  27.     USART1->CR1 |= USART_CR1_IDLEIE | USART_CR1_RXNEIE;  
  28.     NVIC_SetPriorityGrouping(0);  
  29.     NVIC_SetPriority(USART1_IRQn, 3);  
  30.     NVIC_EnableIRQ(USART1_IRQn);  
  31. }
复制代码
总结

问题根源大概率是 STM32F103ZET6 开发板的硬件设计:默认串口引脚 A9/A10 可能被板载其他外设(如 LCD、按键、SD 卡等)复用,导致接收引脚信号被占用或干扰,表现为 “只发不收”。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册