Ответы пользователя по тегу Микроконтроллеры
  • Как регистры SOC отображаются на память Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как узнать, какой адрес этих регистров уже после инициализации устройств и загрузки ОС?

    Физический адрес -- как и написано в dts: 0xfe600000. Виртуальный адрес -- какой-то сравнительно случайный, выделенный вызовом ioremap() или какой-нибудь его обёрткой. Если драйверу нужен доступ к регистрам -- драйвер просто вызывает ioremap() сам и получает адрес. Если доступ нужен в юзерспейсе -- можно (при наличии разрешений) сделать mmap() файлу /dev/mem по смещению равному физическому адресу устройства.

    Или обратная задача: есть процесс, который пишет в некоторую область памяти, как узнать, возможно, это какие-то регистры SOM

    Сделать cat /proc/<pid>/maps и посмотреть, что отображено в эту область виртуальных адресов.

    Но обычно люди не отображают регистры устройств напрямую в пользовательскую память, максимум -- отображают файл обрабатываемый драйвером устройства, а драйвер уже может выступить дополнительным слоем абстракции и подставить в отображение часть адресного пространства устройства, если такое им поддерживается. В этом случае для понимания что куда отображается без чтения исходников драйвера не обойтись.
    Ответ написан
    Комментировать
  • Как ATmega88 подружить с кодом на С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Сигналы доходят до меги, но она не включает ни один из светиков.

    Я бы начал с отладки простым безусловным включением led на старте программы. Потому что 1К резистор последовательно со светодиодом с падением в 2В ограничивает ток 3ма, чего, скорее всего, недостаточно для заметного свечения.
    Ответ написан
    Комментировать
  • Ошибка с ESP32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что это значит

    подозреваю, что вот эта часть: ���`�B��Χh� �l<*�� !����� -- это вывод скетча на 9600. Откуда LoadProhibited -- непонятно.

    можно ли это как-то исправить?

    только разобравшись, что происходит. idf.py monitor обычно декодирует стек трейс и выводит соответствующие строчки исходников, можно начать отсюда.
    Ответ написан
  • Можно ли в ESP32-Cam одновременно использовать SD карту и периферийное устройство общающееся по SPI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как это сделать вместе?

    Повесить второе SPI-устройство на отдельную линию CS. Я вижу, что сигнал U2RXD с разъёма P1 можно для этого использовать, если речь об этом модуле.
    Ответ написан
  • Возможно ли собрать libffi под esp32(esp-idf)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возможно ли собрать libffi под esp32(esp-idf)?

    Да. В коде порта libffi для xtensa никаких сложностей при сборке под esp32s3 быть не должно. Но, я подозреваю, что прийдётся разобраться с тем, как совместить libffi с idf.
    Ответ написан
  • Какое напряжение на контактах spi esp32s3 n16r8?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    какое напряжение на контактах FSPI на esp32 s3 n16r8

    Это недостаточно точное обозначение, потому что функция FSPI может быть включена у разных пинов через IOMUX, не говоря уже о том, что через GPIO matrix эти сигналы могут быть выведены вообще на любые пины. С напряжением всё более определённо, esp32s3 TRM в разделе 6.10.2 говорит, что GPIO33 ~ GPIO37 and GPIO47 ~ GPIO48 can be powered either by VDD_SPI or VDD3P3_CPU, и что VDD_SPI can be configured to use an internal LDO. The LDO input and output both are 1.8 V. If the LDO is not enabled, VDD_SPI is connected directly to the same power supply as VDD3P3_RTC. На всех остальных пинах с выбранной цифровой функцией будет 3.3в в активном состоянии.
    Ответ написан
  • Можете объяснить код на STM32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    uint8_t led_state = 0x03; Данной командой мы завели переменную, которая равна 3

    В коде написано 2.

    что под этим подразумевается?

    2 -- это вот такое 8-битное двоичное число: 00000010. А если 2 заменить на 3, то число станет таким: 00000011. Улавливаешь связь с количеством и номерами включенных светодиодов?

    HAL_GPIO_WritePin(GPIOE, led_state << 8, GPIO_PIN_SET); Это я так понимаю мы сначала устанавливаем самый первый светодиод, т.е. 8, но на практике ни так.

    Нет, светодиоды на схеме подключены к битам 8..15, а led_state ты выше видел какое. Этой командой мы сдвигаем биты 0..7 led_state в биты 8..15.

    led_state = led_state >> 1 | led_state << 7;Эту строку совсем не понимаю.

    Это циклический сдвиг вправо на 1. Т.е. биты "выдвигаемые" вправо за пределы led_state появляются слева.
    т.е. двоичное число abcdefgh превращается в 0abcdefg | h0000000 = habcdefg.
    Ответ написан
    6 комментариев
  • STM32 ловит HardFault_Handler на операторе += как починить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вопрос номер раз: как такое вообще произошло?

    Насколько я понимаю STM32F207xx не поддерживает инструкцию uxtah, потому что это инструкция Thumb2 не реализованная в CortexM3.

    Вопрос номер два: как такое фиксить?

    Подозреваю, что ключом -march=, вероятно -march=armv6.
    Ответ написан
    1 комментарий
  • А время с DS1302 всегда-всегда корректное?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    И решение, если я читаю часы-минуты-секунды и получаю в секундах 00 - то мне следует перечитать минуты ещё раз и сделать вывод.

    Обычно в таких случаях самый часто изменяющийся разряд читают дважды -- в начале и в конце чтения составного значения и перечитывают значение целиком если этот разряд изменился.
    Ответ написан
    1 комментарий
  • Почему биты в регистре архитектуры AVR заносяться именно посредством сдвига 1 на этот бит влево?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему нельзя занести этот бит в регистр без сдвига, зачем это придумано
    UCSRA |= (1<<U2X);

    В заголовочных файлах U2X определён как "номер бита U2X в регистре UCSRA", т.е. 1.
    Если бы U2X был определён как "битовая маска поля U2X в регистре UCSRA" (т.е. 2), то все бы писали UCSRA |= U2X;. В ассемблерном коде avr оба эти варианта превратятся в инструкцию sbi UCSRA, 1, устанавливающую бит в регистре по номеру.

    Имея номер бита перевести его в битовую маску гораздо легче, чем наоборот, из маски вывести номер бита (который, в общем случае, может быть и не один), я думаю, что отчасти поэтому у программистов работающих с железом есть тенденция определять поля регистров через номера битов.
    Ответ написан
    Комментировать
  • С чем связана ошибка "failed execute mi command"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    С чем связана ошибка «failed execute mi command»?

    Скорее всего -- с багом в отладчике.
    Попробуй то же самое, но с программой собранной с -O0 или -Og.
    Ответ написан
    3 комментария
  • Какой микроконтроллер AVR выбрать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Схема подключения:

    Где на этой схеме AVR? Это "схема управления" или что-то ещё?

    В микроконтроллерах понимания ноль

    Но со здравым смыслом-то всё в порядке? Надо рассмотреть все стрелочки входящие и выходящие из AVR на схеме и ответить на вопрос: что они собой представляют. Какой это интефейс? Следующий шаг -- найти AVR у которого есть столько интерфейсов такого типа, либо решить, как будут мультиплексироваться имеющиеся интерфейсы.
    Ответ написан
    Комментировать
  • Проблема тактирования карты?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    НО ничего в таком случае не работает

    А с оригинальной формулой -- работает? Каковы значения sys_clk, F, D и baudrate?
    Ответ написан
    1 комментарий
  • Как можно интерпретировать uint32_t в регистры uint8_t?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Какие косяки меня могут поджидать?

    Разный порядок передачи байтов (big/little endian), в двух ваших примерах он уже разный (учитывая, что STM32 -- little endian по умолчанию).

    Есть способ лучше?

    С точки зрения сгенерированного кода оба предложенных варианта одинаковы.
    С точки зрения читабельности (и при отсутствии требований к порядку байтов) я бы предложил следующее:
    void send_uint32(uint32_t v)
    {
        uint8_t transmitBuffer[4];
        memcpy(transmitBuffer, &v, sizeof(v));
        HAL_UART_Transmit_IT(&huart1, transmitBuffer, sizeof(v));
    }


    При наличии требований к порядку байтов я бы выбрал сдвиги.
    Ответ написан
    4 комментария
  • Можно ли и создать экземпляр класса (с++) с проинициализированными полями?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    $ cat > test.cpp <<EOF
    class type_class {
            int field1;
            int field2;
    public:
            constexpr type_class (int f1, int f2): field1(f1), field2(f2) {
            }
    };
    extern const type_class var;
    const type_class var(12, 34);
    EOF
    $ g++ -S -O2 test.cpp
    $ cat test.s
            .file   "test.cpp"
            .globl  var
            .section        .rodata
            .align 8
            .type   var, @object
            .size   var, 8
    var:
            .long   12
            .long   34
            .ident  "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
            .section        .note.GNU-stack,"",@progbits

    Т.е. constexpr конструктор, в результате -- готовый инициализированный объект в секции .rodata, что и требовалось.
    Ответ написан
    1 комментарий
  • Возможно ли вывести "Hello world" на assembler (fasm) под win 64bit?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Стоит задача вывести на экран сообщение с текстом "Hello world", программу нужно написать на ассемблере (fasm).

    Можно написать консольное приложение под win32 на ассемблере. Уровень сложности примерно тот же самый, что и при написании COM.
    Ответ написан
    Комментировать
  • Что за процедура такая RESET AVR?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему так происходит, если делать изменения в коде, которые я описал выше?

    Сам код приведи в вопросе, без него мы можем только гадать, что происходит.
    Но если гадать, то:
    Если в этом коде удалить саму метку RESET:, то есть только метку, но не обработчик прерывания RESET - код не работает

    а не должен даже компилироваться. Потому что в векторе reset должна стоять команда перехода на метку RESET:.

    почему если я размещаю обработчик прерывания RESET последним - он также не работает

    может не хватает диапазона команды rjmp (4 килобайта) чтобы перейти из вектора в обработчик?

    Для чего нужна процедура RESET?

    для инициализации контроллера

    Как она вызывается

    переходом из вектора reset
    Ответ написан
    4 комментария
  • Где можно найти информацию о программировании 32 бит avr?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    AVR32 вроде сдох. Сам Atmel перешёл на использование ARM для 32-битных приложений.
    Ответ написан
    2 комментария
  • Как обезопасить функцию от прерывания?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    P.S. выделение памяти в прерываниях зло и т.д. ага.

    Дело говоришь. Вообще какая-либо существенная работа в обработчике прерывания -- зло. Избегай этого по возможности.

    Так вот, что бы не проставлять кучу __disable_irq(); __enable_irq();

    А никак иначе. Но обычно есть возможность делать не disable/enable а save+disable/restore, т.е. запрещать прерывания, одновременно возвращая текущее состояние запрета и восстанавливать это состояние.
    Ответ написан
    5 комментариев