set bit 0 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба Не могу понять в чем причина. 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(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба Попробуй так. И на 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба У меня аналогичный порядок действий (на примере 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, в зависимости от максимально разрешенных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба Латентность флэша надо переключать до того, как запустились работать от PLL со свистом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба 10 minutes ago, ViKo said: Латентность флэша надо переключать до того, как запустились работать от PLL со свистом. Судя по исходнику, именно так и делает ТС. По-хорошему и предделители периферийных шин нужно настраивать до переключения на PLL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
set bit 0 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба VladislavS. Код заработал, единственное что не записывается в FLASH->ACR в LATENCY и PRFTBE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба Вы что-то путаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
set bit 0 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба что то мешает осуществить запись. Сложности какие та с МК STM32F105RB, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба 21 minutes ago, VladislavS said: Вы что-то путаете. Да, виноват! Подумал обсуждаем STM32L1 серию.@set bit , прошу прощения что ввел в заблуждение! Значит должно работать)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба set_bit, у тебя даже начальное состояние неправильное. Там 0x00000030 при включении питания должно быть. Да и с нулём LATENCY чип не будет на 72 МГц работать. Точно у тебя отладчик FLASH_ACR по адреcу 0x40022000 читает? ЗЫ: Что-то я заработался :) На 72 МГц надо два цикла ожидания ставить. А это по даташиту FLASH->ACR = FLASH_ACR_PRFTBE | _VAL2FLD(FLASH_ACR_LATENCY,2); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
set bit 0 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба Отладчик, читает правильно. Если ни чего не получиться оставлю как есть, пусай на 24мгц работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба После включения питания во FLASH_ACR не ноль! Что у тебя перед этим кодом ещё выполняется? SystemInit() есть? С RCC_AHBENR что-нибудь делаешь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
set bit 0 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба ; 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 все нормальна было, с этим странности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 22 декабря, 2018 Опубликовано 22 декабря, 2018 · Жалоба SystemInit() можешь смело зачистить и вставить туда мой код. Его индус в горячке писал. Заодно инициализацию остального железа там же сделать, чтобы на main() выйти с инициализированным железом и думать только об основном алгоритме программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться