Pingvin писал(а):
И что у нас с системой тактирования?
Как настраивается?
Здесь не так как у atmega 

 . По умолчанию практически все тактирование отключено и надо каждый раз ручками подключать тактирование портов и другой периферии. В принципе, если мигать научились 

 , то с этим Вы уже разобрались. Внутренний тактовый генератор на 8МГц настраивается не сложно:
Код:
RCC->CR|=RCC_CR_HSION; // Включить генератор HSI.
   while(!(RCC->CR & RCC_CR_HSIRDY))
   {} // Ожидание готовности HSI.
   RCC->CFGR &=~RCC_CFGR_SW; // Очистить биты SW0, SW1.
   RCC->CFGR |= RCC_CFGR_SW_HSI; // Выбрать HSI для тактирования SW0=1
Если ли же настроить от кварца, то в примере, что выше все HSI поменяйте на HSE  

 . Но это примитивная настройка...там необходимо включить службу для определения отказа кварца и переключится на внутренний источник тактирования...на эту тему надо курить даташит, при этом там столько настроек, что укуришься быстро 
 
 А вот так настраивается ШИМ:
Код:
void initPWM()
{
   RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // подключение тактирования таймера 2
   TIM2->ARR = 800;
   TIM2->CCR1 = 1000;
   TIM2->CCMR1 |= TIM_CCMR1_OC1PE; // включение регистра предзагрузки сравнения для канала 1
   TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // режим ШИМ №1(110)
   TIM2->CR1 |= TIM_CR1_ARPE; // включение регистра предзагрузки автоперезагрузки
   TIM2->CCER |= TIM_CCER_CC1E; // включение выхода захвата/сравнения канала 1
   TIM2->CR1 |= TIM_CR1_CEN; // включение счетчика
        TIM2->EGR |= TIM_EGR_UG;
}