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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 25503
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4350650#p4350650"]А еще точнее, что я-то знаю ответ, потому и назвал такое решение костыльным.[/uquote]
Я готов извиниться, если вы озвучите свое знание и оно не окажется фейком или иной интерпретацией мною сказанного...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

ARV, ни в коем случае нельзя начинать изучение STM32 с калокуба. Ну это ж как та же самая абдуриносреда — высер для убогих, которым хочется "тяп-ляп - и в продакшн". Ты же вроде как с AVR вполне себе работаешь и сам должен понимать, чем вменяемая разработка под AVR отличается от быдлокода в абдуриносреде.
Ну так калокуб — как та же абдурина (если не хуже)!
Для начала можно скачать на гитхабе готовые простые примеры, которые можно найти по фразе "bare metal" или "CMSIS". Если видишь там гору директорий и всякие hal_*, spl_*, system_init* и т.п., то сразу закрывай вкладку — это УГ, с которого ничему не научишься.

Добавлено after 2 minutes 14 seconds:
P.S. Для отладки достаточно в Makefile добавить:

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

openocd:
    openocd -f openocd.cfg
dbg:
    arm-none-eabi-gdb $(ELF) -ex 'target remote localhost:3333' -ex 'monitor reset halt'
И потом спокойно

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

make openocd &
make dbg
Конфиг под заданный камень можно и не кидать локально, а указывать глобально: /usr/share/openocd/scripts/target/ и т.д.

Добавлено after 5 minutes 53 seconds:
VladislavS, а что насчет I2C через DMA под STM32G070? Может, там какой-то секрет есть?
Я вот вообще не вижу в документации, что нужно явно после записи выставлять STOP, как у F103, но у меня и чтение не запускается. В настройке I2C DMA указал:

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

I2C1->CR1 = I2C_CR1_PE | I2C_CR1_RXDMAEN | I2C_CR1_TXDMAEN;
Потом перед записью или чтением вызываю настройку DMA:

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

static void i2cDMAsetup(int tx, uint8_t len){
    if(tx){
        DMA1_Channel1->CCR = DMATXCCR;
        DMA1_Channel1->CPAR = (uint32_t) &I2C1->TXDR;
        DMAMUX1_Channel0->CCR = 11;
    }else{
        DMA1_Channel1->CCR = DMARXCCR;
        DMA1_Channel1->CPAR = (uint32_t) &I2C1->RXDR;
        DMAMUX1_Channel0->CCR = 10;
    }
    DMA1_Channel1->CMAR = (uint32_t) I2Cbuf;
    DMA1_Channel1->CNDTR = i2cbuflen = len;
}
Выполняю базу (адресация и т.п.), а после START запускаю DMA:

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

uint8_t read_i2c_dma(uint8_t addr, uint8_t nbytes){
    if(nbytes < 1) return 0;
    while(I2Cbusy);
    i2cDMAsetup(0, nbytes);
    goterr = 0;
    if(!i2c_startr(addr, nbytes, 1)) return 0;
    DMA1_Channel1->CCR = DMARXCCR | DMA_CCR_EN; // start transfer
    return 1;
}
Пробовал DMA_CCR_EN и в начало запихивать, где инициализация DMA происходит - без результата. Тактирование DMA включено (таки у меня на нем же и USART работает).
И если в случае Tx хотя бы CNDTR в нуль сбрасывался (типа, что-то оно, может быть, и передавало - пока я без осцилла), а вот при Rx CNDTR так и сидит равным количеству запрошенных байт данных.
Сейчас чуть в отладчике поиграюсь, но таки документация совершенно невменяемая: для обычных чтения/записи даже картинки с алгоритмами нарисовали, а для DMA хрен пойми что, еще и фраза "The end of transfer is managed with the NBYTES counter" наводит на мысль, что прерывания по TC у DMA работать не будут и нужно будет контролировать по CNDTR…

