Цитата(scifi @ Nov 4 2015, 16:56)

А мне нравится регистры программировать...
И мне.

Это для STM32F3xx:
CODE
void System_init(void)
{
/* Задать полный доступ к сопроцессору(-ам) CP10, CP11 */
SCB->CPACR = 3UL << 10 * 2 | 3UL << 11 * 2;
/* Задать работу от HSI, включить HSE */
RCC->CR |=
RCC_CR_HSION | // HSI clock enable: On
RCC_CR_HSEON | // HSE clock enable: On
RCC_CR_HSEBYP; // HSE crystal oscillator bypass
RCC->CFGR =
RCC_CFGR_SW_0 * 0 | // System clock Switch: HSI
RCC_CFGR_HPRE_0 * 0 | // AHB prescaler: SYSCLK not divided
RCC_CFGR_PPRE1_0 * 0 | // APB1 prescaler: HCLK not divided
RCC_CFGR_PPRE2_0 * 4 | // APB2 prescaler: HCLK / 2
RCC_CFGR_PLLSRC * 1 | // PLL entry clock source: HSE PREDIV1
RCC_CFGR_PLLXTPRE * 0 | // HSE divider for PLL entry: not divided
RCC_CFGR_PLLMUL_0 * 7 | // PLL multiplication factor: x 9 (72 MHz)
RCC_CFGR_USBPRE * 0 | // USB prescaler: PLL / 1.5 (48 MHz)
RCC_CFGR_I2SSRC * 0 | // I2S external clock source selection: System clock
RCC_CFGR_MCO_0 * 5 | // Microcontroller Clock Output: HSI
RCC_CFGR_PLLNODIV * 0; // PLL is not divided to MCO: divided
/* Запретить и сбросить все запросы прерываний */
RCC->CIR =
RCC_CIR_LSIRDYIE * 0 | // LSI Ready Interrupt Enable
RCC_CIR_LSERDYIE * 0 | // LSE Ready Interrupt Enable
RCC_CIR_HSIRDYIE * 0 | // HSI Ready Interrupt Enable
RCC_CIR_HSERDYIE * 0 | // HSE Ready Interrupt Enable
RCC_CIR_PLLRDYIE * 0 | // PLL Ready Interrupt Enable
RCC_CIR_LSIRDYC * 1 | // LSI Ready Interrupt Clear
RCC_CIR_LSERDYC * 1 | // LSE Ready Interrupt Clear
RCC_CIR_HSIRDYC * 1 | // HSI Ready Interrupt Clear
RCC_CIR_HSERDYC * 1 | // HSE Ready Interrupt Clear
RCC_CIR_PLLRDYC * 1 | // PLL Ready Interrupt Clear
RCC_CIR_CSSC * 1; // Clock Security System Interrupt Clear
/* Пределитель для PLL (младший бит совпадает с RCC_CFGR_PLLXTPRE)
предделитель для АЦП */
RCC->CFGR2 =
RCC_CFGR2_PREDIV_0 * 0 | // HSE input to PLL not divided
RCC_CFGR2_ADCPRE12_0 * 16 | // ADC12 PLL clock divided by 1 = 72 MHz
// RCC_CFGR2_ADCPRE34_0 * 16 | // ADC34 PLL clock divided by 1 = 72 MHz
// RCC_CFGR2_ADCPRE12_0 * 0 | // ADC12 clock disabled, can use AHB clock
RCC_CFGR2_ADCPRE34_0 * 0; // ADC34 clock disabled, can use AHB clock
/* Пределитель для U(S)ART, I2C, TIM */
RCC->CFGR3 =
RCC_CFGR3_USART1SW_0 * 0 | // PCLK selected as USART1 clock source
RCC_CFGR3_I2C1SW * 1 | // PCLK selected as I2C1 clock
RCC_CFGR3_I2C2SW * 1 | // PCLK clock selected as I2C2 clock
RCC_CFGR3_TIM1SW * 0 | // PCLK2 clock
RCC_CFGR3_TIM8SW * 0 | // PCLK2 clock
RCC_CFGR3_USART2SW_0 * 0 | // PCLK selected as USART2 clock source
RCC_CFGR3_USART3SW_0 * 0 | // PCLK selected as USART3 clock source
RCC_CFGR3_UART4SW_0 * 0 | // PCLK selected as UART4 clock source
RCC_CFGR3_UART5SW_0 * 0; // PCLK selected as UART5 clock source
/* Ждать, пока включится HSE генератор. Включить PLL и защиту от сбоев */
while (!(RCC->CR & RCC_CR_HSERDY));
RCC->CR |=
RCC_CR_PLLON | // PLL enable
RCC_CR_CSSON; // Clock Security System enable
/* Разрешить буфер предвыборки, установить латентность */
FLASH->ACR =
FLASH_ACR_LATENCY_0 * 2 | // Two wait states
FLASH_ACR_HLFCYA * 0 | // Flash Half Cycle Access Enable
FLASH_ACR_PRFTBE * 1; // Prefetch buffer enable
/* Ждать, пока появится готовность PLL */
while (!(RCC->CR & RCC_CR_PLLRDY));
/* Выбрать PLL как источник системной частоты
Ждать, пока PLL выберется как источник системной частоты */
RCC->CFGR |=
RCC_CFGR_SW_0 * 2; // System clock Switch: HSI -> PLL
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
/* Выключить внутренний генератор HSI */
// RCC->CR &= ~RCC_CR_HSION;
}