你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32会存在单个IO口坏掉的情况吗?

[复制链接]
Ha~ha~ 提问时间:2025-5-30 09:59 / 已解决

型号:STM32F103RCT6

工具:CubeMX、Keil5、LL库

UART5:

TX:PC12

RX:PD2

现象:

调试 UART5, 使用中断接收,阻塞发送。发送数据正常,但是无法接收到数据,好像都没有进入中断处理函数。同样的方法配置UART4,发送和接收都正常。

重新建立一个工程,不配置串口。直接将PD2 和 PC12配置为推挽输出,然后在while(1)中做连续电平翻转。PC12脚输出方波,PD2输出异常。

赞 收藏 评论7 发布时间:2025-5-30 09:59

举报

7个回答
butterflyspring 回答时间:2025-5-30 10:17:47
作为标准IO口的PD2,正常情况下应该能输出方波的。


建议将此引脚悬空,测量输出方波,避免外部电路影响。

如不能输出,那么简单测量一下该引脚悬空状态下对GND 和 VDD的阻抗,粗略判断一下是否有损坏。

有条件的化,再换一片对比一下。
Ha~ha~ 回答时间:2025-5-30 10:01:59
这里是配置UART5的代码
/* UART5 init function */
void MX_UART5_Init(void)
{
  /* USER CODE BEGIN UART5_Init 0 */
  /* USER CODE END UART5_Init 0 */

  LL_USART_InitTypeDef USART_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_UART5);

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
  /**UART5 GPIO Configuration
  PC12   ------> UART5_TX
  PD2   ------> UART5_RX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_12;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
  LL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* UART5 interrupt Init */
  NVIC_SetPriority(UART5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(UART5_IRQn);

  /* USER CODE BEGIN UART5_Init 1 */

  /* USER CODE END UART5_Init 1 */
  USART_InitStruct.BaudRate = 115200;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  LL_USART_Init(UART5, &USART_InitStruct);
  LL_USART_ConfigAsyncMode(UART5);
  LL_USART_Enable(UART5);
  /* USER CODE BEGIN UART5_Init 2 */
        LL_USART_EnableIT_RXNE(UART5);
        LL_USART_EnableIT_IDLE(UART5);
  /* USER CODE END UART5_Init 2 */
}

void UART5_SendDatas(uint8_t *data, uint8_t len)
{
        uint16_t i = 0;
        for(i = 0; i < len; i++)
        {
                while(LL_USART_IsActiveFlag_TC(UART5)!= 1);
                LL_USART_TransmitData8(UART5, data[i]);
        }
}


uint16_t UART5_RxIndex = 0;
uint16_t UART5_RxLen = 0;
uint8_t  UART5_RxBuf[UART5_RxMax] = {0};
void MY_UART5_IRQHandler(void)
{
        uint8_t temp = 0;
        if(LL_USART_IsActiveFlag_IDLE(UART5))
        {
                LL_USART_ClearFlag_IDLE(UART5);
                UART5_RxLen = UART5_RxIndex;
                UART5_RxIndex = 0;
        }

        if(LL_USART_IsActiveFlag_RXNE(UART5))
        {
                LL_USART_ClearFlag_RXNE(UART5);
                temp = LL_USART_ReceiveData8(UART5);
    UART5_RxBuf[UART5_RxIndex] = temp;
                UART5_RxIndex ++;
        }
}

Ha~ha~ 回答时间:2025-5-30 10:09:54
PC12输出电压范围是0到3.3v
PD2只有0.1v左右,几乎没有。




62c37e13110197aaf99957c63c9db089_compress.jpg
种花家刘氓兔 回答时间:2025-5-30 10:19:20

你尝试将UART5映射到其他GPIO上试试,

1、有可能这个PD2打坏了,内部上下拉有问题

2、有可能UART5 RX那部分,打坏了

3、也有可能以上两种情况都有

Ha~ha~ 回答时间:2025-5-30 10:53:42

butterflyspring 发表于 2025-5-30 10:17
作为标准IO口的PD2,正常情况下应该能输出方波的。</p>
<p>

板子上的PD2是直接引出来的,断电直接测了一下,对VDD的电阻1.8KΩ,对GND的电阻只有2.8Ω,其他的引脚对VDD和GDN都是MΩ级别的。

应该是引脚坏掉了。

Ha~ha~ 回答时间:2025-5-30 10:56:11
种花家刘氓兔 发表于 2025-5-30 10:19
[md]你尝试将UART5映射到其他GPIO上试试,

1、有可能这个PD2打坏了,内部上下拉有问题

测了一下,是引脚坏掉了
HyunYong 回答时间:2025-7-4 12:35:14

会的 单独坏掉IO 或者是出现IO正常AD功能用不了了,之前出现过问题

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版