Добавлено after 15 minutes 36 seconds:
Ахъ, рукожопие мое зело велико!
Все там работает, это я в одном месте, сбрасывая ошибки перед записью без DMA, не вернул флаги нужные. Опять в виде макроса сделал - усе ОК.
И прерывание отрабатывает, что позволяет устанавливать флаги готовности и сбрасывать флаги занятости. Прелесть!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):А чё так?
ну, чтобы начинающие знали, где им помогут, как смогут. просто если кто тут задаст вопрос, будет обосран, и только.
VladislavS писал(а):тоже мне секрет - GDB Server запустить
но ведь вы этого не посоветовали? значит, видимо, секрет...
Eddy_Em писал(а):ни в коем случае нельзя начинать изучение STM32 с калокуба
ну вот я успешно пишу под винду на free pascal, и при этом я не углубляюсь ни в регистры процессора, ни в устройство FAT32 или тем паче NTFS, и даже более того, использую готовые компоненты, чтобы тыкая мышкой в 2 клика сделать видеоплейер, например. если потребуется, я могу погрузиться и до уровня регистров и видеопотоков, но это "если потребуется" - для моих задач не требуется. то же самое и с кубом - сделать быстро и легко то, что забожалось. а когда захочется нетрадиционного секса - можно и твоим советам последовать
Eddy_Em писал(а):указывать глобально: /usr/share/openocd/scripts/target/ и т.д.
вот ты даже представить себе не можешь, что за пределами /usr есть жизнь, и этой жизни больше, чем в привычном тебе окружении... поэтому все твои советы и выглядят неуместно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

+ARV писал(а):
вопрос остался открытым: где искать?
Очевидно по имени колбэка и очевидно в обработчике. Обнаружив имя в обработчике, легко найти и само тело колбэка.
Странно, для меня очевидным местом поиска было "Руководство по HAL" соответствующей линейки МК. Только оно очень большое и без просмотра исходников HAL при попытках осмысленного использования вряд ли получится получить что-нибудь работающее.
Попробовать HAL, возможно, стОит, хотя бы для понимания, почему пользоваться регистрами выгодней. Простое сопоставление объёмов RM и HAL показывает, что они по объёму примерно равны, поэтому изучение настройки периферии через регистры по времени занимает примерно столько же времени, сколько чтение "Руководства.." для осмысленного использования HAL. Ещё заметь, что HAL в общем случае не обеспечивает переноса один-в-один кода с одного МК на другой. Поэтому рекомендую взять CubeIDE как настроенный искаропки набор инструментов, RM, DS- и в путь.
И ещё. Если надо, то нет никаких препятствий для заимствования из HAL драйвера нужной периферии.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[offtop]Просто упертых вендовозов я вообще людьми не считаю: ведь знают, что есть системы гораздо лучше и удобней, чем это УГ, но нет, продолжают жрать кактус![/offtop]
Кстати, SHT30, на котором я I2C тестирую, оказался на редкость пакостным засранцем: чуть что - "выходит из себя", подвешивая линию… Помогает только перезапуск его питания, я еще на несколько подобных убогих датчиков натыкался, которые всю линию гробят, если ты им неправильную команду дашь или еще что. В общем, надо на моей "нашлепке" для Orange Pi Zero+ предусмотреть еще и сброс питания датчиков, ведь за 17км каждый раз ездить, чтобы проводок тудым-сюдым - дурных нема. Ну и на всех железках с МК нужно подобное предусматривать, чтобы питание периферии была возможность включать/отключать.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ARV, вы что ли TIM1 в прерывании пытаетесь поморгать светодиодом?

Добавлено after 34 minutes 18 seconds:
Долго его ждать, я уже и там и там поморгал светодиодом, в CubeMX проект создал на HALе, в IARе открыл, через отладчик пропустил.
Код весит

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

  4'320 bytes of readonly  code memory
     30 bytes of readonly  data memory
  1'104 bytes of readwrite data memory
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Код весит
Ничего себе! Самый легкий "блинк", ЕМНИП, занимал около 16 байт прошивки!
Мой последний "блинк" под G0 (мыргает с интервалом в секунду, либо отбивает морзянкой 'SOS'):

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

   text    data     bss     dec     hex filename
    688     192    1176    2056     808 mk/blink.elf
Посмотри в настройках калокуба: может, там assert включен. Ну и у gcc/ld не забудь проверить:

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

CFLAGS      += -fno-common -ffunction-sections -fdata-sections
LDFLAGS     += -Wl,--gc-sections
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Eddy_Em писал(а):Посмотри в настройках калокуба: может, там assert включен. Ну и у gcc/ld не забудь проверить:
Х бы его знал куда тут тыкать.
В IARе в Optimizations Hight и Size стоит.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Dimon456 писал(а):Долго его ждать
так благодаря помогающим мне приходится подолгу ковыряться в коде и читать всякое, предварительно искать всякое... потому и долго ждать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

