STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

a5021, подгорает? Я три дня за вами скакал, чтобы сказать как вы мне безразличны? Отобрали победу в упражнении "последнее слово за мной" ввиду неявки соперника ? :)

Мурик, извини, подставил тебя, но это лишний раз показывает "прозрачность" кода. А представь, в таком стиле не один регистр записан, а все!
Реклама
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3493949#p3493949"]a5021, подгорает? Я три дня за вами скакал, чтобы сказать как вы мне безразличны? Отобрали победу в упражнении "последнее слово за мной" ввиду неявки соперника ? :)[/uquote]
У вас довольно причудливые фантазии. Лучше бы на вопросы ответили по поводу вашего аутентичного бреда.
Мурик, извини, подставил тебя, но это лишний раз показывает "прозрачность" кода. А представь, в таком стиле не один регистр записан, а все!
Кем он так записан и почему? В силу каких подвижек сознания могли образоваться такие искажения окружающей действительности? Даже крайние криворучки вполне могут перенести копипастой дифайны из заголовочного файла без ошибок. Какая нелегкая так надругалась над двумя славными программерами, что они не в состоянии без ошибок скопировать несколько строк?

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

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

import sys, re
(p, q, d, t, pad, rxp) = (0, 0, [], sys.argv[1].split('->'), lambda a, b, c : (len(a[1]) if len(a[1]) > b else b, len(a[0]) if len(a[0]) > c else c), re.compile(r'//.*?(\r\n?|\n)|/\*.*?\*/'))
for line in sys.stdin:
    if line.find(t[0] + "_" + t[1]) != -1:
       w = line.split()
       if w[0] == "#define" and  not w[1].endswith("_Pos"):
          s = rxp.search(line)
          w[0] = s.group(0).replace("!<", " ").rstrip(' \t\n\r\*\/') if s else "/* "
          d.append((w[1], w[0]));
          (p, q) = pad(w, p, q)
for x in d:
    print(" ", sys.argv[1] + " = (\n  " if x[0] == d[0][0]  else "", " 0 *", x[0].ljust(p), "| " + x[1].ljust(q + 1) + "*/" if x[0] != d[-1][0] else "  " + x[1].ljust(q + 1) + "*/" + "\n  );")
Это скрипт на питоне. Двенадцать строк на все про все. Со стандартного ввода он берет содержимое CMSIS файла для соответствующего МК STM32. Также в командной строке указывается регистр, инициализацию которого надлежит сформировать. Например, для получения кода инициализации регистра SPI->CR1 для STM32F103xb вызов скрипта должен выглядеть так:
reg_init.py "SPI->CR1" < Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h
код на выходе при этом получится такой:
Спойлер

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

  SPI->CR1 = (
    0 * SPI_CR1_CPHA_Msk     | /*  0x00000001                          */
    0 * SPI_CR1_CPHA         | /*  Clock Phase                         */
    0 * SPI_CR1_CPOL_Msk     | /*  0x00000002                          */
    0 * SPI_CR1_CPOL         | /*  Clock Polarity                      */
    0 * SPI_CR1_MSTR_Msk     | /*  0x00000004                          */
    0 * SPI_CR1_MSTR         | /*  Master Selection                    */
    0 * SPI_CR1_BR_Msk       | /*  0x00000038                          */
    0 * SPI_CR1_BR           | /*  BR[2:0] bits (Baud Rate Control)    */
    0 * SPI_CR1_BR_0         | /*  0x00000008                          */
    0 * SPI_CR1_BR_1         | /*  0x00000010                          */
    0 * SPI_CR1_BR_2         | /*  0x00000020                          */
    0 * SPI_CR1_SPE_Msk      | /*  0x00000040                          */
    0 * SPI_CR1_SPE          | /*  SPI Enable                          */
    0 * SPI_CR1_LSBFIRST_Msk | /*  0x00000080                          */
    0 * SPI_CR1_LSBFIRST     | /*  Frame Format                        */
    0 * SPI_CR1_SSI_Msk      | /*  0x00000100                          */
    0 * SPI_CR1_SSI          | /*  Internal slave select               */
    0 * SPI_CR1_SSM_Msk      | /*  0x00000200                          */
    0 * SPI_CR1_SSM          | /*  Software slave management           */
    0 * SPI_CR1_RXONLY_Msk   | /*  0x00000400                          */
    0 * SPI_CR1_RXONLY       | /*  Receive only                        */
    0 * SPI_CR1_DFF_Msk      | /*  0x00000800                          */
    0 * SPI_CR1_DFF          | /*  Data Frame Format                   */
    0 * SPI_CR1_CRCNEXT_Msk  | /*  0x00001000                          */
    0 * SPI_CR1_CRCNEXT      | /*  Transmit CRC next                   */
    0 * SPI_CR1_CRCEN_Msk    | /*  0x00002000                          */
    0 * SPI_CR1_CRCEN        | /*  Hardware CRC calculation enable     */
    0 * SPI_CR1_BIDIOE_Msk   | /*  0x00004000                          */
    0 * SPI_CR1_BIDIOE       | /*  Output enable in bidirectional mode */
    0 * SPI_CR1_BIDIMODE_Msk | /*  0x00008000                          */
    0 * SPI_CR1_BIDIMODE       /*  Bidirectional data mode enable      */
  );
