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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Поддержу Eddy_Em, прошить легко можно, зажав reset, запустив процесс прошивки и сразу же отпустив reset.
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 3
Зарегистрирован: Чт мар 18, 2021 13:15:59

Сообщение WHISPER »

Камрады, всем спасибо за оперативность!!! Всё удачно перепрошил по UART1.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Сообщение pvit »

Может кто подскажет проверенные библиотеки для FFT на 512 точек, Q15 / Q31? Надо для M0+ (stm32g030f6).

CMSIS DSP к сожалению в память не влазит, слишком толстые таблицы создает. Опции чтобы остались только нужные таблицы, естественно, задавал. Меня бы устроило чуть медленнее, но чтобы таблиц не более 12 килобайт.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

pvit писал(а):проверенные библиотеки для FFT на 512 точек
Что означает фраза - проверенные библиотеки?
Библиотека CMSIS DSP кроме основного расчета FFT использует расчет "оконных" функций и всяких фильтров, что бы "окно" было как можно узким, тогда эффект красивее будет.
Если начать снижать точность вычислений, к примеру 12 бит АЦП -> 8 бит АЦП, выкинуть из кода "оконные" функций и всякие фильтры, в результате точность вычислений упадет, "окно" станет широким, и придем к тому эффекту, что был на AVR контролерах.

Разве вы этого хотите?

Ну раз хотите, то берете библиотеку CMSIS DSP и начинаете все таблицы пересчитывать под 8 бит АЦП, убирать все комплексные расчеты с запятой и подгонять их под обыкновенные целочисленные расчеты, выкидывать из кода все расчеты "оконных" функций и всяких фильтров и связанные с ним таблицы, в результате у вас получится всего одна таблица, максимум 200-400 байт, и кусок кода в 2 кило.

Если уж я со своими 5 классами образования справился, то вы и подавно справитесь.

Я бы мог предоставить образец кода, который с успехом влазить в stm32f030f4p6, но, к сожалению, я аматор, любитель, не профессионал, сразу налетят профессионалы: -о лишний сдвиг, -о деление, -о код не читаемый, -о это надо было на rtos или "конечных автоматах" и т.п.
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Сообщение pvit »

Прочитайте еще раз что я написал. Там нет ни слова про снижение точности. Есть много вариантов реализации FFT и не везде такое количество и размер таблиц как в cmsis dsp. По-моему я написал достаточно внятно, что я хочу.

Не вижу смысла приплетать сюда точность и оконные функции. А так же давать советы по пересчету таблиц, когда я задал вопрос про готовые альтернативные библиотеки.

[uquote="Dimon456",url="/forum/viewtopic.php?p=4109173#p4109173"]Что означает фраза - проверенные библиотеки?[/uquote]

Battle tested. Которые использовали много людей, и вы лично можете подтвердить что все ок.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

pvit писал(а):что все ок.
Нет, не все ок, во первых динамический диапазон сильно зарезан, был 12 бит стал 8 бит, это как сравнивать mp3 64 кбит*сек с 320 кбит*сек.
Во вторых отсутствие "оконной" функции картинку сводит на нет. Приходится резать на уровне -15 - -25дБ, хотя это можно было бы еще отображать.
pvit писал(а):Есть много вариантов реализации FFT и не везде такое количество и размер таблиц как в cmsis dsp.
Тогда в чем проблема, берете и используете.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Сообщение pvit »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4109219#p4109219"]Тогда в чем проблема, берете и используете.[/uquote]
Хотелось бы получить ответ на мой вопрос. Кто какие библиотеки для целочисленного FFT использовал, с данными Q15 / Q31.

https://radiokot.ru/forum/viewtopic.php ... 7#p4108997 вот тут я ровно про это спросил. Ничего не изменилось. Проблем нет. Есть вопрос. И меня интересует ответ именно на него, а не на что-то еще.
Встал на лапы
Сообщения: 123
Зарегистрирован: Ср май 16, 2012 20:44:38
Откуда: Харків-Україна.

Сообщение shalfey »

[uquote="Asmodey",url="/forum/viewtopic.php?p=4076431#p4076431"]А разве Keil не за денюжку?[/uquote]
Атолик бесплатный под любой камень и под любой размер.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="shalfey",url="/forum/viewtopic.php?p=4123312#p4123312"]Атолик бесплатный под любой камень и под любой размер.[/uquote]
Атолик у ST дипрекейтед с 2017 года. На основе Эклипса. Кубиде - на основе эклипса. Единственная разница - наличие у атолика кнопки чистой сборки, знакомый как-то очень искал такую кнопку в кубиде.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=4123720#p4123720"]дипрекейтед[/uquote]
Деприкейтид же :)

ps. Не совсем STM32, но я тут пару дней играюсь с Raspberry Pi Pico на двухъядерном Cortex-M0+, как раз сегодня утром плагин openOCD для VisualGDB обновился, стало быстрее и даже заработал RTT, правда только с jlink. St-link в связке с openOCD почему-то пишет, что не поддерживает SWD, а jlink напрямую с двухъядерными работает только с V10, а у меня V9. Ну и поскольку я не ищу легких путей, то за пару вечеров в качестве эксперимента был написан компилятор для модулей PIO полность отрабатывающий на этапе компиляции, т.е. после выполнения следующего кода во флеше останется только 19 двухбайтовых инструкций которые и будут выведены на печать:
Спойлер

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

