stm32 - STM32G070CBT6 上的 GPIO 出现奇怪问题 - 寄存器在 ODR 寄存器中显示输出值,但引脚电平没有切换
问题描述
我对 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 正确切换。无论 ODR 和 MODER 中的内容如何,PB15 都不会切换。
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 的某些内容,但什么也没看到。
不知道下一步该往哪里看。
谢谢您的帮助。
解决方案
我仍然没有找到这个问题的问题。也许运气不好,但在尝试了第 4 板后,第 4 板工作正常。所以可能是生产出了问题。
无论如何,我正在结束这个问题。
推荐阅读
- maven - @RunWith(CucumberWithSerenity.class) 的类型不匹配错误
- python - 运行烧瓶应用程序时不显示 HTML 表格边框
- java - 为什么我不能在没有 \n 的情况下运行这个 tcp 客户端套接字代码?
- python-3.x - 在 Google Cloud Shell 上更新 Python 版本
- go - 进入通道无限循环不阻塞
- javascript - Javascript ...使用新数组值的休息运算符行为?
- r - R中负二项式回归中的警告消息(向前逐步和向后逐步)
- javascript - 有没有办法让 wordpress 帖子类别具有功能但不可见?
- c# - Cookie 更新正常,除了谷歌浏览器以外的其他浏览器
- google-chrome - 如何使用 Chrome 浏览器扩展来监控和解析 devtools 控制台中的输出?