Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 11:37:38

Какая-то фигня непонятная творится у меня с STM32F407. Пытаюсь инициализировать HSE, изначально это была static inline функция, но для отладки сделал обычной:
Код:
#define WAITWHILE(x)  do{StartUpCounter = 0; while((x) && (++StartUpCounter < 0xffffff)){nop();} if(StartUpCounter == 0xffffff) return 0;}while(0)
int StartHSE(){ // fVCO can be from 192 to 432MHz
    __IO uint32_t StartUpCounter = 0;
    RCC->CR = (RCC->CR & ~RCC_CR_PLLON) | RCC_CR_HSEON; // disable PLL to reconfigure, enable HSE
    WAITWHILE(!(RCC->CR & RCC_CR_HSERDY));
    /* Enable high performance mode, System frequency up to 168 MHz */
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    PWR->CR |= PWR_CR_VOS;
    // HCLK = SYSCLK, PCLK1 = HCLK/4, PCLK2 = HCLK/2
    RCC->CFGR = (RCC->CFGR & ~(RCC_CFGR_HPRE | RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2)
                 ) | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE1_DIV4 | RCC_CFGR_PPRE2_DIV2;
    /* Configure the main PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
    RCC->CR |= RCC_CR_PLLON; // Enable PLL
    // Wait till PLL is ready
    WAITWHILE(!(RCC->CR & RCC_CR_PLLRDY));
    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
    FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
    // Select PLL as system clock source
    RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL;
    // Wait till PLL is used as system clock source
    WAITWHILE((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
    return 1;
}

Ну и "блинк" простой сделал (пока тупо с циклом с nop). Если запускаю без отладчика, оно виснет внутри StartHSE. Ставлю точку останова на main, а затем выполняю пошагово - все ОК, инициализация проходит и continue мигает свеодиодом. Другой вариант пробовал с systick - аналогично виснет на вызове функции SysTick_Config…
Как такое может быть?

Да, если не вызывать эту StartHSE или SysTick_Config, то светодиодом моргает.

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 13:51:25

оно виснет внутри StartHSE.
Что значит "виснет"? Зацикливается на какой-то инструкции? Какой? Или в HardFault уходит?

Вижу в коде устанавливается VOS, но ожидания VOS_RDY не вижу.

аналогично виснет на вызове функции SysTick_Config…
Аналогично, что значит "виснет"? Внутри функции нет циклов. Он в DefaultHandler уходит? SysTick_Config включает прерывание таймера, проверяй что обработчик правильно установлен, SCB->VTOR на таблицу векторов указывает, стек на месте. Если делитель SysTick неправильно настроить, то он будет так часто в прерывание входить, что будет полное ощущение "зависания".

Советы:
- сделать ожидание VOS_RDY или для начала на 144 МГц запустить
- выкинуть все эти WAITWHILE, ими потом можно обвешать
- проверь правильность заполнения таблицы векторов прерывания, конкретно SysTick_Handler
- проверь содержимое делителя SysTick, мог выйти за его разрядность
- проверь SCB->VTOR и SP
- включи Flash prefetch
- ожидание RCC_CFGR_SWS в конце не нужно
- StartUpCounter не нужно делать __IO, в цикле есть обращение к __IO регистру RCC->CR. nop, соответственно, тоже не нужен.
- упрости код и пользуйся отладчиком по назначению, а не просто шагать

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 13:58:08

сделать ожидание VOS_RDY или для начала на 144 МГц запустить

Отключения PLL тоже нужно дожидаться, иначе его не переконфигурируешь. Скорее всего он и так отключен, но раз в коде отключается, то все может быть...

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 14:16:22

Он его "выключает" одновременно с включением HSE. Ну может, конечно, от HSI был PLL раньше запущен, но... А уж выключиться PLL точно раньше, чем HSE стартанёт.

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 14:24:55

А уж выключиться PLL точно раньше, чем HSE стартанёт.

Ну да, разве что HSE уже был запущен до этого.

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 15:09:22

VladislavS, что-то оно у меня даже тупым "блинком" перестало выполняться: постоянно перезапускается main. Чертовщина какая-то.
В пошаговом режиме вручную светодиодом мигаю, а вот стоит в gdb написать 'continue', как уходит в зависон, а по ctrl+c на list выдает вроде
Код:
Line number 106 out of range; blink.c has 105 lines.

Проверил SCB->VTOR: дичь в нем какая-то…
Поставил правильное значение, запускаю - бдыщь, hardfault.
Почему-то у меня при старте SCB->VTOR=0, поэтому не вызывается reset_handler. Если вызываю вручную, то все инициализируется и работает.

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 15:56:18

Почему-то у меня при старте SCB->VTOR=0
Потому что при старте flash отзеркалена на 0, это нормально. В принципе, VTOR надо писать когда что-то нестандартное, типа отладки из SRAM, работе после загрузчика. Для блинка его трогать не надо.

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 16:18:15

Ну, тогда вообще непонятно: сразу из reset_handler уходит в hardfault, а делаю я там совсем немного:
Код:
void WEAK __attribute__ ((noreturn)) reset_handler(void){
  extern char _sdata;    // .data section start
  extern char _edata;    // .data section end
  extern char _sbss;     // .bss  section start
  extern char _ebss;     // .bss  section end
  extern char _ldata;    // .data load address

  char *dst = &_sdata;
  char *src = &_ldata;

  SCB->VTOR = FLASH_BASE;

  /* FPU settings ----------*/
  #if (__FPU_PRESENT == 1)
    SCB->CPACR = 0x0f << 20 ;  /* set CP10 and CP11 Full Access */
    nop();
    __DSB();
    __ISB();
  #else
  #pragma message("FPU not present")
  #endif

  while ( dst < &_edata ) { *dst++ = *src++; }
  for ( dst = &_sbss; dst < &_ebss; dst++ ) { *dst = 0; }

  main();

  for(;;) {}
}

