Перейти к содержанию
    

Ошибки в библиотеке HAL

Всех приветствую. Предлагаю тут выкладывать найденные ошибки в библиотеках 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 ) . . . .

Или поставьте вызов ф-ии в дополнительные скобки.

Изменено пользователем k155la3
опечатка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 обязательно скажу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сегодня ради интереса скомпилировал проекты под HAL и под старые библиотеки ST StdPeriph. Выходной код HAL - 16 КБ (Инициализация + USB), выходной код StdPeriph - 11 КБ (инициализация + USB + полная обработка протокола своего загрузчика). Условия сборки совершенно идентичны. Так что нафиг-нафиг этот HAL 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...