LINUX.ORG.RU

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

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

у меня сложилось впечатление, что криворукие создавали и сам контроллер (использую stm32f446ze).

Вот кусок кода для stm32l4xx для полноты картины:

/*STM32L4 errata par. 2.2.10*/
#define RET_IRQ_MSP 0xFFFFFFF9

extern void Reset_Handler(void);
extern uint32_t _sflash;
extern uint32_t _estack;
static uint32_t * const new_sp = &_estack - 9; /*Need at least 8 words*/
/*---------------------------------------------------------------------------*/
static inline void _setup_new_stack(void)
{
    new_sp[5] = RET_IRQ_MSP;             /*LR  (will use msp, LOL)*/
    new_sp[6] = (uint32_t)Reset_Handler; /*PC  (will return to reset)*/
    new_sp[7] = 0x01000000;              /*PSR (reset value)*/
}
/*---------------------------------------------------------------------------*/
void HardFault_Handler(void)
{
    if ((_sflash != (uint32_t)&_estack) || *(&_sflash + 1) != (uint32_t)Reset_Handler)
    {
        /*Setup new stack and return to Reset_Handler with MSP used!!!*/

        __set_MSP((uint32_t)new_sp);
        __asm__ __volatile__ (
                "isb        \n\t"
                "dsb        \n\t"
                "ldr sp, =%0\n\t"
                "isb        \n\t"
                "dsb        \n\t"
                "ldr lr, =%1\n\t"
                "isb        \n\t"
                "dsb        \n\t"
                ::"i"(new_sp), "i"(RET_IRQ_MSP):);

        _setup_new_stack();

        __asm__ __volatile__(
                "isb       \n\t"
                "dsb       \n\t"
                "bx lr     \n\t"
                :::);
    }

    NVIC_SystemReset();
}

Источник тактовой частоты идёт на два делителя, а от них на разную периферию расходится. По умолчанию делители настроены каждый по своему. Из-за этого приходится гадать, почему одинаково настроенный ШИМ в двух таймерах работает по разному. Зачем эти делители вообще нужны? Почему нельзя было использовать напрямую тактовую частоту в таймере? Или уж один делитель на все таймеры.

Всегда сам пишу инициализацию системы тактирования так, как мне надо, плюс использую clock security system, в SystemInit от ST этого нет.

Исходная версия shkolnick-kun, :

Источник тактовой частоты идёт на два делителя, а от них на разную периферию расходится. По умолчанию делители настроены каждый по своему. Из-за этого приходится гадать, почему одинаково настроенный ШИМ в двух таймерах работает по разному. Зачем эти делители вообще нужны? Почему нельзя было использовать напрямую тактовую частоту в таймере? Или уж один делитель на все таймеры.

Всегда сам пишу инициализацию системы тактирования так, как мне надо, плюс использую clock security system, в SystemInit от ST этого нет.