(запихал на всякий случай изменение значения VTOR). А если я из hardfault_handler делаю jump в reset_handler, то внезапно работает…

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 16:50:02

поэтому не вызывается reset_handler.
Проверяй. Голубой - адрес стека. Зелёный Reset_Handler. Чёрный SysTick_Handler. Сравнивай с тем что в .map-файле.
Изображение
table.png
(21.05 KiB) Скачиваний: 469


Добавлено after 13 minutes 25 seconds:
А если я из hardfault_handler делаю jump в reset_handler, то внезапно работает…
Проверь, что у тебя секция таблицы векторов прерываний одинаково в стартапе и линкерскрипте называется.

Добавлено after 17 minutes 29 seconds:
Кстати, а где ты так искусно FPU научился включать? Такой версии я ещё не видел. В Cortex®-M4 programming manual вот так про SCB->CPACR написано.
И в этом же документе вот такой перл
Индусы из STM не сильно дальше ушли.
Код:
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
Твой вариант уже почти разумный, только nop, dsb и isb даром не нужны. Ты через сколько тысяч тактов от включения начнёшь fpu пользовать?

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 17:06:41

Странно: у меня в бинарнике reset_handler имеет адрес 0x080002c9, а в map-файле — 0x080002c8.
Секция vector_table в стартапе и линкере одинаково называется.
Кстати, а где ты так искусно FPU научился включать?

Это как раз "оптимизировал" 3<<20 | 3<<22. Да, согласен, там всякие нопы не нужны.

Закомментировал копирование инициализированных переменных, как внезапно - бац, и заработало!
Видимо, все-таки где-то у меня косяк в линкер-скрипте (хотя я взял тот же, что и для F0-1-3, только добавил секцию для ccram). Вот:
Код:
ENTRY(reset_handler)

SECTIONS {
  .vector_table 0x08000000 :
  {
    _sisrvectors = .;
    KEEP(*(.vector_table))
    /* ASSERT(. == _isrvectors_tend, "The vector table needs to be 84 elements long!"); */
    _eisrvectors = .;
  } >rom

  .text :
  {
    . = ALIGN(4);
    _stext = .;
    *(.text*)
    *(.rodata*)
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    KEEP (*(.init))
    KEEP (*(.fini))
    . = ALIGN(4);
    _etext = .;
  } >rom

  .ARM.extab :
  {
    *(.ARM.extab* .gnu.linkonce.armextab.*)
  } >rom
 
  .ARM : {
    *(.ARM.exidx*)
  } >rom

  .data :
  {
    . = ALIGN(4);
    _sdata = .;
    *(.data*)
    . = ALIGN(4);
    _edata = .;
  } >ram AT >rom

  .myvars :
  {
    . = ALIGN(2048);
    __varsstart = ABSOLUTE(.);
    KEEP(*(.myvars))
  } > rom

  _ldata = LOADADDR(.data);

  .ccmram :
  {
    . = ALIGN(4);
    _sccmram = .;
    *(.ccmram)
    *(.ccmram*)
    . = ALIGN(4);
    _eccmram = .;
  } >ccmram AT> rom

  .bss :
  {
    . = ALIGN(4);
    _sbss = .;
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
    _ebss = .;
  } >ram
}

PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram));


