Перейти к содержанию
    

esaulenka

Свой
  • Постов

    1 459
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Весь контент esaulenka


  1. Потыкался, переделал на единый класс. При обращении к конкретному полю создаю экземпляр класса, в конструктор передаю адрес поля, с которым оно будет работать. И новые грабли: http://cpp.sh/2w2n. Для простоты понимания вырезал весь тот функционал, о котором я говорил выше, оставил только получение адреса-размера. Если передавать в функцию ссылку на не-однобайтовую переменную в упакованной структуре, происходит странное. ARM-GCC копирует её в стек, а только потом передаёт в функцию. Соответственно, адрес этой переменной ничего общего с реальным уже не имеет. Онлайновый GCC по ссылке так и вовсе ругается. Очередной вопрос: как указать "функция принимает аргументы со смещённым адресом" ?
  2. Мне показалось, что на шаблонах пяток таких микро-классов будет удобнее всего сделать. Другие варианты? Settings - const struct, лежащая во флеше, в отдельной секции. Имеет несколько полей (от uint32_t до массива байтов; может быть ещё что-то будет). Поля записываются в произвольном порядке (как пользователь захочет), но только один раз.
  3. Заткнулся на одной задачке. CortexM3, GCC. Есть структура во флеше с настройками. Адрес структуры зафиксирован линкером. Запись настроек производится однократно, в произвольном порядке. Для облегчения записи сделал класс CFwSetting { public: static bool IsPresent () { ... } static bool Write (const void * data) { ... } static bool Compare (const void * data) { ... } }; Теперь пытаюсь сделать его шаблонным, чтобы использовать для каждого поля: template <int Addr, int Len> class CFwSetting_Base { ... }; typedef CFwSetting_Base <(int)&Settings.SerialNumber, sizeof(Settings.SerialNumber)> CFwSerial; Проблем две: 1) оно в принципе не работает. Компилятор говорит "не знаю я адрес твоей структуры!". Если адрес вбить константой, работает. Но некрасиво... 2) некрасиво указывать название поля два раза - для адреса и для размера.
  4. Подсказываю. Есть специальный документ - AN3147 "Power management in STM8L and STM8AL". Wakeup from Halt mode is triggered by an external interrupt, sourced by a general purpose I/O port configured as interrupt input or by an alternate function pin capable of triggering a peripheral interrupt. Собственно, модуль EXTI настолько "тупой", что никакого тактирования ему не надо, чтобы разбудить контроллер.
  5. Про F0 ничего не скажу, не работал. А вот в USB OTG более "толстых" камней есть чудная грабля - VBUS им обязателен. При низком уровне на этой ноге соединение само собой гасится, при появлении высокого - восстанавливается. Я столкнулся с этим на F105, на ногу VBUS удобно лёг передатчик UART'а. Пока по UART'у ничего не передавалось, всё работало. Зато сразу после написания драйвера на этот UART начались произвольные пропадания данных в USB. Ремап ножек там очень убогий, пришлось много резать, к сожалению. Собственно, предложений два: - проверить (демо-плата есть?), что низкий уровень на отключенной ремапом ножке не приводит к фатальным последствиям - инициализировать один раз, и потом просто сидеть и ждать прерывания от хоста. Правда, это не очень красиво, если устройство супер-малопотребляющее.
  6. STM32F429 и HAL.

    Нет, вероятность ошибки с тактированием небольшая. Вообще, операционка на ПК скажет "обнаружено устройство", даже если воткнуть обыкновенный резистор между D+ и питанием. Отладчик есть? Пошагать, посмотреть, что инициализация USB нигде не вешается, ни в какие abort'ы не улетает. Пример под эту плату в исходниках - тоже полезное дело. Можно даже под другую (с аналогичным USB - все 4xx, 2xx, 105/107), но придётся чуть-чуть подумать и много почитать.
  7. Можно контролировать, конечно. Только для этого надо читать не описание "библиотеки", а reference manual. OTG_FS device endpoint-x interrupt register (OTG_FS_DIEPINTx) Bit 7 TXFE: Transmit FIFO empty This interrupt is asserted when the TxFIFO for this endpoint is either half or completely empty. The half or completely empty status is determined by the TxFIFO Empty Level bit in the OTG_FS_GAHBCFG register (TXFELVL bit in OTG_FS_GAHBCFG). Только вот DCD_EP_Tx() - это ниразу не "работаю напрямую". Это "передать первую часть буфера в FIFO, включить прерывание TX Empty, чтоб потом передать остаток". Там, скорее, надо копаться в кишках этого кода, вроде б, в счётчиках структуры USB_OTG_EP.
  8. До LPC43xx я так и не добрался, а вот в LPC17xx USB был лучше, чем ST'шный. Хост так и вовсе стандартный, можно в сети накопать несколько реализаций.
  9. Если всё ещё интересно - можно поспрашивать вот у этого человека. Там у него в записях есть пара статеек, как он всё те же кнопки к CarPC прикручивал. PS если что, я просто мимо проходил, и этим однопроводным CAN'ом не занимался.
  10. Да. Изначально состояние recessive было CANH=CANL=0; dominant - CANH=~1В (примерно, записи искать долго), CANL=0. После подключения нашего устройства CANH "подтянулся" до Vref (а сам VRef просел, ток там был куда больше номинального), шина полностью "встала". Починить шину не удалось, пришлось отрезать Vref. Возможно, лучший вариант - Ваша схема, но R11 сделать бОльшим этак на порядок, чем R12-R13. Ну и опять же, Вам решать, должно у Вас устройство работать на неисправной шине, или нет. У нас основной аргумент был "конкуренты ведь работают!", отсылки на стандарт не помогали :-)
  11. У нас в изделии была аналогичная схема (разве что трансивер - от Texas). И всё хорошо работало, пока не попало в одну систему, у которой CAN-L где-то было замкнуто на землю. Изделия конкурентов работают, а наше - ставит всю шину в непрерывный dominant state - тока этого Vref хватало, чтобы поддерживать ненулевое напряжение на "нижней" половинке терминатора. Ругаться с заказчиком не получилось, пришлось допиливать схему до состояния "как у других" - с единым резистором-терминатором.
  12. Замена для J-FLASH

    Это неправда. У меня работает C:\Program Files\SEGGER\JLink_V498>JFlash.exe -openD:\Projects\Test\1.hex Вот кто они такие с синтаксисом ключейбезпробелов, это другой вопрос. Непривычно...
  13. ADC Vref STM32F103

    Даташит, раздел "Embedded reference voltage", параметр "ADC sampling time when reading the internal reference voltage"
  14. Параллельно? Да, китайцы регулярно так делают. Если соединять "навсегда", а не постоянно отключать-подключать в разных комбинациях, напряжения на разных банках уравняются, "постоянно заряда" не будет.
  15. ... ну очень плохо. Переименуйте ответ в "для сферического DMA в достаточно разреженной среде можно сделать вот так:", и всё будет хорошо. А для ST-шек оно не работает. Там и DMA не очень-то навороченный...
  16. А кто сказал, что не можете? Можете. Вообще, без каких-либо таймеров и прерываний - пишите, сколько угодно. Таймер 6 нужен, если хочется убрать прерывания совсем и заталкивать данные через DMA. Вот тогда-то связки и понадобятся: таймер генерирует для DAC'а событие, а он генерирует событие для DMA, в DAC пересылается очередная порция данных. PS советики: - за глобальную переменную i убивать на месте. Глобальные имена должны хоть какой-то смысл нести. - если условие (i==32) переписать на (i>=countof(sin_arr)), можно заблаговременно обойти целых две грабли: изменение размера массива и случайная запись в i > 32.
  17. Я хочу сказать, что подход "у меня тут валяется лишняя деталь, куда б её приспособить?" в принципе неверная. Хотите сверлильный станок - ради бога, отличное развлечение. Только подумайте сначала о механике, о каких-то направляющих, которые будут задавать строго вертикальное перемещение сверла. С ручкой на скотче свёрла будут очень быстро заканчиваться. У меня валяется маленький и лёгкий коллекторный движочек с патроном. Даже с ним можно легко сломать тонкое сверло.
  18. Химия изменилась. Точнее даже не химия, а физика. Найти аккумулятор времён 140УД1 сейчас сложно. Они сейчас необслуживаемые, а это означает, что померить плотность можно только встроенным "показометром" (только в одной банке, точность - очень условная), а долить воды после интенсивного газовыделения - и вовсе никак не получится. Короче говоря, не надо аккумуляторы "кипятить".
  19. Мне кажется, надо начать именно со скотча. Прикрутить к этому мотору ручку, цанговый патрон (скотчем тоже), воткнуть туда сверло 1 мм и попытаться что-либо ЭТИМ сделать. А потом срочно искать какое-то другое применение этому мотору. PS горячо любимая на этом форуме статья опять в тему: http://iosifk.narod.ru/nat_m3.pdf
  20. Вот кстати да. Что припой, что чистая медь быстро покрывается какими-то окислами и работать перестаёт. У нас в одном проекте была мембранная клавиатура (печатная плата и резинка-кнопки с токопроводящими "пятаками"), как, скажем, в телевизионных пультах. Первая плата (несколько штук, чтобы отлаживаться) были с самым обычным HASL. Чтобы кнопки работали, надо было раз в неделю всё разбирать и тереть контакты жёсткой резинкой. После замены платы на серийную, с "золотым" покрытием, проблемы закончились.
  21. Тот, что в стандарте - нет. Вот тут http://stackoverflow.com/questions/6181715...-initialisation тему обсуждали со всех возможных сторон. Красивого решения, к сожалению, не нашли... PS а вообще, надо б в эклипс написать feature request, чтоб в парсере кода добавили поддержку, и пользоваться вариантом из C99 в коде С++. Один фиг gcc это умеет, а задачей "писать код под все компиляторы разом" я не заморачивался; подозреваю, там будет куда больше проблем, чем эти структуры. Вот, кстати, в процессе нашёл интересное описание расширений gcc: https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
  22. Спасибо! ... и почему я об этом не подумал?.. Только оно а) будет ли работать с глобальной const TStruct my_struct ? б) неудобно, если надо несколько экземпляров структуры (у конструктора тоже могут быть параметры, но это возврат к той же проблеме - десяток полей малопонятным списком). Отнаследовать от одной структуры пяток разных, переопределить конструкторы - вариант, конечно, но как-то через ж., мне кажется.
  23. Вот интересно, почему в C++ это не добавили? Т.е. gcc умеет, но в нарушение стандарта...
  24. Но тут почему-то 8 регистров за раз! Это не считая счётчика цикла и указателей src/dst. Какой компилятор такое умеет, интересно? Вот да. А оригинальный-то вопрос интересный! Следующий холивар "только последние дилетанты используют пробелы для отступов в коде!!!" :-(
  25. Речь о параметре HS_Startup_Time, который зашивается в конфигурационную область флеша. Если он меньше, чем реальное время запуска кварца (который high speed, не RTC), поведение чипа становится неадекватным (у меня не было стабильных периодов "неработы", но, видимо, это то же самое). Его надо померять на Вашей железке (осциллографом, методика описана в appnote), и потом запрограммировать во все устройства (в ST'шном стеке есть функция program_IFR()).
×
×
  • Создать...