Все дифайны и комментарии выдираются, форматируются и подаются в удобной для дальнейшей ручной подгонки форме. Поклонники волшебных чисел, разумеется, не оценят, но мне показалось вполне употребимым. Покрутил на разных заголовочных файлах и разных регистрах, вроде формируется все правильно.
Реклама
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Пока парсил CMSIS файлы, на глаза иногда попадались индусские перлы, типа таких:

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

typedef struct
{
  __IO uint32_t CR1;          /*!< SPI Control register 1,                             Address offset: 0x00 */
  __IO uint32_t CR2;          /*!< SPI Control register 2,                             Address offset: 0x04 */
  __IO uint32_t CFG1;         /*!< SPI Status register,                                Address offset: 0x08 */
  __IO uint32_t CFG2;         /*!< SPI Status register,                                Address offset: 0x0C */
  __IO uint32_t IER;          /*!< SPI data register,                                  Address offset: 0x10 */
  __IO uint32_t SR;           /*!< SPI data register,                                  Address offset: 0x14 */
  __IO uint32_t IFCR;         /*!< SPI data register,                                  Address offset: 0x18 */
  uint32_t      RESERVED0;    /*!< SPI data register,                                  Address offset: 0x1C */
  __IO uint32_t TXDR;         /*!< SPI data register,                                  Address offset: 0x20 */
  uint32_t      RESERVED1[3]; /*!< Reserved, 0x24-0x2C                                                      */
  __IO uint32_t RXDR;         /*!< SPI data register,                                  Address offset: 0x30 */
  uint32_t      RESERVED2[3]; /*!< Reserved, 0x34-0x3C                                                      */
  __IO uint32_t CRCPOLY;     /*!< SPI data register,                                   Address offset: 0x40 */
  __IO uint32_t TXCRC;       /*!< SPI data register,                                   Address offset: 0x44 */
  __IO uint32_t RXCRC;       /*!< SPI data register,                                   Address offset: 0x48 */
  __IO uint32_t UDRDR;       /*!< SPI data register,                                   Address offset: 0x4C */
  __IO uint32_t I2SCFGR;      /*!< SPI data register,                                  Address offset: 0x50 */

} SPI_TypeDef;
это из Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h753xx.h

На второй строке комментариев силы покинули неизвестного индуса и он начал копипастить что попало. Регистров данных набралось в итоге чуть больше, чем дофига.
Это еще хорошо, что ихние индусы копипастят не внося грубых ошибок в код. Не то, что специалисты на здешнем форуме. :)
Аватара пользователя
Мяукните!
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 20, 2015 14:00:32
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Мяукните! »

a5021

У меня на F407 делители шин запускались, если только их по одному прописывать. Побитно.

Так что, и в новых камнях, всё может быть.. :dont_know:
Реклама
Эиком - электронные компоненты и радиодетали
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

В документации от производителя это где-то указывается? Откуда вы почерпнули эту "последовательную" методику?
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="Мяукните!",url="/forum/viewtopic.php?p=3495764#p3495764"]У меня на F407 делители шин запускались, если только их по одному прописывать. Побитно.[/uquote]
Все там нормально с делителями, можно все за раз установить и не только их.
Реклама
Аватара пользователя
Мяукните!
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 20, 2015 14:00:32
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Мяукните! »

a5021

Методом "научного тыка". Если за один раз целым регистром загрузить, делители не стартовали....
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

речь про RCC->PLLCFGR ?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Мяукните, перестаньте из чуши легенды складывать. Вам же могут поверить нубы.
Изучайте - http://mcu.goodboard.ru/viewtopic.php?id=11
Аватара пользователя
Мяукните!
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 20, 2015 14:00:32
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Мяукните! »

