STM32 новичку в ARM что к чему
Поддержу Eddy_Em, прошить легко можно, зажав reset, запустив процесс прошивки и сразу же отпустив reset.
- Реклама
- Сообщения: 3
- Зарегистрирован: Чт мар 18, 2021 13:15:59
Камрады, всем спасибо за оперативность!!! Всё удачно перепрошил по UART1.
- Сообщения: 191
- Зарегистрирован: Вт июн 05, 2018 00:18:01
Может кто подскажет проверенные библиотеки для FFT на 512 точек, Q15 / Q31? Надо для M0+ (stm32g030f6).
CMSIS DSP к сожалению в память не влазит, слишком толстые таблицы создает. Опции чтобы остались только нужные таблицы, естественно, задавал. Меня бы устроило чуть медленнее, но чтобы таблиц не более 12 килобайт.
CMSIS DSP к сожалению в память не влазит, слишком толстые таблицы создает. Опции чтобы остались только нужные таблицы, естественно, задавал. Меня бы устроило чуть медленнее, но чтобы таблиц не более 12 килобайт.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Что означает фраза - проверенные библиотеки?pvit писал(а):проверенные библиотеки для FFT на 512 точек
Библиотека CMSIS DSP кроме основного расчета FFT использует расчет "оконных" функций и всяких фильтров, что бы "окно" было как можно узким, тогда эффект красивее будет.
Если начать снижать точность вычислений, к примеру 12 бит АЦП -> 8 бит АЦП, выкинуть из кода "оконные" функций и всякие фильтры, в результате точность вычислений упадет, "окно" станет широким, и придем к тому эффекту, что был на AVR контролерах.
Разве вы этого хотите?
Ну раз хотите, то берете библиотеку CMSIS DSP и начинаете все таблицы пересчитывать под 8 бит АЦП, убирать все комплексные расчеты с запятой и подгонять их под обыкновенные целочисленные расчеты, выкидывать из кода все расчеты "оконных" функций и всяких фильтров и связанные с ним таблицы, в результате у вас получится всего одна таблица, максимум 200-400 байт, и кусок кода в 2 кило.
Если уж я со своими 5 классами образования справился, то вы и подавно справитесь.
Я бы мог предоставить образец кода, который с успехом влазить в stm32f030f4p6, но, к сожалению, я аматор, любитель, не профессионал, сразу налетят профессионалы: -о лишний сдвиг, -о деление, -о код не читаемый, -о это надо было на rtos или "конечных автоматах" и т.п.
- Сообщения: 191
- Зарегистрирован: Вт июн 05, 2018 00:18:01
Прочитайте еще раз что я написал. Там нет ни слова про снижение точности. Есть много вариантов реализации FFT и не везде такое количество и размер таблиц как в cmsis dsp. По-моему я написал достаточно внятно, что я хочу.
Не вижу смысла приплетать сюда точность и оконные функции. А так же давать советы по пересчету таблиц, когда я задал вопрос про готовые альтернативные библиотеки.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4109173#p4109173"]Что означает фраза - проверенные библиотеки?[/uquote]
Battle tested. Которые использовали много людей, и вы лично можете подтвердить что все ок.
Не вижу смысла приплетать сюда точность и оконные функции. А так же давать советы по пересчету таблиц, когда я задал вопрос про готовые альтернативные библиотеки.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4109173#p4109173"]Что означает фраза - проверенные библиотеки?[/uquote]
Battle tested. Которые использовали много людей, и вы лично можете подтвердить что все ок.
- Реклама
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Нет, не все ок, во первых динамический диапазон сильно зарезан, был 12 бит стал 8 бит, это как сравнивать mp3 64 кбит*сек с 320 кбит*сек.pvit писал(а):что все ок.
Во вторых отсутствие "оконной" функции картинку сводит на нет. Приходится резать на уровне -15 - -25дБ, хотя это можно было бы еще отображать.
Тогда в чем проблема, берете и используете.pvit писал(а):Есть много вариантов реализации FFT и не везде такое количество и размер таблиц как в cmsis dsp.
- Сообщения: 191
- Зарегистрирован: Вт июн 05, 2018 00:18:01
[uquote="Dimon456",url="/forum/viewtopic.php?p=4109219#p4109219"]Тогда в чем проблема, берете и используете.[/uquote]
Хотелось бы получить ответ на мой вопрос. Кто какие библиотеки для целочисленного FFT использовал, с данными Q15 / Q31.
https://radiokot.ru/forum/viewtopic.php ... 7#p4108997 вот тут я ровно про это спросил. Ничего не изменилось. Проблем нет. Есть вопрос. И меня интересует ответ именно на него, а не на что-то еще.
Хотелось бы получить ответ на мой вопрос. Кто какие библиотеки для целочисленного FFT использовал, с данными Q15 / Q31.
https://radiokot.ru/forum/viewtopic.php ... 7#p4108997 вот тут я ровно про это спросил. Ничего не изменилось. Проблем нет. Есть вопрос. И меня интересует ответ именно на него, а не на что-то еще.
[uquote="Asmodey",url="/forum/viewtopic.php?p=4076431#p4076431"]А разве Keil не за денюжку?[/uquote]
Атолик бесплатный под любой камень и под любой размер.
Атолик бесплатный под любой камень и под любой размер.
[uquote="shalfey",url="/forum/viewtopic.php?p=4123312#p4123312"]Атолик бесплатный под любой камень и под любой размер.[/uquote]
Атолик у ST дипрекейтед с 2017 года. На основе Эклипса. Кубиде - на основе эклипса. Единственная разница - наличие у атолика кнопки чистой сборки, знакомый как-то очень искал такую кнопку в кубиде.
Атолик у ST дипрекейтед с 2017 года. На основе Эклипса. Кубиде - на основе эклипса. Единственная разница - наличие у атолика кнопки чистой сборки, знакомый как-то очень искал такую кнопку в кубиде.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[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 двухбайтовых инструкций которые и будут выведены на печать:
Деприкейтид же
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();
Вопрос не по stm, но очень мелкий по EFM, но скорее всего просто по ARM. Планирую сделать интепретатор команд типа двигаться прямо, направо, стоп итп. для робота. В общем, он должен вызываться каждые 2,5мс. Или чаще, но если нет флага готовности данных сразу выход. Пока собираюсь из высокоуровневого процесса, который и будет кидать в очередь команды вызывать просто в цикле эту процедуру. Но я вообще-то ленивый и возникла мысль, а не вызывать ли её по прерыванию. Причем приоритет задать самый низкий, чтобы не мешать другим прерываниям, что там уже и так толпами работают. Но если вызывать по прерыванию, неплохо бы его как-то привязать к флагу, который поднимает другое прерывание, сообщая что данные готовы. Но, это прерывание имеет довольно высокий приоритет и я не могу в нем вызывать эту процедуру - она слишком развесистая для прерывания.
Так вот вопрос, есть ли какой механизм из одного прерывания сформировать запрос другого прерывания, чтобы оно вызвалось следом?
Так вот вопрос, есть ли какой механизм из одного прерывания сформировать запрос другого прерывания, чтобы оно вызвалось следом?
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
То есть если данные не готовы, прерывание не вызывать? Ну так запретите его, а в другом прерывании разрешите.
А кто это прерывание вызовет? Прерывание о готовности данных у меня вызывает DMA по окончании трансфера, затем делается небольшая обработка и выставляется флаг готовности данных. Хорошо, я туда добавлю NVIC_EnableIRQ(). А дальше?
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="uldemir",url="/forum/viewtopic.php?p=4201846#p4201846"]есть ли какой механизм из одного прерывания сформировать запрос другого прерывания, чтобы оно вызвалось следом?[/uquote]
Есть PendSV, задаешь ему самый низкий приоритет и выставляешь бит SCB_ICSR_PENDSVSET.
Есть PendSV, задаешь ему самый низкий приоритет и выставляешь бит SCB_ICSR_PENDSVSET.
Ага. Примерно так?
потом в высокоуровневом делаю
и получаю вызов в
о, и код уже раскрашен....
Код: Выделить всё
NVIC_SetPriority(PendSV_IRQn, 7);Код: Выделить всё
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;Код: Выделить всё
void PendSV_Handler(void)- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Что значит "кто"? У вас же прерывание по таймеру каждые 2.5 мс, вот таймер и вызовет. Просто пока данных нет,прерывание запрещено, и обработчик вызываться не будет.А кто это прерывание вызовет?
Кхе,там у меня нет прерываний. Два канала сравнения таймера объединённые по ИЛИ (c использованием Peripheral Reflex System) пинают АЦП который снимает два набора данных с фотосенсоров без подсветки и с подсветкой. А третий канал данных включает и выключает эту подсветку. Всё самостоятельно, без прерываний. Ну и АЦП делает запросы ПДП чтобы скинуть результат. И вот только тут есть прерывание по окончании трансфера.
А, я могу добавить прерывание по переполнению таймера. Мне это в голову не пришло, так как переполнение происходит между этими двумя измерениями. А, если как вы говорите разрешать и запрещать, тогда, действительно, ямогу его отложить. Ок, пусть будет это ПланБ, если с PendSV у меня что-то не понравится.
А, я могу добавить прерывание по переполнению таймера. Мне это в голову не пришло, так как переполнение происходит между этими двумя измерениями. А, если как вы говорите разрешать и запрещать, тогда, действительно, ямогу его отложить. Ок, пусть будет это ПланБ, если с PendSV у меня что-то не понравится.
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
возникла мысль, а не вызывать ли её по прерыванию. Причем приоритет задать самый низкий, чтобы не мешать другим прерываниямх.
Так есть прерывания или нет?Кхе,там у меня нет прерываний.
В любом случае можно и просто рандомный флаг прерывания выставлять вручную. Ну не знаю, I2C неиспользуемого например.
С другой стороны, если у вас опрос относительно медленный, может проще опрашивать в основном цикле флаг DMA или какой-нибудь программный.
Продолжение глупого вопроса не по stm32, а по вообще ARM. А как называется функция, которая обслуживает PendSV прерывание?
В EFM32GG12 я назвал её PendSV_Handler и всё прекрасно работает.
Но теперь пытаюсь это перенести на Cypress PSoC cy8c5268 и вместо этой функции я вылетаю в IntDefaultHandler:
Может кто знает как сделать, чтобы оно тут работало?
В EFM32GG12 я назвал её PendSV_Handler и всё прекрасно работает.
Код: Выделить всё
void PendSVInit(void) {
NVIC_SetPriority(PendSV_IRQn, PendSV_IRQ_priority);
}
void PendSV_Handler(void) {
profiler();
}
Спойлер
Код: Выделить всё
/*******************************************************************************
* 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
Открываем startup-файл, ищем там таблицу векторов прерываний и смотрим/прописываем там нужный.


