STM32G070CBT6上的GPIO出现奇怪的问题-寄存器在ODR寄存器中显示输出值,但引脚电平不切换

问题描述 投票:0回答:1

我对STM32G070CBT6有一个奇怪的问题。

我的问题是,无论我的代码和寄存器显示什么,PB15上的输出都不会改变。

我使用CubeMX来创建我的项目,在该项目中,只有PB15,PB14,PB12和PB2在推挽模式下被设置为没有上拉或下拉的输出。除osc引脚和电源引脚外,所有其他GPIO均设置为下拉输入。这样,我确保没有其他组件会干扰和导致问题。

对于每个引脚,都连接了相同的组件:一个120ohm电阻与一个100kohm电阻并联。 100k电阻接地,而120Ω电阻接地MOSFET(IRLML2402)。

我可以切换引脚PB14,PB12和PB2没问题。但是,无论执行什么操作,PB15都不会切换。

[我使用带有IAR的Jlink跟踪,并且在我的GPIOB寄存器中,将ODR和IDR设置为t 0x00008000,将MODER设置为0x51000010,这意味着PB15确实被设置为输出,应将引脚切换为HIGH。

这是使用cubeMX创建的初始化。

PB15-> MOTOR1_2

PB14-> MOTOR2_1

PB12-> MOTOR1_1

PB2-> MOTOR2_2

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, MOTOR2_2_Pin|MOTOR1_1_Pin|MOTOR2_1_Pin|MOTOR1_2_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pins : PC13 PC6 PC7 */
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PA0 PA1 PA2 PA3 
                           PA4 PA5 PA6 PA7 
                           PA8 PA9 PA10 PA11 
                           PA12 PA15 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 
                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PB0 PB1 PB10 PB11 
                           PB13 PB3 PB4 PB5 
                           PB6 PB7 PB8 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_13|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 
                          |GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : MOTOR2_2_Pin MOTOR1_1_Pin MOTOR2_1_Pin MOTOR1_2_Pin */
  GPIO_InitStruct.Pin = MOTOR2_2_Pin|MOTOR1_1_Pin|MOTOR2_1_Pin|MOTOR1_2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : PD0 PD1 PD2 PD3 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

}

并且我在主循环中切换四个输出中的每个输出,在其中使用断点来检查物理输出值。 PB14,PB12和PB2正确切换。 PB15根本不切换,无论ODR和MODER中有什么。

 while (1)
  {
    HAL_GPIO_WritePin(GPIOB,MOTOR1_1_Pin,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB,MOTOR1_1_Pin,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB,MOTOR1_2_Pin,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB,MOTOR1_2_Pin,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB,MOTOR2_1_Pin,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB,MOTOR2_1_Pin,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB,MOTOR2_2_Pin,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB,MOTOR2_2_Pin,GPIO_PIN_RESET);
   // HAL_GPIO_WritePin(GPIOB,MOTOR1_2_Pin,GPIO_PIN_SET);
    //HAL_GPIO_WritePin(GPIOB,MOTOR1_2_Pin,GPIO_PIN_RESET);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

作为最后的沟渠工作,我抬起了PB15插针,使其未连接任何东西,并拨动了插针。仍然没有成功。

我在多块板上尝试了这种操作,它们都有相同的问题。我在这里茫然。我一遍又一遍地检查了文档,看看是否错过了STM32G070CBT6中有关PB15的内容,但什么也没看到。

不确定下一步要去哪里。

谢谢您的帮助。

stm32 gpio
1个回答
0
投票

我仍然没有找到这个问题的问题。也许运气不好,但是尝试了第4个板后,第4个板正常工作。所以也许生产有问题。

无论如何,我要关闭这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.