Ранее был stdlib. Сейчас st меняет подход. И, похоже, не все вычистило при переходе.
Честно говоря я не ставил своей задачей выявить "как и почему". И использую лишь некоторые модули. В частности попробовал применить RCC и FLASH.
В обоих возникли хомуты.
С FLASH не стал разбираться, если честно - выкинул и обратился напрямую к регистрам.
С RCC наблюдаю следующее ...
В файле stm32f1xx_hal_rcc.c (версия V1.0.0 от 15-December-2014) есть процедура:
__weak HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
Как видим задаётся FLatency. Эта FLatency нигде не фигурирует далее по процедуре, кроме как в assert_param(IS_FLASH_LATENCY(FLatency));
В библиотеке stdlib она, естественно, использовалась для задания Latency cycle FLASH памяти.
Здесь это описывается в заголовке и по тексту, но не делается.
Если исходить из того, что я должен был сделать это заранее отдельной процедурой, то тогда зачем было вводить этот параметр в эту процедуру и проверять на правильность задания?
То есть с моей точки зрения это достоверный баг.
При попытке запуска контроллера на частотах требующих тактов ожидания, естественно ничего не работает.
Для начинающих: необходимо добавить в начале процедуры следующие строки:
Код
// Flash FLatency wait state
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLatency;
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLatency;