У меня возникли проблемы с попыткой НАСТРОИТЬ или СБРОСИТЬ один из моих контактов 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 ...
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