Ответы пользователя по тегу STM
  • 2 переменные в одном адресе Си11 ARM STM32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может, дело в отладчике?

    Может и в отладчике. Поскольку обе переменные глобальные, то для проверки можно посмотреть в вывод readelf -a -- там должны быть их адреса. Или напечатать адреса из программы.
    Ответ написан
  • Как обрабатывать прерывания дальномера VL53L0X?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нужно как-то переписать ее чтобы можно было переключаться между 3 i2c.

    Эта библиотека хранит состояние устройства в статических переменных. Как вариант можно обернуть эти потроха в структуру или класс, создавать отдельные объекты для отдельных устройств и использовать методы класса вместо обычных функций либо добавить в функции указатель на объект как параметр.

    Как обрабатывать прерывания дальномера VL53L0X?

    Как обычные прерывания GPIO?
    Ответ написан
    Комментировать
  • Возможно ли реализовать виртуальный uart на stm32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Первая проблема что нужно при скорости 9600 бит/c передача одного бита должна происходить прмерно 1/9600 = 104 микорсекунды. HAL_Delay поддерживает минимальный период 1 милисекунда.

    Это говорит о том, что нужно использовать другой метод для организации задержки. Например основанный на таймере со счётчиком.

    какой надо выставлять уровень напряжения на пине в простое

    Стандартно -- высокий логический. Сколько вольт этому должно соответствовать конкретно -- зависит от того, что вы подключите снаружи. Явно там будет какой-нибудь конвертор или другой микроконтроллер.
    Ответ написан
  • Можете объяснить код на 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 комментариев
  • Как подключить дисплей с использованием FreeRTOS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    какие нюансы надо учесть при подключении дисплея, при формировании задачи ОСРВ?

    Если дисплей работает без ОС, то, судя по всему, нюансы подключения успешно учтены. Из нюансов запуска задачи на ум приходит размер выделенного ей стека.
    Ответ написан
  • Пытаюсь собрать прошивку для stm32. Ошибка "src/core_cm3.c: Assembler messages"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    g++  ...   src/core_cm3.c src/system_stm32f10x.c -o build/main


    src/core_cm3.c: Assembler messages:
    src/core_cm3.c:447: Error: no such instruction: `mrs %eax,psp'


    На какой системе ты выполняешь сборку, на x86? Тогда чтобы получить код для arm тебе нужен не g++, а какой-нибудь arm-linux-gnueabi-g++.
    Ответ написан
    2 комментария
  • STM32 ловит HardFault_Handler на операторе += как починить?

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

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

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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подумалось, считывать значение systick, все равно МК тактируется и где-то этот счётчик есть, но вот не могу найти где?

    Можно настроить таймер так, чтобы он не вызывал прерываний, а в нужные моменты считывать значение таймерного счётчика -- TIMx_CNTRH / TIMx_CNTRL.
    Ответ написан
  • С чем связана ошибка "failed execute mi command"?

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

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

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

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

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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Первоисточник:
    infocenter.arm.com/help/index.jsp?topic=/com.arm.d...
    Для чтения PDF нужно будет зарегистрироваться.
    А вообще поиск по слову "ARM ARM" (Advanced RISC Machines Architecture Reference Manual).
    Ответ написан
    Комментировать
  • Почему глючит сервопривод в FreeRTOS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #define SERVO_180 8200
    #define SERVO_0 1800
    void set_pos(uint8_t pos) {
      uint32_t tmp = (SERVO_180 - SERVO_0) / 180;
      TIM2->CCR2 = SERVO_0 + tmp * pos;
    }

    Фуфуфу, сначала умножать, потом делить, иначе потеряете в точности и получите большой недобор на больших углах.
    Кроме того, сдаётся мне, что эта формула должна выглядеть так:
    uint32_t tmp = ((SERVO_180 - SERVO_0) * pos) / 180 + SERVO_0;
      TIM2->CCR2 = tmp;

    не?
    сервопривод начинает сходить с ума

    Вы бы описали, как именно.
    Ответ написан
    5 комментариев