Невозможно установить или сбросить GPIO PA12 на STM32F030

У меня возникли проблемы с попыткой НАСТРОИТЬ или СБРОСИТЬ один из моих контактов GPIO на STM32F030.

Я использую 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. Но когда я звоню:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);

Ничего не произошло..

Также вызов GPIO_PIN_RESET ничего не сделает ..

Что мне здесь не хватает ??

Я проверил (и измерил) печатную плату, PA12 подключен только к 0 В с понижающим резистором 10 кОм, внешняя ИС не подтягивает выход PA12 к низкому уровню.

Заранее большое спасибо!

изменить:

Как и просили в комментариях, моя конфигурация контактов 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);

2-е ИЗМЕНЕНИЕ!

Я только что обнаружил, что повторная инициализация GPIO PA12 после инициализации UART работает! Теперь я могу переключить PA12 без проблем ..

Но так быть не должно! Я просматриваю STM32 HAL-lib, но не могу найти фрагмент кода, который устанавливает PA12 ...


person Ruben van Leeuwen    schedule 17.12.2019    source источник
comment
Похоже, в вашей конфигурации установлено подтягивание без вытягивания   -  person LPs    schedule 17.12.2019
comment
Это правильно, у меня есть внешнее выпадающее меню (когда STM32F0 запускается, я хочу, чтобы PA12 был опущен). Я добавил внутреннее подтягивание, потому что думал, что PIN-код с трудом передает достаточный ток. (Я уже сталкивался с этим со слаботочным выводом раньше). Но добавление внутренних подтягиваний не помогает :(   -  person Ruben van Leeuwen    schedule 17.12.2019
comment
В Pull-Up / Dow нет необходимости, так как выходная функция намного сильнее, чем у слабых внутренних подтягивающих резисторов.   -  person theSealion    schedule 17.12.2019
comment
Не могли бы вы опубликовать инициализацию своего пина USART (и, возможно, поискать любое вхождение «GPIO_PIN_12», чтобы посмотреть, не изменилась ли конфигурация где-то еще).   -  person theSealion    schedule 17.12.2019
comment
Не удалось найти никакого другого вызова GPIO_PIN_12, кроме моей собственной инициализации вывода   -  person Ruben van Leeuwen    schedule 17.12.2019
comment
Вы пробовали чистый проект, чтобы просто переключить пин, например: RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; GPIOA->MODER &= ~(GPIO_MODER_MODE3_12); GPIOA->MODER |= GPIO_MODER_MODE3_12; GPIOA->ODR |= GPIO_ODR_OD12   -  person Damiano    schedule 17.12.2019
comment
@Damiano Я попробовал ваш метод, и он сработал, штифт переключается. Я также попробовал драйвер STM32 HAL GPIO, и он тоже работает ... Я думаю, это связано с функциональностью DMA ... Я заметил, что я не устанавливаю вывод UART1_Rx, но он по-прежнему работает, просто вызывая функциональность DMA ..   -  person Ruben van Leeuwen    schedule 17.12.2019
comment
Я только что обнаружил, что могу продолжать переключать каламбур, пока не позвоню: HAL_UART_Init (& huart1);   -  person Ruben van Leeuwen    schedule 17.12.2019
comment
Я мог бы использовать некоторую выдержку от Линуса, чтобы описать вам мое рассмотрение библиотеки ST HAL.   -  person Damiano    schedule 17.12.2019
comment
Я чувствую, что в этой библиотеке так много мелких ошибок ...   -  person Ruben van Leeuwen    schedule 17.12.2019


Ответы (2)


Вы включили часы GPIOA?

__HAL_RCC_GPIOA_CLK_ENABLE();

Редактировать:

Взгляните на свою void HAL_UART_MspInit(UART_HandleTypeDef *huart) функцию, чтобы узнать, какие и как сконфигурированы контакты для usart.

person theSealion    schedule 17.12.2019
comment
Хороший комментарий, да, я сделал. Все остальные контакты порта GPIOA можно установить и сбросить ... кроме PA12. Я также использовал другую печатную плату, но это дает тот же результат - person Ruben van Leeuwen; 17.12.2019
comment
Интересно, не работает ли PA12 по умолчанию в альтернативном режиме? Я знаю, что AF_UART1 установит его как пин RTS - person Ruben van Leeuwen; 17.12.2019
comment
В моем HAL_UART_MspInit () у меня есть: UNUSED (huart); и ничего больше. - person Ruben van Leeuwen; 17.12.2019

Я не нашел того чистого решения, которое мне действительно нужно.

Но инициализация этого единственного контакта после инициализации UART, похоже, помогает ...

PA12 устанавливается при инициализации UART, но я не смог найти фрагмент кода, делающий это где-либо

person Ruben van Leeuwen    schedule 17.12.2019
comment
У вас должна быть реализация HAL_UART_MspInit, которая зависит от оборудования (вне драйвера HAL) .... должен быть код, который инициализирует контакты. (вероятно, созданный вашим идеалом) - person Damiano; 17.12.2019
comment
HAL_UART_MspInit не переопределяется и просто НЕ ИСПОЛЬЗУЕТСЯ (huart); - person Ruben van Leeuwen; 18.12.2019
comment
Вы уверены? Так не может быть. Возможно, та, которую вы нашли, просто слабая функция, и есть другая реализация, возможно, замаскированная какими-то макросами. Просто попробуйте отладить его, пока он не будет вызван. - person Damiano; 18.12.2019
comment
Ну, если вы инициализировали это сами, конечно, в этом нет необходимости - person Damiano; 18.12.2019
comment
Отлажен, вызывает только функцию UNUSED (). Я предполагаю, что MCU сам устанавливает контакт при инициализации UART ?? - person Ruben van Leeuwen; 18.12.2019
comment
Это кажется действительно странным. Не могли бы вы просто сбросить конфигурацию gpio после HAL_UART_Init ()? Вы также можете поместить точку наблюдения в реестр, который был написан им. - person Damiano; 18.12.2019