Cоздаю свои
SystemInit функции (как и все остальные, по мере понимания). Очередная - не работает! Процессор вылетает неизвестно куда, в фаулты, даже до обработчика HardFault не добирается! В Кейле, в отладчике, на реальной плате вижу.
Хотя предыдущая функция (в том же файле была, повезло) - работает. Ищу отличия - не нахожу! Смотрю в отладчике - все биты RCC одинаковые.
Там с десяток выражений, что только не сравниваю, заменяю, комментирую - везде одинаково. Добрался до латентности. В нерабочей:
Код
/* Задать использовать буфер предвыборки Flash, 2 цикла ожидания */
FLASH->ACR =
FLASH_ACR_LATENCY_0 * 2 | // LATENCY[2:0] bits (Latency)
FLASH_ACR_HLFCYA * 0 | // Flash Half Cycle Access Enable
FLASH_ACR_PRFTBE * 1; // Prefetch Buffer Enable
В рабочей:
Код
/* Задать использовать буфер предвыборки Flash и 2 цикла ожидания
(half cycle access can only be used with a low-frequency clock of less than 8 MHz
that can be obtained with the use of HSI or HSE but not of PLL) */
FLASH->ACR = FLASH_ACR_PRFTBE
| FLASH_ACR_LATENCY_1; // 2 WS
Смотрю в stm32f10x.h. А там биты заданы так:
Код
#define FLASH_ACR_LATENCY ((uint8_t)0x03) /*!< LATENCY[2:0] bits (Latency) */
#define FLASH_ACR_LATENCY_0 ((uint8_t)0x00) /*!< Bit 0 */
#define FLASH_ACR_LATENCY_1 ((uint8_t)0x01) /*!< Bit 0 */
#define FLASH_ACR_LATENCY_2 ((uint8_t)0x02)
То есть, не так, как везде, описываются именно
биты, как, например:
Код
#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000)
а
состояния латентности.
В результате, латентность у меня не устанавливалась, доступ к памяти сбоил. Когда задал
Код
FLASH->ACR =
FLASH_ACR_LATENCY_2 | // LATENCY[2:0] bits (Latency)
FLASH_ACR_HLFCYA * 0 | // Flash Half Cycle Access Enable
FLASH_ACR_PRFTBE * 1; // Prefetch Buffer Enable
все заработало.
Что интересно, и вторая функция была с неправильной установкой латентности = 1, но, тем не менее каким-то чудом работала. На 72 MHz, STM32F103.
Уже чешутся руки взяться за правку stm32f10x.h, но боюсь запутаться между проектами.