【问题标题】:Unable to SET or RESET GPIO PA12 on STM32F030无法在 STM32F030 上设置或重置 GPIO PA12
【发布时间】:2019-12-17 08:52:11
【问题描述】:

我在尝试设置或重置 STM32F030 上的一个 GPIO 引脚时遇到了一些问题。

我正在使用 STM32F0xx_HAL_Driver,并像这样初始化 GPIO PA12:

    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

我还使用以下代码设置了我的 UART:

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600; 
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_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;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_ENABLE;
  huart1.gState = HAL_UART_STATE_RESET;

  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

  HAL_UART_Init(&huart1);

我知道 PA12 可以用作 UART1_RTS 引脚,但我没有将硬件流控制设置为使用 RTS 或 CTS。

我面临的问题: 代码初始化后,我可以通过 UART1 连接接收消息。 要回复,我需要设置我尝试使用 PA12 设置的外部 IC 的引脚。 但是当我打电话时:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);

什么都没发生……

同样调用 GPIO_PIN_RESET 也无济于事..

我在这里错过了什么??

我已检查(并测量)PCB,PA12 仅通过 10k 下拉电阻连接到 0V,外部 IC 并未将 PA12 输出拉低。

非常感谢!

编辑:

根据 cmets 的要求,我的 UART 引脚配置:

  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

我正在使用 DMA 来设置 Rx:

    /* DMA controller clock enable */
    __HAL_RCC_DMA1_CLK_ENABLE();

    /* DMA interrupt init */
    /* DMA1_Channel2_3_IRQn interrupt configuration */
    hdma_usart1_rx.Instance = DMA1_Channel3;
    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_rx.Init.Mode = DMA_NORMAL;
    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;

    HAL_DMA_Init(&hdma_usart1_rx);
    HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);

第二次编辑!

我刚刚发现 在 UART 初始化之后重新初始化 GPIO PA12 可以正常工作! 我现在可以毫无问题地切换 PA12..

但这不是应有的方式! 我正在研究 STM32 HAL-lib,但找不到设置 PA12 的代码...

【问题讨论】:

  • 你的配置好像设置了 pullup non pulldown
  • 这个是对的,我有一个外部下拉(STM32F0启动时,我希望PA12被下拉)。我添加了内部上拉电阻,因为我认为 PIN 很难提供足够的电流。 (我以前用低电流引脚经历过这种情况)。但是添加 internall-pull-up 并不能解决问题:(
  • 您能否发布您的 USART 引脚初始化(并可能搜索任何出现的“GPIO_PIN_12”,以便查看配置是否在其他地方更改)。
  • 您是否尝试过一个干净的项目来切换引脚,例如:RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; GPIOA->MODER &= ~(GPIO_MODER_MODE3_12); GPIOA->MODER |= GPIO_MODER_MODE3_12; GPIOA->ODR |= GPIO_ODR_OD12
  • 我可以使用一些来自 Linus 的 externation 来描述我对 ST HAL 库的考虑。

标签: c stm32 uart gpio stm32f0


【解决方案1】:

您是否启用了 GPIOA 时钟?

__HAL_RCC_GPIOA_CLK_ENABLE();

编辑:

请查看您的 void HAL_UART_MspInit(UART_HandleTypeDef *huart) 函数,了解 usart 的哪些引脚以及如何配置。

【讨论】:

  • 好评论,是的,我做到了。 GPIOA 端口上的所有其他引脚都可以设置和重置.. 除了 PA12。我也使用了另一个 PCB,但这给出了相同的结果
  • 我想知道PA12是否默认不处于替代模式?我知道 AF_UART1 会将其设置为 RTS 引脚
  • 在我的 HAL_UART_MspInit() 我有: UNUSED(huart);没有别的。
【解决方案2】:

我还没有找到我真正想要的 clean 解决方案..

但是 UART 初始化之后初始化这个单个引脚似乎可以解决问题..

在 UART 初始化中设置了 PA12,但我无法在任何地方找到这样做的代码

【讨论】:

  • 你应该有一个硬件依赖的 HAL_UART_MspInit 实现(在 HAL 驱动程序之外)......应该有初始化引脚的代码。 (可能由你的 ide 生成)
  • HAL_UART_MspInit 没有被覆盖,只有“UNUSED(huart);”
  • 你确定吗?它不能以这种方式工作。也许您发现的那个只是一个弱函数,并且周围还有其他一些实现,可能被一些宏所掩盖。尝试调试它直到它被调用。
  • 好吧,如果你自己初始化了,当然不需要
  • 对其进行了调试,它唯一调用的是 UNUSED() 函数。我猜MCU本身在UART初始化时设置了引脚??
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2016-10-08
相关资源
最近更新 更多