scmrtos / scmrtos-sample-projects

MIT License
10 stars 7 forks source link

порт gcc stm32f1xx - некорректная инициализация flash #1

Closed esaulenka closed 7 years ago

esaulenka commented 7 years ago

scmrtos-sample-projects/samples/cortex/mx-gcc/common/stm32/f1xx/sysinit.cpp

// Flash 2 wait state (if freq in 24..48 MHz range - 1WS.)
FLASH->ACR = (FLASH->ACR & ~FLASH_ACR_LATENCY) | FLASH_ACR_LATENCY_2;

комментарий правильный, однако FLASH_ACR_LATENCY_2 - это установка бита 2, т.е., вероятно, 4 wait state'а (не знаю, поддерживается ли... проверять быстродействие поленился).

Корректный код должен выставлять первый бит:

// Flash 2 wait state (if freq in 24..48 MHz range - 1WS.)
FLASH->ACR = (FLASH->ACR & ~FLASH_ACR_LATENCY) | FLASH_ACR_LATENCY_1;

Для остальных камней ошибки вроде б нет. Спасибо ST'шникам за простые и понятные заголовки, чтоб их...

antongus commented 7 years ago

FLASH_ACR_LATENCY_2 - это не второй бит, это просто 2 :)

Видимо, тут двойка не от номера бита, а от числа WS.

esaulenka commented 7 years ago

действительно, самдурак. Прошу прощения за преждевременную панику.

PS а вот у меня в коде ошибка была...

  * @file    stm32f105xc.h
  * @author  MCD Application Team
  * @version V4.0.0
  * @date    16-December-2014
... skipped...
/*******************  Bit definition for FLASH_ACR register  ******************/
#define  FLASH_ACR_LATENCY                   ((uint32_t)0x00000007)        /*!< LATENCY[2:0] bits (Latency) */
#define  FLASH_ACR_LATENCY_0                 ((uint32_t)0x00000001)        /*!< Bit 0 */
#define  FLASH_ACR_LATENCY_1                 ((uint32_t)0x00000002)        /*!< Bit 1 */
#define  FLASH_ACR_LATENCY_2                 ((uint32_t)0x00000004)        /*!< Bit 2 */
antongus commented 7 years ago

Да уж, зоопарк какой-то. Неужели им трудно было добавить в название конкретики:

FLASH_ACR_LATENCY_2_WS

или

FLASH_ACR_LATENCY_BIT_2

? Впрочем, это риторический вопрос :)