KARLSON 1 23 июня, 2022 Опубликовано 23 июня, 2022 · Жалоба Всех приветствую. Предлагаю тут выкладывать найденные ошибки в библиотеках HAL. P.S. не нужно тут обсуждать применять или нет библиотеки. Итак. MCU - L433 библиотека - stm32l4xx_hal_i2c.c версия - STM32Cube_FW_L4_V1.17.2 (последняя на 23.06.2022) функция - I2C_IsErrorOccurred Причина: в цикле while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) после условия выхода по таймауту if ((HAL_GetTick() - tickstart) > I2C_TIMEOUT_STOPF) нет выхода из цикла. Может остаться на очень долгое время. Решение: добавить break; после status = HAL_ERROR; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Margel 0 23 июня, 2022 Опубликовано 23 июня, 2022 · Жалоба STM32Cube_FW_L4_V_{любая} И функция HAL_RCCEx_PeriphCLKConfig на 1000 байт скомпиленного кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 23 июня, 2022 Опубликовано 23 июня, 2022 (изменено) · Жалоба 3 часа назад, KARLSON сказал: . . . в цикле while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) после условия выхода по таймауту if ((HAL_GetTick() - tickstart) > I2C_TIMEOUT_STOPF) нет выхода из цикла. Может остаться на очень долгое время. . . . Функция определена как макрос Спойлер #define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U)?((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)): \ ((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK))) Проверьте работу с ней через переменную X_Flag = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF); if( X_Flag == RESET ) . . . . Или поставьте вызов ф-ии в дополнительные скобки. Изменено 23 июня, 2022 пользователем k155la3 опечатка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 23 июня, 2022 Опубликовано 23 июня, 2022 · Жалоба On 6/23/2022 at 2:17 PM, KARLSON said: Всех приветствую. Предлагаю тут выкладывать найденные ошибки в библиотеках HAL. P.S. не нужно тут обсуждать применять или нет библиотеки. Итак. MCU - L433 библиотека - stm32l4xx_hal_i2c.c версия - STM32Cube_FW_L4_V1.17.2 (последняя на 23.06.2022) функция - I2C_IsErrorOccurred Причина: в цикле while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) после условия выхода по таймауту if ((HAL_GetTick() - tickstart) > I2C_TIMEOUT_STOPF) нет выхода из цикла. Может остаться на очень долгое время. Решение: добавить break; после status = HAL_ERROR; Прекрасно выходит из цикла. Смотрите условие while ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) && (status == HAL_OK)) И сообщать об ошибках лучше https://github.com/STMicroelectronics/stm32l4xx_hal_driver/issues Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 27 июня, 2022 Опубликовано 27 июня, 2022 · Жалоба В 23.06.2022 в 18:22, x893 сказал: Прекрасно выходит из цикла. Смотрите условие while ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) && (status == HAL_OK)) Так что бы к этому условию придти , нужно сначала выйти из while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET), который ниже. А в ST обязательно скажу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 9 ноября, 2022 Опубликовано 9 ноября, 2022 · Жалоба Сегодня ради интереса скомпилировал проекты под HAL и под старые библиотеки ST StdPeriph. Выходной код HAL - 16 КБ (Инициализация + USB), выходной код StdPeriph - 11 КБ (инициализация + USB + полная обработка протокола своего загрузчика). Условия сборки совершенно идентичны. Так что нафиг-нафиг этот HAL 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться