Проблема STM32L1xx HAL_GPIO_Init

Я разрабатываю приложение для университетского проекта на своей плате STM32L1DISCO с микроконтроллером STM32L152RC.

Я настроил контакты и сгенерировал код инициализации через STM32CubeMX. Я использую Atollic TrueSTUDIO в качестве IDE.

Проблема в том, что сгенерированный код инициализации не может работать на моем MCU. Потратив много времени на отладку, я обнаружил, что проблема в коде заключается в этой одной строке, использующей библиотеку HAL gpio:

HAL_GPIO_Init(IDD_CNT_EN_GPIO_Port, &GPIO_InitStruct);

Несмотря на то, что предыдущий код правильный,

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */

 __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(IDD_CNT_EN_GPIO_Port, IDD_CNT_EN_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : IDD_CNT_EN_Pin */

GPIO_InitStruct.Pin = IDD_CNT_EN_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

После построчного просмотра кода во время отладки я обнаружил, что функция инициализации HAL GPIO не выполняется и вместо этого выдает ошибку времени выполнения: «Цель не отвечает, повторная попытка…».

Когда я комментирую строку инициализации HAL GPIO, программа выполняется без проблем.

STM32CubeMX включает в код библиотеку HAL. Сверху есть,

включить "stm32l1xx_hal.h"

Итак, я не уверен, что вызывает проблему, которую я вижу. Я был бы очень признателен за вашу помощь в этом, так как я не знаю, что делать дальше.

Спасибо.

Вы должны войти в код функции инициализации и глубже проверить, что может быть не так. То, что у меня также было однажды, но не было связано напрямую с контактами GPIO, заключалось в том, что в STM32CubeMx в Sys Debug не был установлен на Serial Wire. Это привело к тому, что во время инициализации внезапно возникла отладка/потеря соединения.
Привет, Мишель, спасибо за комментарий. Я попробовал ваше предложение и обнаружил, что виновником является этот набор кода в функции HAL_GPIO_Init: /* Настройка режима направления ввода-вывода (ввод, вывод, альтернативный или аналоговый) */ temp = GPIOx->MODER; CLEAR_BIT(temp, GPIO_MODER_MODER0 << (позиция * 2)); SET_BIT(temp, (GPIO_Init->Mode & GPIO_MODE) << (position * 2)); GPIOx->MODER = temp; Любая идея о том, почему эти строки кода могут быть проблематичными для MCU?
Нет, извините, я так не углублялся... Вы уверены, что использовали правильный тип платы/процессора в CubeMx? Вы также можете попробовать другой контакт GPIO (возможно, где-то есть конфликт).
Какой пин это IDD_CNT_EN_GPIO? PA13 или PA14 случайно? Похоже, вы перенастраиваете один из контактов SWD. Даже жесткий сбой не вызвал бы такого поведения.

Ответы (1)

IDD_CNT_ENподключен к бортовой схеме измерения мощности. При неправильном использовании это временно нарушит подачу питания V DD , перезагрузив MCU.

Посмотрите схемы в руководстве пользователя

введите описание изображения здесь

Установка IDD_CNT_ENнизкого уровня на выходе запускает внешний таймер U3. После задержки в 150 мс Q13на U3входе становится высокий уровень, FET 1 in U20отключается, а шунтирующий резистор 1 кОм R22теперь подключается последовательно с V DD для повышения точности измерения мощности. MCU должен перейти в режим LOWPOWER, STOP или STANDBY, в котором потребление значительно ниже 1 мА, в течение 150 мс после установки на IDD_CNT_ENнизкий уровень, и установить его обратно в высокий менее чем через 150 мс после поступления сигнала пробуждения на PA0.

Спасибо Беренди, Ян и Мишель. Вы все столкнулись с проблемой в самую точку: это был конфликт вывода IDD_CNT_EN с установкой в ​​качестве GPIO. Использование другого контакта для GPIO работает отлично. Проблема решена. Еще раз спасибо!