LINUX.ORG.RU

История изменений

Исправление Eddy_Em, (текущая версия) :

SysTick не умеет генерить ШИМ. А ему нужен ШИМ, чтобы полностью аппаратно мигать светодиодом. Еще можно через DMA менять частоту — тогда будет прикольная псевдорандомная мигалка.

Что-то вроде такого:

static inline void tim1_setup(){
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
    TIM1->PSC = 8;  // 8MHz
    TIM1->ARR = 99; // 100 ticks for 80kHz
    TIM1->CCR1 = 49; // 50%
    // PWM mode 1 (active->inactive)
    TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
    // main output
    TIM1->BDTR = TIM_BDTR_MOE;
    // main PWM output
    TIM1->CCER = TIM_CCER_CC1E;
    // turn it on
    TIM1->CR1 = TIM_CR1_CEN;
    TIM1->EGR |= TIM_EGR_UG; // generate update event to refresh all
}

Естественно, здесь нет ничего сложного, так что в асм перевести - дело плевое.

Исправление Eddy_Em, :

SysTick не умеет генерить ШИМ. А ему нужен ШИМ, чтобы полностью аппаратно мигать светодиодом. Еще можно через DMA менять частоту — тогда будет прикольная псевдорандомная мигалка.

Что-то вроде такого:

static inline void tim1_setup(){
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
    TIM1->PSC = 8;  // 8MHz
    TIM1->ARR = 99; // 100 ticks for 80kHz
    TIM1->CCR1 = 49; // 50%
    // PWM mode 1 (active->inactive)
    TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
    // main output
    TIM1->BDTR = TIM_BDTR_MOE;
    // main PWM output
    TIM1->CCER = TIM_CCER_CC1E;
    // turn it on
    TIM1->CR1 = TIM_CR1_CEN;
    TIM1->EGR |= TIM_EGR_UG; // generate update event to refresh all
}

Исходная версия Eddy_Em, :

SysTick не умеет генерить ШИМ. А ему нужен ШИМ, чтобы полностью аппаратно мигать светодиодом. Еще можно через DMA менять частоту — тогда будет прикольная псевдорандомная мигалка.