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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Какая-то фигня непонятная творится у меня с 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, то светодиодом моргает.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344097#p4344097"]оно виснет внутри StartHSE.[/uquote]Что значит "виснет"? Зацикливается на какой-то инструкции? Какой? Или в HardFault уходит?

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

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344097#p4344097"]аналогично виснет на вызове функции SysTick_Config…[/uquote]Аналогично, что значит "виснет"? Внутри функции нет циклов. Он в 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, соответственно, тоже не нужен.
- упрости код и пользуйся отладчиком по назначению, а не просто шагать
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4344160#p4344160"]сделать ожидание VOS_RDY или для начала на 144 МГц запустить[/uquote]
Отключения PLL тоже нужно дожидаться, иначе его не переконфигурируешь. Скорее всего он и так отключен, но раз в коде отключается, то все может быть...
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Он его "выключает" одновременно с включением HSE. Ну может, конечно, от HSI был PLL раньше запущен, но... А уж выключиться PLL точно раньше, чем HSE стартанёт.
Реклама
Эиком - электронные компоненты и радиодетали
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4344170#p4344170"]А уж выключиться PLL точно раньше, чем HSE стартанёт.[/uquote]
Ну да, разве что HSE уже был запущен до этого.
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

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. Если вызываю вручную, то все инициализируется и работает.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344207#p4344207"]Почему-то у меня при старте SCB->VTOR=0[/uquote]Потому что при старте flash отзеркалена на 0, это нормально. В принципе, VTOR надо писать когда что-то нестандартное, типа отладки из SRAM, работе после загрузчика. Для блинка его трогать не надо.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Ну, тогда вообще непонятно: сразу из 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, то внезапно работает…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344207#p4344207"]поэтому не вызывается reset_handler.[/uquote]Проверяй. Голубой - адрес стека. Зелёный Reset_Handler. Чёрный SysTick_Handler. Сравнивай с тем что в .map-файле.
Изображение
table.png
(21.05 КБ) 633 скачивания
Добавлено after 13 minutes 25 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344272#p4344272"]А если я из hardfault_handler делаю jump в reset_handler, то внезапно работает…[/uquote]Проверь, что у тебя секция таблицы векторов прерываний одинаково в стартапе и линкерскрипте называется.

Добавлено after 17 minutes 29 seconds:
Кстати, а где ты так искусно FPU научился включать? Такой версии я ещё не видел. В Cortex®-M4 programming manual вот так про SCB->CPACR написано.
СпойлерИзображение
изображение_2022-12-27_164243121.png
(68.49 КБ) 190 скачиваний
И в этом же документе вот такой перл
СпойлерИзображение
изображение_2022-12-27_164442248.png
(40.98 КБ) 169 скачиваний
Индусы из 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 пользовать?
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Странно: у меня в бинарнике 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
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344311#p4344311"]Странно: у меня в бинарнике reset_handler имеет адрес 0x080002c9, а в map-файле — 0x080002c8.[/uquote]Изображение
Надо просто систему команд хотя бы краем глаза почитать :)

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344311#p4344311"]Закомментировал копирование инициализированных переменных, как внезапно - бац, и заработало![/uquote]Ну вот тут как раз отладчиком и посмотреть что-куда копируется.
изображение_2022-12-27_171140958.png
(88.86 КБ) 572 скачивания
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Блин, нафиг, послезавтра попробую продолжить. Вообще дошло до маразма: после make flash светодиодиком моргает, а как reset нажимаю - нет. Т.е. по команде сброса через JTAG оно перескакивает на reset_handler, а по нажатию кнопочки reset почему-то отваливается в хардфолт.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Ножкa boot0?
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4344339#p4344339"]Ножкa boot0?[/uquote]
Ааааа! Как я этого мог не заметить? Джампер неправильно стоял! Жесть-то какая.
И с систиком заработало.
Спасибо!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

VladislavS, вот, кстати, стал код причесывать и заметил, что зачем-то я, вслед за народом из интернета, устанавливаю бит VOS:

Код: Выделить всё

PWR->CR |= PWR_CR_VOS;
хотя по умолчанию он уже установлен и его, наоборот, надо сбрасывать, если нужно низкое потребление.
Странно это: зачем все друг за другом повторяют ненужную операцию?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

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

ЗЗЫ: Я первоначальную настройку тактовой частоты делаю в SystemInit, которая вызывается только после ресета, где подобных неоднозначностей не может возникнуть.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4344854#p4344854"]

Код: Выделить всё

PWR->CR |= PWR_CR_VOS;
хотя по умолчанию он уже установлен и его, наоборот, надо сбрасывать, если нужно низкое потребление.
Странно это: зачем все друг за другом повторяют ненужную операцию?[/uquote]
Насколько я понимаю, от диапазонов напряжений зависит максимальная частота. То есть если хочется гарантировано получить максимальную производительность на старте, лучше его (и подобные биты) все же выставить. Мало ли откуда на ресет попасть можно, и мало ли какие биты были выставлены раньше.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4345225#p4345225"]Мало ли откуда на ресет попасть можно, и мало ли какие биты были выставлены раньше.[/uquote]
Я тут глянул Option bytes на F303 и охренел: ведь "мало ли, кто что туда записал"! А там можно и watchdog вместо аппаратного софтовый сделать (нафиг оно нужно - ноль же смысла!), и проверку четности RAM включить (вообще бесполезная фича, зато памяти на ~четверть меньше).
Вообще, это свинство со стороны ST — заводить такие "option bytes". Еще чуть-чуть, и получится убогая аврка с ее "фьюзами", когда неправильным программированием можно превратить МК в кирпич. Благо хоть у ST'шных чипов эту дрянь можно стереть - а у аврок "окирпичивание" безвозвратно…

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

P.S. А есть ли вообще в мире вменяемые микроконтроллеры, где никаких уровней блокировки флеша производителем не предусмотрено? Или все вокруг - твари и сволочи???
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4345707#p4345707"]Благо хоть у ST'шных чипов эту дрянь можно стереть - а у аврок "окирпичивание" безвозвратно…[/uquote]Стесьняюсь спросить, а про "read protection Level 2" ты что-нибудь слышал/читал?

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4345707#p4345707"]P.S. А есть ли вообще в мире вменяемые микроконтроллеры, где никаких уровней блокировки флеша производителем не предусмотрено?[/uquote]Есть контроллеры вообще без flash, всё на внешней.

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4345707#p4345707"]Или все вокруг - твари и сволочи???[/uquote]В зеркало давно смотрелся?
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Стесьняюсь спросить, а про "read protection Level 2" ты что-нибудь слышал/читал?
Почитал. Жесть-то какая! Только полный мудак мог такое придумать!!!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Ответить

Вернуться в «ARM»