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

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

Сообщение VladislavS »

А как же всё понятно с первого взгляда? :)
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Вы инициализируете неизвестную платформу неизвестным образом. Что именно должно быть понятно? Что вы без постановки задачи вносите какие-то "альтернативные" ошибки? Так это ваша проблема, как и ранее.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

На мой взгляд ошибка слишком очевидна.

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

RCC->PLLCFGR = (
   0 * RCC_PLLCFGR_PLLSRC_HSI  |
   1 * RCC_PLLCFGR_PLLSRC_HSE  |

   0 * RCC_PLLCFGR_PLLQ_0      |
   0 * RCC_PLLCFGR_PLLQ_1      |
   1 * RCC_PLLCFGR_PLLQ_2      |
   0 * RCC_PLLCFGR_PLLQ_3      |
   
   1 * RCC_PLLCFGR_PLLP_div2   |
   0 * RCC_PLLCFGR_PLLP_div4   |
   0 * RCC_PLLCFGR_PLLP_div6   |
   0 * RCC_PLLCFGR_PLLP_div8   |
       
   0 * RCC_PLLCFGR_PLLN_0      |
   0 * RCC_PLLCFGR_PLLN_1      |
   0 * RCC_PLLCFGR_PLLN_2      |
   0 * RCC_PLLCFGR_PLLN_3      |
   0 * RCC_PLLCFGR_PLLN_4      |
   1 * RCC_PLLCFGR_PLLN_5      |
   0 * RCC_PLLCFGR_PLLN_6      |
   0 * RCC_PLLCFGR_PLLM_7      |
   0 * RCC_PLLCFGR_PLLN_8      |

   0 * RCC_PLLCFGR_PLLM_0      |
   0 * RCC_PLLCFGR_PLLM_1      |
   1 * RCC_PLLCFGR_PLLN_2      |
   0 * RCC_PLLCFGR_PLLM_3      |
   0 * RCC_PLLCFGR_PLLM_4      |
   0 * RCC_PLLCFGR_PLLM_5
 );
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Продолжайте.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Почему затихли авторы бредового "непотребства" и "слишком очевидных ошибок" ?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

А вы ошибки нашли? Сколько времени понадобилось? А если не знали что в коде есть ошибки, сразу бы их обнаружили про просмотре кода?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

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

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

Сообщение 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      */
  );
Все дифайны и комментарии выдираются, форматируются и подаются в удобной для дальнейшей ручной подгонки форме. Поклонники волшебных чисел, разумеется, не оценят, но мне показалось вполне употребимым. Покрутил на разных заголовочных файлах и разных регистрах, вроде формируется все правильно.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение 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

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

a5021

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

Так что, и в новых камнях, всё может быть.. :dont_know:
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

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

Сообщение Reflector »

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

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

a5021

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

Сообщение a5021 »

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

Сообщение dosikus »

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

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

a5021

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

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

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

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

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

Сообщение a5021 »

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

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

Попробовал на другом камушке 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....
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

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

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

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

Что касаемо случая с F407, то условие было явно обнаружено. Когда речь пойдёт о высоконадёжном коде, то эти 9 строк могут растянуться и на 30! И даже больше.
Хотите - пишите в одну строку :)
Контактная информация:
Ответить

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