История изменений
Исправление 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 этого нет.