СпойлерИзображение Изображение
Вкладку Clock Configuration не трогать, все работает от 8МГц
Куда код вставлять
Спойлер

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

  /* USER CODE BEGIN 2 */  
  HAL_TIM_Base_Start_IT(&htim1);
  /* USER CODE END 2 */

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

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8);
    }
}
/* USER CODE END 4 */
Прерывания находятся в файле stm32f1xx_hal_tim.h почти в самом конце
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Дык, должны же быть опции компилятора! Я без понятия, как этот убогий софт компиляет без make, видимо, генерит какой-нибудь скрипт. Но для этого ступодово где-то в недрах должны быть настройки флагов компилятора и линкера.
Лучше всего самому Makefile написать, да пользоваться. У меня он постоянно совершенствуется, вот, с добавлением отладки уже 165 строчек получается…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ARV, в IARе есть"фишка", которая не доступна в некоторых других IDE. Проверьте в своей IDE.
В режиме отладки найдите что-то вроде CPU Registers (в некоторых случайх нужно выбрать Current CPU Registers). Найдите значение CYCLECOUNTER, которое равно количеству тактов, которое прошло с момента запуска программы.
Чтобы измерить время выполнения функции, сделайте на ней шаг отладчика без захода в тело функции (Step Over). Значение CCSTEP покажет разницу между началом выполнения шага и его завершением.
Если CYCLECOUNTER не обновляется, то попробуйте установить бит CYCCNTENA в регистре DWT Control (DWT_CTRL.CYCCNTEN), который можно найти в группе регистров Data Watchpoint and Trace unit.

Добавлено after 9 minutes 39 seconds:
Eddy_Em писал(а):как этот убогий софт компиляет без make
А CubeMX и не компилирует, он создает проект для выбранной IDE, я IAR выбрал, а так доступно MDK_ARM TrueSTUDIO и еще чего-то есть.
Потом созданный проект тупо открыл в IARе, нажал Make, проект собрался, все.
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

del
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Eddy_Em писал(а):Ничего себе! Самый легкий "блинк",
Вроде как мы пока только "кнопочку" жмем и размер не имеет значения.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Ну и чем это поможет? Воспитать очередного абдуринщика, вообще не понимающего, что он пишет? "Скачайте скетч отсюда, скопируйте это туда, нажмите кнопочку и вуаля"?

Добавлено after 4 minutes 22 seconds:
Вот мой свежий код, по которому я здесь последние дни вопросы задавал. I2C с DMA или без оного, коннект - по USART (т.к. на G070 USB отсутствует). Размер бинарника - 6288Б. Распределение памяти по эльфу:

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

   text    data     bss     dec     hex filename
   6068     220    2512    8800    2260 mk/i2cscan.elf
Странно, кстати, что bss такая здоровая.
P.S. Ну и жесть: у меня размер bss у "блинка" - 1176Б! Откуда, блин! Там вообще нет буферов, а переменных по минимуму. Две страницы кода, треть из которых — лицензия GPL в шапке… В map-файле "блинка" bss кончается со смещением 8, что-то с "size" не то! Аналогично с i2c, где bss кончается по смещению 0x27c, а никак не 0x9d0…
Да, проверил objdump -h - он показывает совсем другие (близкие к реальности) размеры, нежели size. Что-то с size не то!
Ага, вона как: оно к реальному bss прибавляет зачем-то пустое место на выравнивание для моей секции .myvars:

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