И для конкретного ZGT6:
Код:
MEMORY
{
    rom (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
    ccmram (rwx) : ORIGIN = 0x10000000, LENGTH = 64K
}
INCLUDE stm32f4.ld

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 17:15:56

Странно: у меня в бинарнике reset_handler имеет адрес 0x080002c9, а в map-файле — 0x080002c8.
Изображение
Надо просто систему команд хотя бы краем глаза почитать :)

Закомментировал копирование инициализированных переменных, как внезапно - бац, и заработало!
Ну вот тут как раз отладчиком и посмотреть что-куда копируется.

изображение_2022-12-27_171140958.png
(88.86 KiB) Скачиваний: 409

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 17:33:45

Блин, нафиг, послезавтра попробую продолжить. Вообще дошло до маразма: после make flash светодиодиком моргает, а как reset нажимаю - нет. Т.е. по команде сброса через JTAG оно перескакивает на reset_handler, а по нажатию кнопочки reset почему-то отваливается в хардфолт.

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 17:37:56

Ножкa boot0?

Re: Stm32 с чего начать изучение...

Вт дек 27, 2022 17:40:33

Ножкa boot0?

Ааааа! Как я этого мог не заметить? Джампер неправильно стоял! Жесть-то какая.
И с систиком заработало.
Спасибо!

Re: Stm32 с чего начать изучение...

Ср дек 28, 2022 15:05:11

VladislavS, вот, кстати, стал код причесывать и заметил, что зачем-то я, вслед за народом из интернета, устанавливаю бит VOS:
Код:
PWR->CR |= PWR_CR_VOS;

хотя по умолчанию он уже установлен и его, наоборот, надо сбрасывать, если нужно низкое потребление.
Странно это: зачем все друг за другом повторяют ненужную операцию?

Re: Stm32 с чего начать изучение...

Ср дек 28, 2022 16:16:26

Мне предлагается на строне всех выступить? :)

ЗЫ: Есть вероятность вызова подобных функций не только после включения питания, а там уже все зависит...

ЗЗЫ: Я первоначальную настройку тактовой частоты делаю в SystemInit, которая вызывается только после ресета, где подобных неоднозначностей не может возникнуть.

Re: Stm32 с чего начать изучение...

Чт дек 29, 2022 09:32:40

Код:
PWR->CR |= PWR_CR_VOS;

хотя по умолчанию он уже установлен и его, наоборот, надо сбрасывать, если нужно низкое потребление.
Странно это: зачем все друг за другом повторяют ненужную операцию?

Насколько я понимаю, от диапазонов напряжений зависит максимальная частота. То есть если хочется гарантировано получить максимальную производительность на старте, лучше его (и подобные биты) все же выставить. Мало ли откуда на ресет попасть можно, и мало ли какие биты были выставлены раньше.

Re: Stm32 с чего начать изучение...

Пт дек 30, 2022 08:59:49

Мало ли откуда на ресет попасть можно, и мало ли какие биты были выставлены раньше.

Я тут глянул Option bytes на F303 и охренел: ведь "мало ли, кто что туда записал"! А там можно и watchdog вместо аппаратного софтовый сделать (нафиг оно нужно - ноль же смысла!), и проверку четности RAM включить (вообще бесполезная фича, зато памяти на ~четверть меньше).
Вообще, это свинство со стороны ST — заводить такие "option bytes". Еще чуть-чуть, и получится убогая аврка с ее "фьюзами", когда неправильным программированием можно превратить МК в кирпич. Благо хоть у ST'шных чипов эту дрянь можно стереть - а у аврок "окирпичивание" безвозвратно…

// самая ржака, когда приходят к тебе "синие таблетки", в которые прошит элементарный blink, а прошивка залочена! Вот же долбанутые ублюдки!

P.S. А есть ли вообще в мире вменяемые микроконтроллеры, где никаких уровней блокировки флеша производителем не предусмотрено? Или все вокруг - твари и сволочи???

Re: Stm32 с чего начать изучение...

Пт дек 30, 2022 10:04:34

Благо хоть у ST'шных чипов эту дрянь можно стереть - а у аврок "окирпичивание" безвозвратно…
Стесьняюсь спросить, а про "read protection Level 2" ты что-нибудь слышал/читал?

P.S. А есть ли вообще в мире вменяемые микроконтроллеры, где никаких уровней блокировки флеша производителем не предусмотрено?
Есть контроллеры вообще без flash, всё на внешней.

Или все вокруг - твари и сволочи???
В зеркало давно смотрелся?

Re: Stm32 с чего начать изучение...

Пт дек 30, 2022 10:31:13

Стесьняюсь спросить, а про "read protection Level 2" ты что-нибудь слышал/читал?

Почитал. Жесть-то какая! Только полный мудак мог такое придумать!!!
Ответить