КРАМ, так я выше именно из gdb данные и привел после старта.
Вот, повторю:
Код: Выделить всё
(gdb) p /x *RCC
$21 = {CR = 0x3030500, ICSCR = 0x408c, CFGR = 0x12, PLLCFGR = 0x10010803, RESERVED0 = 0x0, RESERVED1 = 0x0, CIER = 0x0, CIFR = 0x0, CICR = 0x0, IOPRSTR = 0x0, AHBRSTR = 0x0, APBRSTR1 = 0x0, APBRSTR2 = 0x0, IOPENR = 0x4,
AHBENR = 0x100, APBENR1 = 0x10000000, APBENR2 = 0x0, IOPSMENR = 0x2f, AHBSMENR = 0x51301, APBSMENR1 = 0xff7e4c33, APBSMENR2 = 0x17d801, CCIPR = 0x0, RESERVED2 = 0x0, BDCR = 0x0, CSR = 0x1c000000}
Меня с такими темпами уволят нахер...

Можно подумать, реальный человек сможет это осилить быстрей (особенно когда еще 100500 других дел есть: ведь помимо МК у меня еще телескопы с их системами управления, обработкой данных, долбаными вебмордами и прочей)!
Добавлено after 1 minute 16 seconds:
VladislavS, вот, блин! Я сам в свой код не смотрю. Написал же в комментах: "R=2..8, Q=2..8, P=2..32; N=8..86, M=1..8". Блин, вот же ST нарукожопили, так нарукожопили!!! Спасибо, проверяю.
Ага, заработало, как надо! Но вот сделать минимальное значение этих P/R/Q двойкой мог только наглый засранец ☺
Там еще и вот такой косяк: "after /M fvco should be 2.66..16", т.е. для кварца 8МГц M может быть только 1..3. Получается, что для G0 с USB придется частоты AHB и APB выставлять в 36МГц.
Добавлено after 8 minutes 19 seconds:
В общем, вот такой код инициализации тактирования получается:
Код: Выделить всё
#define WAITWHILE(x) do{StartUpCounter = 0; while((x) && (++StartUpCounter < 0xffffff)){nop();}}while(0)
TRUE_INLINE void StartHSEHSI(int isHSE){
uint32_t StartUpCounter;
RCC->CR &= ~RCC_CR_PLLON; // disable PLL
WAITWHILE(RCC->CR & RCC_CR_PLLRDY); // wait while PLL on
if(isHSE){
RCC->CR |= RCC_CR_HSEON;
WAITWHILE(!(RCC->CR & RCC_CR_HSERDY)); // wait while HSE isn't on
}else RCC->CR |= RCC_CR_HSION;
RCC->APBENR1 |= RCC_APBENR1_PWREN;
// Enable high performance mode
PWR->CR1 = PWR_CR1_VOS_0;
WAITWHILE(PWR->SR2 & PWR_SR2_VOSF);
if(isHSE){
RCC->PLLCFGR = ((PLLR-1)<<29) | ((PLLQ-1)<<25) | ((PLLP-1)<<17) | (PLLN<<8) | ((PLLM-1)<<4)
| RCC_PLLCFGR_PLLREN | RCC_PLLCFGR_PLLPEN /* | RCC_PLLCFGR_PLLQEN */
| RCC_PLLCFGR_PLLSRC_HSE;
}else{ // 64MHz from HSI16
RCC->PLLCFGR = (8<<8) | (1<<4)
| RCC_PLLCFGR_PLLREN | RCC_PLLCFGR_PLLPEN /* | RCC_PLLCFGR_PLLQEN */
| RCC_PLLCFGR_PLLSRC_HSI;
}
RCC->CR |= RCC_CR_PLLON;
WAITWHILE(!(RCC->CR & RCC_CR_PLLRDY));
FLASH->ACR |= FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_LATENCY_1;
RCC->CFGR = RCC_CFGR_SW_1; // set sysclk switch to pll
}
#define StartHSE() do{StartHSEHSI(1);}while(0)
#define StartHSI() do{StartHSEHSI(0);}while(0)
Выложил весь код
на гитхаб. Теперь можно побаловаться с UART. Надеюсь, с этим делом проще будет.