arm-none-eabi-size -A blink.elf 
blink.elf  :
section           size        addr
.vector_table      192   134217728
.text              688   134217920
.data                0   536870912
.myvars           1168   134218608
.bss                 8   536870912
.comment           117           0
.ARM.attributes     43           0
Total             2216
Последний раз редактировалось Eddy_Em Вс янв 08, 2023 21:02:53, всего редактировалось 2 раза.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="ARV",url="/forum/viewtopic.php?p=4350654#p4350654"]а разве я не русским языком написал свой вопрос: меня интересует HAL и CubeMX[/uquote]
Так я сразу и сказал, что вы прямым текстом отказались от любой помощи, которую мы можем оказать. И продолжаете демонстративно отказываться.
ARV писал(а):я ожидаю адекватной помощи:
Тогда чем вы недовольны? Именно адекватную помощь вам и пытаются оказать. Еще раз: изучать ради вас тот же ST-HAL никто не будет.
VladislavS писал(а):А чё так? Почувствовав себя гуру 1 lvl сразу на остальных плевать можно? Что тогда о гуру 80 lvl говорить.
Я бы это интерпретировал как попытку выяснить нужно ли это хоть кому-то. Будь я на месте ARV, то подобная фраза означала бы, что 1-2 интересующимся объяснил бы в личку, а если больше, то уже отдельным постом или темой. Но хватит ли самоому ARV добросовестности на это, не знаю.
КРАМ писал(а):Я готов извиниться, если вы озвучите свое знание и оно не окажется фейком или иной интерпретацией мною сказанного...
Ну, интерпретацией сказанного вами оно являться не может по определению. А так, причина почему я назвал такое объединение костылем, уже названа: просто добавить адресов прерываний было бы несложно, но это ломает совместимость, а заранее такое количество таймеров не предусмотрели. Вот и все.
Причем наличие костылей, напоминаю, не говорит будто разработчики дураки.
Но у ST есть и откровенно дурацкие решения, оправдания которым я придумать не могу. Например, организация буферов в USB у F1 или EPnR там же.
Eddy_Em писал(а):ARV, ни в коем случае нельзя начинать изучение STM32 с калокуба.
Сейчас это бесполезно. Воспринимать советы более опытных людей, противоречащие его представлениям, он не хочет. Возможно, когда получит граблями по лбу, мнение поменяется. В любом случае для этого нужно время и мыслительный процесс.
ARV писал(а):но ведь вы этого не посоветовали? значит, видимо, секрет...
Нам, конечно, очень лестно, что вы считаете всех присутствующих телепатами и предсказателями, способными из ничего угадать, какую же ошибку вы допустили в непонятно какой программе, вводя непонятно какие настройки. Ах да, ни эту программу, ни этих настроек у нас, разумеется, нет.
ARV писал(а):ну, чтобы начинающие знали, где им помогут, как смогут.
На форуме. Что на этом, что на многих других.
tonyk писал(а):Ещё заметь, что HAL в общем случае не обеспечивает переноса один-в-один кода с одного МК на другой.
Это вы очень... ОЧЕНЬ мягко выразились. Что бы там маркетологи не плели, переносимости ST-HAL не добавляет, а скорее наоборот, убавляет. Впрочем, желающие могут продемонстрировать как они портируют хотя бы ногодрыг между stm32, at91sam и gd32. При помощи ST-HAL, конечно.
Dimon456 писал(а):ARV, в IARе есть"фишка", которая не доступна в некоторых других IDE. Проверьте в своей IDE.
Не уверен как там в ARM (скорее всего, так же), но в RISCV есть системный регистр (m)cycle, ровно за это отвечающий: увеличивать свое значение на каждом такте. IDE тут вообще никаким боком, я с ним игрался при помощи обычной отладки.
И да, если во время выполнения функции возникнет прерывание, счетчик не остановится, поэтому будьте внимательны при подобном расчете быстродействия.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4350851#p4350851"]Ну и жесть: у меня размер bss у "блинка" - 1176Б! Откуда, блин![/uquote]
А зачем ты --specs=nano.specs закомментил?
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="Reflector",url="/forum/viewtopic.php?p=4350881#p4350881"]А зачем ты --specs=nano.specs закомментил?[/uquote]
О, блин. А ХЗ, зачем. Раскомменчиваю, так ведь код меньше получается.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

И G070 - это же реально G081, там 32-х битный TIM2 есть, RNG, DAC...

Добавлено after 15 minutes 21 second:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4350887#p4350887"]Раскомменчиваю[/uquote]
Заодно и -flto добавь :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="Reflector",url="/forum/viewtopic.php?p=4350896#p4350896"]там 32-х битный TIM2 есть, RNG, DAC...[/uquote]
Редко когда бывает нужен 32-битный таймер, а уж тем паче ГСЧ и ЦАП. Но если и понадобится, то тот же F303 таки приятней, а по цене - одинаково (имею в виду G0 с USB на борту; а без USB обычно мне нужно совсем уж мало).
Кстати, глянул даташит: нет у G070 ни одного 32-битного таймера, как нет ни ГСЧ, ни ЦАП. А с чего ты взял, что 070 в реальности - 081?
Заодно и -flto добавь :)
Ну, это уж вряд ли понадобится. Все равно у меня неиспользуемые секции удаляются (-Wl,--gc-sections).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Ответить

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