[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3704433#p3704433"]
VladislavS, а потом начинаются вопросы о том, что не работает.[/uquote]Только почему-то, почитаешь форум и 9 из 10 вопросов имеет классический вид: вот моя грязная портянка на HAL/SPL/LL (нужное подчеркнуть) почему-то не работает.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3704433#p3704433"]Потому что человек не заглянул в какой-то ERRATA[/uquote]При этом о существовании errata и вовсе не подозревают. Да я и не припомню на форуме хоть одну тему, где проблема вопрошающего была бы из errata.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3704433#p3704433"]или пропустил сноску в даташит,[/uquote]Такое бывает, но с опытом обычно проходит. Намного чаще попадаются не читавшие RM вовсе.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3704433#p3704433"]а рабочий пример из SPL он, следуя подобным рекомендациям удалил.[/uquote]Я краем глаза видел код
Reflector. От рекомендации ему пользоваться SPL я чуть со смеху не умер.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3704433#p3704433"]И заголовочные файлы SPL тоже нередко полезны и богаты комментариями.[/uquote]Лишней информации, конечно, не бывает, но лучше потратить время на RM и отладчик.
Добавлено after 1 hour 45 minutes 36 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3704491#p3704491"]но даже банальный запуск тактирования всего, что нужно, напоминает закат Солнца вручную -[/uquote]Вообще изи. Заходишь в куб, там есть схема тактирования, натыкиваешь в ней нужную конфигурацию
Спойлер
Затем открываешь RM и пишешь по типовому шаблону.
Например, для F427
Спойлер
Код: Выделить всё
// Настройка FLASH
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;
// ------------------ Тактирование -------------------------
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON; //Включаем HSE = 8 MHz
while(!(RCC->CR & RCC_CR_HSERDY)); //Ждём включения HSE
//Задаём источники тактирования и прескалеры SYSCLK = 168 МГц USB = 48 МГц
RCC->PLLCFGR = _VAL2FLD(RCC_PLLCFGR_PLLQ,7) | RCC_PLLCFGR_PLLSRC_HSE | RCC_PLLCFGR_PLLP_div2 |
_VAL2FLD(RCC_PLLCFGR_PLLN,168) | _VAL2FLD(RCC_PLLCFGR_PLLM,4);
RCC->CFGR = RCC_CFGR_MCO2_HSE | RCC_CFGR_MCO2PRE_div1 | RCC_CFGR_MCO1PRE_div1 | RCC_CFGR_I2SSRC_PLLI2S | RCC_CFGR_MCO1_HSE |
RCC_CFGR_PPRE2_DIV2 | RCC_CFGR_PPRE1_DIV4 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_HSI;
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON | RCC_CR_PLLON; //Включаем PLL
while(!(RCC->CR & RCC_CR_PLLRDY)); //Ждём включения PLL
//Переключаемся на PLL с установленнными ранее прескалерами
RCC->CFGR = RCC_CFGR_MCO2_HSE | RCC_CFGR_MCO2PRE_div1 | RCC_CFGR_MCO1PRE_div1 | RCC_CFGR_I2SSRC_PLLI2S | RCC_CFGR_MCO1_HSE |
RCC_CFGR_PPRE2_DIV2 | RCC_CFGR_PPRE1_DIV4 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSEON | RCC_CR_PLLON; //Выключаем HSI
Или для F303
Спойлер
Код: Выделить всё
// Настройка 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
while(!(RCC->CR & RCC_CR_HSERDY)); //Ждём включения HSE
//Задаём источники тактирования и прескалеры
RCC->CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_I2SSRC_SYSCLK | RCC_CFGR_USBPRE_DIV1_5 | RCC_CFGR_PLLMUL9 |
RCC_CFGR_PLLXTPRE_HSE_PREDIV_DIV2 | //Раскомментировать для кварца 16 МГц
RCC_CFGR_PLLSRC_HSE_PREDIV | 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_PLLON | RCC_CR_HSEON; //Включим PLL, выключим HSI
while(!(RCC->CR & RCC_CR_PLLRDY)); //Ждём включения PLL
//Переключаемся на PLL с установленнными ранее прескалерами
RCC->CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_I2SSRC_SYSCLK | RCC_CFGR_USBPRE_DIV1_5 | RCC_CFGR_PLLMUL9 |
RCC_CFGR_PLLXTPRE_HSE_PREDIV_DIV2 | //Раскомментировать для кварца 16 МГц
RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;
Или зтёртый до дыр F103
Спойлер
Код: Выделить всё
// Настройка 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
while(!(RCC->CR & RCC_CR_HSERDY)); //Ждём пока запустится HSE
//Задаём источники тактирования и прескалеры
// SYSCLK = 72 МГц, USB = 48 МГц, PCLK1 = 36 МГц, PCLK2 = 72 МГц, ADC = 12 МГц
RCC->CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_USBPRE_1d5 | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_ADCPRE_DIV6 |
//RCC_CFGR_PLLXTPRE | // Раскомментировать для кварца 16 МГц
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
//Переключаемся на PLL с установленнными ранее прескалерами
RCC->CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_USBPRE_1d5 | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_ADCPRE_DIV6 |
//RCC_CFGR_PLLXTPRE | // Раскомментировать для кварца 16 МГц
RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;
Или простенький L053
Спойлер
Код: Выделить всё
// Настройка FLASH
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY;
// ------------------ Тактирование -------------------------
RCC->CR = RCC_CR_MSION | RCC_CR_HSION; //Включим HSI16
while(!(RCC->CR&RCC_CR_HSIRDY));
RCC->CFGR = RCC_CFGR_MCOPRE_DIV1 | RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_PLLDIV2 | RCC_CFGR_PLLMUL4 | RCC_CFGR_PLLSRC_HSI |
RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV1 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_HSI;
RCC->CR = RCC_CR_HSION | RCC_CR_PLLON; //Включим PLL, выключим MSI
while(!(RCC->CR&RCC_CR_PLLRDY));
RCC->CFGR = RCC_CFGR_MCOPRE_DIV1 | RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_PLLDIV2 | RCC_CFGR_PLLMUL4 | RCC_CFGR_PLLSRC_HSI |
RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV1 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;
и т.д. ...
Всё по одному принципу. Делается один раз для нового чипа, а потом CTRL-C CTRL-V из проекта в проект.