static constexpr char pio_i2c[] = R"(
		.program i2c
		.side_set 1 opt pindirs

		wait 1 irq 2 rel
do_nack:
	    jmp y-- entry_point
		irq wait 0 rel

do_byte:
		set x, 7
bitloop:
		out pindirs, 1         [7]
		nop             side 1 [2]
		wait 1 pin, 1          [4]
		in pins, 1             [7]
		jmp x-- bitloop side 0 [7]

		out pindirs, 1         [7]
		nop             side 1 [7]
		wait 1 pin, 1          [7]
		jmp pin do_nack side 0 [2]

entry_point:
.wrap_target
		out x, 6
		out y, 1
		jmp !x do_byte
		out null, 32
do_exec:
		out exec, 16
		jmp x-- do_exec
.wrap
)";

Pio<pio_i2c> pio;
pioCheckError<pio.errorMsg>();
pio.printInstrs();
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Вопрос не по stm, но очень мелкий по EFM, но скорее всего просто по ARM. Планирую сделать интепретатор команд типа двигаться прямо, направо, стоп итп. для робота. В общем, он должен вызываться каждые 2,5мс. Или чаще, но если нет флага готовности данных сразу выход. Пока собираюсь из высокоуровневого процесса, который и будет кидать в очередь команды вызывать просто в цикле эту процедуру. Но я вообще-то ленивый и возникла мысль, а не вызывать ли её по прерыванию. Причем приоритет задать самый низкий, чтобы не мешать другим прерываниям, что там уже и так толпами работают. Но если вызывать по прерыванию, неплохо бы его как-то привязать к флагу, который поднимает другое прерывание, сообщая что данные готовы. Но, это прерывание имеет довольно высокий приоритет и я не могу в нем вызывать эту процедуру - она слишком развесистая для прерывания.

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

Сообщение COKPOWEHEU »

То есть если данные не готовы, прерывание не вызывать? Ну так запретите его, а в другом прерывании разрешите.
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

А кто это прерывание вызовет? Прерывание о готовности данных у меня вызывает DMA по окончании трансфера, затем делается небольшая обработка и выставляется флаг готовности данных. Хорошо, я туда добавлю NVIC_EnableIRQ(). А дальше?
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="uldemir",url="/forum/viewtopic.php?p=4201846#p4201846"]есть ли какой механизм из одного прерывания сформировать запрос другого прерывания, чтобы оно вызвалось следом?[/uquote]
Есть PendSV, задаешь ему самый низкий приоритет и выставляешь бит SCB_ICSR_PENDSVSET.
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Ага. Примерно так?

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

  NVIC_SetPriority(PendSV_IRQn, 7);
потом в высокоуровневом делаю

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

SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
и получаю вызов в

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

void PendSV_Handler(void)
о, и код уже раскрашен....
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А кто это прерывание вызовет?
Что значит "кто"? У вас же прерывание по таймеру каждые 2.5 мс, вот таймер и вызовет. Просто пока данных нет,прерывание запрещено, и обработчик вызываться не будет.
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Кхе,там у меня нет прерываний. Два канала сравнения таймера объединённые по ИЛИ (c использованием Peripheral Reflex System) пинают АЦП который снимает два набора данных с фотосенсоров без подсветки и с подсветкой. А третий канал данных включает и выключает эту подсветку. Всё самостоятельно, без прерываний. Ну и АЦП делает запросы ПДП чтобы скинуть результат. И вот только тут есть прерывание по окончании трансфера.

А, я могу добавить прерывание по переполнению таймера. Мне это в голову не пришло, так как переполнение происходит между этими двумя измерениями. А, если как вы говорите разрешать и запрещать, тогда, действительно, ямогу его отложить. Ок, пусть будет это ПланБ, если с PendSV у меня что-то не понравится.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

возникла мысль, а не вызывать ли её по прерыванию. Причем приоритет задать самый низкий, чтобы не мешать другим прерываниямх.
Кхе,там у меня нет прерываний.
Так есть прерывания или нет?
В любом случае можно и просто рандомный флаг прерывания выставлять вручную. Ну не знаю, I2C неиспользуемого например.
С другой стороны, если у вас опрос относительно медленный, может проще опрашивать в основном цикле флаг DMA или какой-нибудь программный.
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Продолжение глупого вопроса не по stm32, а по вообще ARM. А как называется функция, которая обслуживает PendSV прерывание?

В EFM32GG12 я назвал её PendSV_Handler и всё прекрасно работает.

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

void PendSVInit(void) {
  NVIC_SetPriority(PendSV_IRQn, PendSV_IRQ_priority);
}

void PendSV_Handler(void) {
  profiler();
}
Но теперь пытаюсь это перенести на Cypress PSoC cy8c5268 и вместо этой функции я вылетаю в IntDefaultHandler:
Спойлер

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

/*******************************************************************************
* Function Name: IntDefaultHandler
****************************************************************************//**
*
*  This function is called for all interrupts, other than a reset that gets
*  called before the system is setup.
*
* Theory:
*  Any value other than zero is acceptable.
*
*******************************************************************************/
CY_ISR(IntDefaultHandler)
{
    /***************************************************************************
    * We must not get here. If we do, a serious problem occurs, so go into
    * an infinite loop.
    ***************************************************************************/
Может кто знает как сделать, чтобы оно тут работало?
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Открываем startup-файл, ищем там таблицу векторов прерываний и смотрим/прописываем там нужный.
Ответить

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