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

STM32F105RBT6, PLL не запускается от HSE

Не могу понять в чем причина. HSI через PLL все работает. HSE (8мГц) напрямую, без PLL работает. HSE через PLL, на этапе "LL_FLASH_SetLatency(LL_FLASH_LATENCY_1);" уходит  в Error_Handler().

void SystemClock_Config(void)
{

  LL_FLASH_SetLatency(LL_FLASH_LATENCY_1);

  if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1)
  {
    Error_Handler();  
  }
  LL_RCC_HSE_Enable();

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


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

Попробуй так. И на 72 МГц  LATENCY = 2 надо использовать.

  // Настройка FLASH
  FLASH->ACR = FLASH_ACR_PRFTBE | _VAL2FLD(FLASH_ACR_LATENCY,2);
  
  // ------------------ Тактирование -------------------------
  RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON; //Включаем HSE = 8 МГц
  while(!(RCC->CR & RCC_CR_HSERDY));  
  //Задаём источники тактирования и прескалеры 
  // SYSCLK = 72 МГц, USB = 48 МГц, PCLK1 = 36 МГц, PCLK2 = 72 МГц,  ADC = 12 МГц
  RCC->CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC |
              RCC_CFGR_ADCPRE_DIV6 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_HSE;
  RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSEON | RCC_CR_PLLON; //Включаем PLL, Выключаем HSI
  while(!(RCC->CR & RCC_CR_PLLRDY)); 
  //Переключаемся на PLL с установленнными ранее прескалерами
  RCC->CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC |
              RCC_CFGR_ADCPRE_DIV6 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;

 

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


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

У меня аналогичный порядок действий (на примере Hardware = stm32f1):

...
Hardware::Flash::initialize();
Hardware::Clock::initialize();

Hardware::Clock::HSE::setQuartzFrequencyHz(HSE_FREQUENCY_HZ);
Hardware::Clock::HSE::enable();
Hardware::Clock::HSE::waitForReady();

Hardware::Clock::PLL::setClockSource(HSE);
Hardware::Clock::PLL::setMultiplier(CORE_FREQUENCY_MHZ / HSE_FREQUENCY_MHZ);
Hardware::Clock::PLL::enable();
Hardware::Clock::PLL::waitForReady();
Hardware::Clock::PLL::setAsClockSource();

Hardware::Flash::setLatency();
...

Перед настройкой (пока работаем на HSI) при вызове Flash::initialize() устанавливается максимальный WS, а после переключения на PLL, уже вызываю Flash::setLatency(), чтобы "скорректировать" WS на правильный.

Нужное значение автоматом рассчитывается в зависимости от текущей частоты.

В PLL::setAsClockSource() перед переключением заранее автоматом настраиваются предделители шин APBx, в зависимости от максимально разрешенных.

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


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

Латентность флэша надо переключать до того, как запустились работать от PLL со свистом. 

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


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

10 minutes ago, ViKo said:

Латентность флэша надо переключать до того, как запустились работать от PLL со свистом. 

Судя по исходнику, именно так и делает ТС.

По-хорошему и предделители периферийных шин нужно настраивать до переключения на PLL.

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


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

14 minutes ago, set bit said:

единственное что не записывается в FLASH->ACR в LATENCY и PRFTBE. 

 

Quote

Latetency can be modified only when ACC64 is set

FLASH->ACR |= FLASH_ACR_ACC64

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


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

21 minutes ago, VladislavS said:

Вы что-то путаете.

FLASH_ACR.thumb.png.314c23c57a33f76a8ba1755c6fdcc3db.png

Да, виноват! Подумал обсуждаем STM32L1 серию.
@set bit , прошу прощения что ввел в заблуждение! Значит должно работать))
 

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


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

set_bit, у тебя даже начальное состояние неправильное. Там 0x00000030 при включении питания должно быть. Да и с нулём LATENCY чип не будет на 72 МГц работать. Точно у тебя отладчик FLASH_ACR по адреcу 0x40022000 читает?

fl_lat.thumb.png.2fcfc038f90240e3302886ba8c74dbf6.png

 

ЗЫ: Что-то я заработался :) На 72 МГц надо два цикла ожидания ставить. А это по даташиту 

FLASH->ACR = FLASH_ACR_PRFTBE | _VAL2FLD(FLASH_ACR_LATENCY,2);

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


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

Отладчик, читает правильно. Если ни чего не получиться оставлю как есть, пусай на 24мгц работает.

 

2018-12-22_17-16-00.png

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


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

После включения питания во FLASH_ACR не ноль! Что у тебя перед этим кодом ещё выполняется? SystemInit() есть? С RCC_AHBENR что-нибудь делаешь?

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


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

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;

#ifdef STM32F10X_CL
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= (uint32_t)0xEBFFFFFF;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;

9 minutes ago, VladislavS said:

RCC_AHBENR

Не трогаю.

С микроконтроллером F100RBT все нормальна было, с этим странности.

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


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

SystemInit() можешь смело зачистить и вставить туда мой код. Его индус в горячке писал. Заодно инициализацию остального железа там же сделать, чтобы на main() выйти с инициализированным железом и думать только об основном алгоритме программы.

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


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

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

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

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

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

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

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

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

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

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