a5021

Регистр RCC_CFGR. Только он. Единственный )

Добавлено after 24 minutes 47 seconds:
p.s. немного материалов по теме.

На хабре, когда афтар брал мой код, очевидно его проверил!

Практика раздельной установки регистра RCC_CFGR просматривается и в других камушках. Но это уже си, проверить нет никакой возможности...

У меня только ассемблер :)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Испытываю некоторый скепсис по поводу вами сказанного. Если операции необходимо выполнять в какой-то последовательности, то такая последовательность должна быть описана явным образом в документации. С другой стороны, конфигурацию задавать допустимо только для выключенного PLL и кто бы мне объяснил в чем волшебство пораздельного переключения делителей, если блок в останове?
Аватара пользователя
Мяукните!
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 20, 2015 14:00:32
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Мяукните! »

Попробовал на другом камушке 407 серии. Не на дискавери. Код выполнялся из RAM. Частота ядра 280 МГц.

Работает! Код можно сократить до 3 строк.

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

	LDR R1, [R0, RCC_CFGR]
	BIS R1, RCC_CFGR_HPRE_DIV1 + RCC_CFGR_PPRE2_DIV2 + RCC_CFGR_PPRE1_DIV4
	STR R1, [R0, RCC_CFGR]
С флешкой на 168МГц не пробовал. Лень.. :)

И потом, на этапе конфигурирования камня, не стоит всё лепить в одну строку. Нет смысла экономить каждую фемтосекунду. Лучше растягивать действия на несколько строк и хорошенько описывать их. В будущем, будет легче понять, что делается на этапе подъёма камня.

Кстати, AS для ARM не позволяет разбивать одну строку на несколько. Символ "\" работает только в ассемблере на AVR8....
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="Мяукните!",url="/forum/viewtopic.php?p=3496780#p3496780"]И потом, на этапе конфигурирования камня, не стоит всё лепить в одну строку. Нет смысла экономить каждую фемтосекунду. Лучше растягивать действия на несколько строк[/uquote]
Чем лучше-то? Вот вы, например, уже дорастягивались до удивительных результатов.
и хорошенько описывать их.
Хорошенько описывать и делать массу бессмысленных действий -- это существенно разные занятия.
Аватара пользователя
Мяукните!
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 20, 2015 14:00:32
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Мяукните! »

В исходниках на запуск AM3358 был найден удивительный код, который показался сверх-излишним. Казалось, делается куча ненужных телодвижений. Но всё приходит с опытом. Поэтому в своих проектах я использовал подход, скопированный с исходников на си.

Что касаемо случая с F407, то условие было явно обнаружено. Когда речь пойдёт о высоконадёжном коде, то эти 9 строк могут растянуться и на 30! И даже больше.
Хотите - пишите в одну строку :)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Вроде это не GD32 и цена довольно интересная. По даташиту оно на stm32f103c8t6 вполне походит.

Изображение

Никто не в курсе, что это за чудо природы?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

А у меня не ищется на али по таким данным...
А не нашлось, единственный продован с нулем продаж по сабжу и с 5ю жалобами на другие.

Мяукните, ваш неудачный опыт в кодинге на асме, это лишь ваши неудачи и неболее. Не баги в камнях и не какая-то там ахинея...
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Я бы не придал значения, какие там китайцы какой самобытной хренью торгуют, если бы не история с продвинутым клоном атмеги328 от этого же продавца. У меня нет никаких подтверждений, но не ровен час, что и с этим CS32 может выйти похожая история.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

a5021, не я пока пасс. Сейчас перевожу мануал на HC32, затем на очереди SYNWIT...
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Загадаю присутствующим загадку: почему в таком обработчике

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

void TIM4_IRQHandler(void) {
  TIM4->SR = ~TIM_SR_UIF;
  GPIOA->ODR ^= 1;
}
блинк мигает, а в таком

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

void TIM4_IRQHandler(void) {
  GPIOA->ODR ^= 1;
  TIM4->SR = ~TIM_SR_UIF;
}
нет? :)

PS. Строки абсолютно идентичные, просто идут в разной последовательности. F103, если что.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3501529#p3501529"]Загадаю присутствующим загадку[/uquote]
Придумай что-то поинтереснее, такие загадки на каком-то из форумов соответствующей тематики наверно каждую неделю разгадывают, на этой была тема на easyelectronics :)
Ответить

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