STM32 новичку в ARM что к чему
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
- Реклама
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Вы инициализируете неизвестную платформу неизвестным образом. Что именно должно быть понятно? Что вы без постановки задачи вносите какие-то "альтернативные" ошибки? Так это ваша проблема, как и ранее.
- Сообщения: 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
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Почему затихли авторы бредового "непотребства" и "слишком очевидных ошибок" ?
- Реклама
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
А вы ошибки нашли? Сколько времени понадобилось? А если не знали что в коде есть ошибки, сразу бы их обнаружили про просмотре кода?
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
a5021, подгорает? Я три дня за вами скакал, чтобы сказать как вы мне безразличны? Отобрали победу в упражнении "последнее слово за мной" ввиду неявки соперника ? 
Мурик, извини, подставил тебя, но это лишний раз показывает "прозрачность" кода. А представь, в таком стиле не один регистр записан, а все!
Мурик, извини, подставил тебя, но это лишний раз показывает "прозрачность" кода. А представь, в таком стиле не один регистр записан, а все!
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3493949#p3493949"]a5021, подгорает? Я три дня за вами скакал, чтобы сказать как вы мне безразличны? Отобрали победу в упражнении "последнее слово за мной" ввиду неявки соперника ?
[/uquote]
У вас довольно причудливые фантазии. Лучше бы на вопросы ответили по поводу вашего аутентичного бреда.
Тут мне подумалось, что нельзя инвалидов умственного труда бросать в трудную минуту. Если у вас трясутся руки, двоится в глазах, звенит в ушах и мысли с глухим стуком бьются друг об друга, что копирование нескольких строк представляет непосильную задачу, то предлагаю воспользоваться специальным протезом когнитивных способностей, что я для вас только что сваял на коленке:
Это скрипт на питоне. Двенадцать строк на все про все. Со стандартного ввода он берет содержимое CMSIS файла для соответствующего МК STM32. Также в командной строке указывается регистр, инициализацию которого надлежит сформировать. Например, для получения кода инициализации регистра SPI->CR1 для STM32F103xb вызов скрипта должен выглядеть так:
Все дифайны и комментарии выдираются, форматируются и подаются в удобной для дальнейшей ручной подгонки форме. Поклонники волшебных чисел, разумеется, не оценят, но мне показалось вполне употребимым. Покрутил на разных заголовочных файлах и разных регистрах, вроде формируется все правильно.
У вас довольно причудливые фантазии. Лучше бы на вопросы ответили по поводу вашего аутентичного бреда.
Кем он так записан и почему? В силу каких подвижек сознания могли образоваться такие искажения окружающей действительности? Даже крайние криворучки вполне могут перенести копипастой дифайны из заголовочного файла без ошибок. Какая нелегкая так надругалась над двумя славными программерами, что они не в состоянии без ошибок скопировать несколько строк?Мурик, извини, подставил тебя, но это лишний раз показывает "прозрачность" кода. А представь, в таком стиле не один регистр записан, а все!
Тут мне подумалось, что нельзя инвалидов умственного труда бросать в трудную минуту. Если у вас трясутся руки, двоится в глазах, звенит в ушах и мысли с глухим стуком бьются друг об друга, что копирование нескольких строк представляет непосильную задачу, то предлагаю воспользоваться специальным протезом когнитивных способностей, что я для вас только что сваял на коленке:
Спойлер
Код: Выделить всё
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 );")
код на выходе при этом получится такой: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
Пока парсил CMSIS файлы, на глаза иногда попадались индусские перлы, типа таких:
это из Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h753xx.h
На второй строке комментариев силы покинули неизвестного индуса и он начал копипастить что попало. Регистров данных набралось в итоге чуть больше, чем дофига.
Это еще хорошо, что ихние индусы копипастят не внося грубых ошибок в код. Не то, что специалисты на здешнем форуме.
Код: Выделить всё
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;На второй строке комментариев силы покинули неизвестного индуса и он начал копипастить что попало. Регистров данных набралось в итоге чуть больше, чем дофига.
Это еще хорошо, что ихние индусы копипастят не внося грубых ошибок в код. Не то, что специалисты на здешнем форуме.
- Сообщения: 63
- Зарегистрирован: Пн апр 20, 2015 14:00:32
a5021
У меня на F407 делители шин запускались, если только их по одному прописывать. Побитно.
Так что, и в новых камнях, всё может быть..
У меня на F407 делители шин запускались, если только их по одному прописывать. Побитно.
Так что, и в новых камнях, всё может быть..
NXP i.MX7D на чистом ассемблере
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
В документации от производителя это где-то указывается? Откуда вы почерпнули эту "последовательную" методику?
- Сообщения: 63
- Зарегистрирован: Пн апр 20, 2015 14:00:32
a5021
Методом "научного тыка". Если за один раз целым регистром загрузить, делители не стартовали....
Методом "научного тыка". Если за один раз целым регистром загрузить, делители не стартовали....
NXP i.MX7D на чистом ассемблере
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Мяукните, перестаньте из чуши легенды складывать. Вам же могут поверить нубы.
Изучайте - http://mcu.goodboard.ru/viewtopic.php?id=11
Изучайте - 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 просматривается и в других камушках. Но это уже си, проверить нет никакой возможности...
У меня только ассемблер
Регистр RCC_CFGR. Только он. Единственный )
Добавлено after 24 minutes 47 seconds:
p.s. немного материалов по теме.
На хабре, когда афтар брал мой код, очевидно его проверил!
Практика раздельной установки регистра RCC_CFGR просматривается и в других камушках. Но это уже си, проверить нет никакой возможности...
У меня только ассемблер
NXP i.MX7D на чистом ассемблере
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Испытываю некоторый скепсис по поводу вами сказанного. Если операции необходимо выполнять в какой-то последовательности, то такая последовательность должна быть описана явным образом в документации. С другой стороны, конфигурацию задавать допустимо только для выключенного PLL и кто бы мне объяснил в чем волшебство пораздельного переключения делителей, если блок в останове?
- Сообщения: 63
- Зарегистрирован: Пн апр 20, 2015 14:00:32
Попробовал на другом камушке 407 серии. Не на дискавери. Код выполнялся из RAM. Частота ядра 280 МГц.
Работает! Код можно сократить до 3 строк.
С флешкой на 168МГц не пробовал. Лень.. 
И потом, на этапе конфигурирования камня, не стоит всё лепить в одну строку. Нет смысла экономить каждую фемтосекунду. Лучше растягивать действия на несколько строк и хорошенько описывать их. В будущем, будет легче понять, что делается на этапе подъёма камня.
Кстати, AS для ARM не позволяет разбивать одну строку на несколько. Символ "\" работает только в ассемблере на AVR8....
Работает! Код можно сократить до 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]
И потом, на этапе конфигурирования камня, не стоит всё лепить в одну строку. Нет смысла экономить каждую фемтосекунду. Лучше растягивать действия на несколько строк и хорошенько описывать их. В будущем, будет легче понять, что делается на этапе подъёма камня.
Кстати, AS для ARM не позволяет разбивать одну строку на несколько. Символ "\" работает только в ассемблере на AVR8....
NXP i.MX7D на чистом ассемблере
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="Мяукните!",url="/forum/viewtopic.php?p=3496780#p3496780"]И потом, на этапе конфигурирования камня, не стоит всё лепить в одну строку. Нет смысла экономить каждую фемтосекунду. Лучше растягивать действия на несколько строк[/uquote]
Чем лучше-то? Вот вы, например, уже дорастягивались до удивительных результатов.
Чем лучше-то? Вот вы, например, уже дорастягивались до удивительных результатов.
Хорошенько описывать и делать массу бессмысленных действий -- это существенно разные занятия.и хорошенько описывать их.
- Сообщения: 63
- Зарегистрирован: Пн апр 20, 2015 14:00:32
В исходниках на запуск AM3358 был найден удивительный код, который показался сверх-излишним. Казалось, делается куча ненужных телодвижений. Но всё приходит с опытом. Поэтому в своих проектах я использовал подход, скопированный с исходников на си.
Что касаемо случая с F407, то условие было явно обнаружено. Когда речь пойдёт о высоконадёжном коде, то эти 9 строк могут растянуться и на 30! И даже больше.
Хотите - пишите в одну строку
Что касаемо случая с F407, то условие было явно обнаружено. Когда речь пойдёт о высоконадёжном коде, то эти 9 строк могут растянуться и на 30! И даже больше.
Хотите - пишите в одну строку
NXP i.MX7D на чистом ассемблере


