![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
Flexz
-
Постов
252 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Flexz
-
-
На основе модернизированной библиотеки от ST для Mass-Storage...
"модернизированной" - это в смысле просто допиленной/оптимизированной под себя, или косяки какие-то были?
PS а 20+МБ это гуд)
-
Кто уже реализовывал, каких скоростей удалось добиться? Зависит ли производительность от микросхемы физического уровня?
-
Как именно не работает-то? Пин не дрыгается? Уарт не уартит?
По коду - переинициализация, включение-выключение UART - лишние. Или хотя бы сначала перенастраивайте пин, потом включайте UART. Иначе, в теории, можно глитч словить: пин переключается на UART, а тот выключен - имеем низкий уровень на выходе, UART включается - уровень становится высокми.
PS процессор указывайте точнее, у вас видимо stm32f1xx? Просто в stm32f2, f4, l1 - настройка пинов выполняется по другому.
-
Столкнулся с аналогичным косяком. Только мне нужно запустить АЦП от внешнего импульса. Рассчитывал запустить канал таймера в режиме Input Capture (нужно попутно фиксировать частоту следования импульсов) и от того же события толкнуть АЦП.
Первые сомнения возникли при виде битов EXTEN - выбор фронта для запуска АЦП от события таймера. При чем тут выбор фронта, когда событие (факт захвата счетчика, либо совпадения счетчика и CCR) должно быть единичным импульсом?
Дальнейшие раскопки показали, что АЦП запускается в режиме Output Compare, при чем должен быть включен выход (установлен бит CCxE в CCER).
Из чего следует неутешительный вывод: документация нагло врет, а описание битов EXTSEL в регистре ADC_CR2 следует читать не как "Timer x CCy event", а как "Timer x OCy output".
PS Буду безмерно счастлив если кто-то укажет в чем я не прав :rolleyes:
-
Акселерометр, как ни странно, нужно выбирать исходя из ожидаемых перегрузок, в которых придется работать. Если на столе стоять - 2g достаточно.
А то что сейчас называют гироскопами на самом деле поголовно - датчики угловой скорости, отсюда и величины - градусы в секунду.
-
Если вопрос только в работе тестировщика, то почему не проверять одновременно несколько плат? Пока на одной тесты бегают он другую готовит и так по кругу.
-
По неработающей периферии - посмотрите раздел "2.1 System architecture". У DMA1 не упоминается периферийная шина и на схеме он не соединен с AHB-периферией, вероятно, причина в этом.
А фифо как настраиваете? там же отдельно есть настроки Memory burst и Peripheral burst.
-
Все равно не работает. EXTI прерывание просто перезапускает таймер, так что захват по СС1 все равно произойдет. Т.е. ложным может быть только первое срабатывание, а у меня неверное значение не только первое ))))
В исходном виду у вас прерывание вообще не происходит до полного окончания DMA трансфера. Вы измеряете интервал между импульсами на PB6, а не разность фаз, естественно результат неверен.
Впрочем если вы предпочитаете ржать над советами - копайтесь сами. Успехов.
-
Tim_Capture_Init() запускает DMA и ждет его окончания ДО настройки прерывания от внешней линии в EXTI_init()
Просто поменяйте местами их вызовы .
-
Оптимизация включена? Если да, то выключите. Или сделайте переменную _val - volatile, данные в нее записанные не используются и компилятор может ее выкинуть, ровно как и чтение DR.
-
Главная проблема тут имхо - 32 разряда, на LPC17xx порты хоть и 32битные, но целых нету. Если б 16, еще можно попробовать успеть, но только на STM32F4 (168МГц), либо новые LPC43xx (204МГц), у этих порты 16битные.
Вообще, конечно, для ПЛИСки задача.
-
Вот же заносит вас :)
Пример-то когда будете приводить? Или опять стрелки на макросы кинете, которые в обоих языках идентичны.
-
Ну это понятно. Подход-то от этого не меняется.
-
Тактирование включаете на порт А, а работаете с портом Б?
-
Это если не нужно освобождать ресурсы или выполнять какие-нибудь еще действия при ошибке.
Ну во встроенных приложениях выделение-освобождение ресурсов лучше сводить к минимуму, ИМХО.
Если же без ресурсов "никак", это можно сделать на уровне конструктор-деструктор - объект создается на стеке (ресурс выделяется в конструкторе), разрушается при выходе из области видимости (ресурс освобождается). Либо try-catch-finally.
На мой взгляд, так более наглядно, чем делать clean-up в конце функции.
-
Ищите по-лучше - там много где макросы используются.
А кто говорит что макросы в С++ вообще не нужны? Что я пропустил? Условная компиляция там везде, это и есть основное назначение макросов в С++.
Одного мало ?Где? Когда? Я опять что-то пропустил?
Кстати - если макросы совсем не нужны в С++ - на кой хрен в C++11 включили поддержку variadic macro из стандарта C99 ?В общем кому нужен С++ - используйте на здоровье - мне он не нужен, может только иногда :)
Ну вот опять.. напротив, макросы в С++ нужны, с этим никто не спорит. Просто там где в С использовались макросы, в С++ взамен появились более надежные, гибкие и удобные конструкции, во многих местах, но не везде - условную компиляцию по другому не реализуешь, да и громоздкие конструкции на базе шаблонов иногда удобно засунуть в макрос просто ради удобства чтения кода.
С последним тезисом тоже спорить бессмысленно, каждому свое :)
-
...можете начать отсюда
http://www.boost.org/doc/libs/1_48_0/libs/.../doc/index.html
Если не ошибаюсь (давненько уже не смотрел чего нового в буст включили), boost::preprocessor это одна едиственная библиотека в бусте полностью написанная на базе макросов. Остальные основаны на число плюсовых фишках. Так что вы лишь подтверждаете чужие аргументы - 99% возможностей макросов покрываются новыми возможностями С++ (1% как раз - preprocessor). В обратную же сторону увы это не работает, попробуйте boost::spirit на макросы перевести :)
PS а за вами все еще пример где С++ уступает С.
-
Да нормально вполне, если не ошибаюсь, например, в OpenCV именно такой подход используют.
Как вариант (уже выше предложили похожее) вместо
goto crash_label;
писать
return crash_handler(чего-нибудь);
ИМХО симпатичнее, чем в конце функции писать, да и религиозная ненависть к goto удовлетворена :)
Это в embedded. На ББ предпочитаю C# и, естественно, исключения, но это уже совсееем другой разговор.
-
эм.. не совсем так. Коммент мозговыносной. Просто нельзя одновременно включать линии периферии использующие данные ножки.
-
Включите и увидите :)
Вообще размещению альтернативных функций посвящен солидный раздел ерраты F1. Вот в F2 переключение функций наконец-то сделано по-человечески, на каждую ножку есть регистр выбирающий какую именно функцию выводить.
-
Видимо, он имел ввиду единый, общий для разных компиляторов name mangling. Он же не стандартизован и все компиляторы делают его по своему, хотя за последний стандарт языка не знаю.
-
По сути С++ дублирует функционал С и во многих случаях уступает ему при этом.
Может приведете конкретные примеры этих многих случаев? Было бы очень интересно почитать.
-
always@(posedge Clk or posedge Rst)
Касательно самого первого примера - а такие вложенные always-ы вообще допустимы?
-
Стоит ли флаг глобального прерывания канала очищать?
В документации черным по белому написано:
Clears the GIF, TEIF, HTIF and TCIF flags in the DMA_ISR registerВот сбрасывается опоздавшее прерывание.
PS а зачем вообще GF трогаете? у вас же прерывание по нему не включено.
Скорость High Speed USB на STM32F2/F4
в ARM
Опубликовано · Пожаловаться
про сдшки в обоих мануалах (на 2 и 4) написано ровно одно и тоже
Чем вызвано ограничение для SD - непонятно.