Jump to content
    

Search the Community

Showing results for tags 'stm32'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Сайт и форум
    • Новости и обсуждения сайта и форума
    • Другие известные форумы и сайты по электронике
    • В помощь начинающему
    • International Forum
    • Образование в области электроники
    • Обучающие видео-материалы и обмен опытом
  • Cистемный уровень проектирования
    • Вопросы системного уровня проектирования
    • Математика и Физика
    • Операционные системы
    • Документация
    • Системы CAD/CAM/CAE/PLM
    • Разработка цифровых, аналоговых, аналого-цифровых ИС
    • Электробезопасность и ЭМС
    • Управление проектами
    • Neural networks and machine learning (NN/ML)
  • Программируемая логика ПЛИС (FPGA,CPLD, PLD)
    • Среды разработки - обсуждаем САПРы
    • Работаем с ПЛИС, области применения, выбор
    • Языки проектирования на ПЛИС (FPGA)
    • Системы на ПЛИС - System on a Programmable Chip (SoPC)
  • Цифровая обработка сигналов - ЦОС (DSP)
    • Сигнальные процессоры и их программирование - DSP
    • Алгоритмы ЦОС (DSP)
  • Микроконтроллеры (MCU)
    • Cредства разработки для МК
    • ARM
    • RISC-V
    • AVR
    • MSP430
    • Все остальные микроконтроллеры
    • Отладочные платы
  • Печатные платы (PCB)
    • Разрабатываем ПП в САПР - PCB development
    • Работаем с трассировкой
    • Изготовление ПП - PCB manufacturing
  • Сборка РЭУ
    • Пайка и монтаж
    • Корпуса
    • Вопросы надежности и испытаний
  • Аналоговая и цифровая техника, прикладная электроника
    • Вопросы аналоговой техники
    • Цифровые схемы, высокоскоростные ЦС
    • RF & Microwave Design
    • Метрология, датчики, измерительная техника
    • АВТО электроника
    • Умный дом
    • 3D печать
    • Робототехника
    • Repair and debug
  • Силовая электроника - Power Electronics
    • Силовая Преобразовательная Техника
    • Обратная Связь, Стабилизация, Регулирование, Компенсация
    • Первичные и Вторичные Химические Источники Питания
    • Высоковольтные Устройства - High-Voltage
    • Электрические машины, Электропривод и Управление
    • Индукционный Нагрев - Induction Heating
    • Системы Охлаждения, Тепловой Расчет – Cooling Systems
    • Моделирование и Анализ Силовых Устройств – Power Supply Simulation
    • Компоненты Силовой Электроники - Parts for Power Supply Design
  • Интерфейсы
    • Форумы по интерфейсам
  • Поставщики компонентов для электроники
    • Поставщики всего остального
    • Компоненты
  • Майнеры криптовалют и их разработка, BitCoin, LightCoin, Dash, Zcash, Эфир
    • Обсуждение Майнеров, их поставки и производства
  • Дополнительные разделы - Additional sections
    • Встречи и поздравления
    • Ищу работу
    • Предлагаю работу
    • Куплю
    • Продам
    • Объявления пользователей
    • Общение заказчиков и потребителей электронных разработок

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


Город


Код проверки


skype


Facebook


Vkontakte


LinkedIn


Twitter


G+


Одноклассники

  1. Всех приветствую. Предлагаю тут выкладывать найденные ошибки в библиотеках HAL. P.S. не нужно тут обсуждать применять или нет библиотеки. Итак. MCU - L433 библиотека - stm32l4xx_hal_i2c.c версия - STM32Cube_FW_L4_V1.17.2 (последняя на 23.06.2022) функция - I2C_IsErrorOccurred Причина: в цикле while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) после условия выхода по таймауту if ((HAL_GetTick() - tickstart) > I2C_TIMEOUT_STOPF) нет выхода из цикла. Может остаться на очень долгое время. Решение: добавить break; после status = HAL_ERROR;
  2. Куплю или приму в дар ссылку на магазин, где продается этот микроконтроллер)
  3. Клоны STM32

    Поднимаю тему так как на рынке сейчас чехарда, а брэндовые stm32 по некоторым позициям подорожали в 6-10 раз. Пытался (и пытаюсь) пол года как уже объездить CH32F103C8T6 клон от китайской компании WCH Здесь буду описывать грабли, которые прошел лично с данными МК, дабы другие не налетали. В принципе, чипы рабочие, если как рыбу "фугу" уметь их готовить. Они дешевле оригинальных STM32 в несколько раз, имеют широкий диапазон питания по напряжению. Купить их можно только на Али либо в Китае. Даже на англоязычном сайте WCH они не упоминаются, только в китайской его части. Кто сталкивался или интересуется - прошу высказыватся.
  4. Продам мк stm32f030f4p6, оригинал, упаковка в ленте, в наличии 500 шт. Цена - 90р/шт При желании доставим в любой город РФ.
  5. День добрый. Задача... Нужна общая линия тревоги, устойчивая к помехам. К ней подключаются 1-10 блоков, каждый на расстоянии 1-5м друг от друга, соотв. максимальная длина линии 50 м. Любой блок может активировать линию (логическое "или") и каждый блок узнает, если линию активировал другой блок. Все блоки питаются 24в с общего БП. В каждом блоке STM32F103. Решение... Линию просаживаю биполярным транзистором с ОК, оптопарой слушал линию. Проблема... На столе работает как нужно. Любой блок может активировать линию, и все об этом узнают. НО когда имитирую работу в тяжелых (нормальных рабочих) условиях, проводами линии обвешиваю 3-х фазный электродвигатель - начинается произвольная активация линии. Предположил открывается транзистор, пытался менять номинал R5 - не помогло, хотя на 2к перестал открываться от касания пальцем. Предположил срабатывает светодиод оптопары, пытался "приглушить" номиналом R3 до 2к - нет разницы. Подскажите пожалуйста, как доработать мою схему (или может другой схемой), решить задачу. В электронике слаб, буду очень признателен, если поправите неправильные номиналы, подскажите что поменять. P.S. Возможна зацепка... При подключении 2-х блоков, наводки как буд-то сильнее и наводятся быстрее, чем если подключены 8 блоков. При 2 блоках светодиоды (имитируют вход МК) горят на 20%, МК активацию линии (лог 0) ловит практически сразу при включении электродвигателя. При 8 блоках светодиоды помаргивают еле еле, МК активацию линии ловит секунд через 10.
  6. Сначала суть проблемы, а потом собственно вопрос. Встал вопрос и переносе проекта с PIC18 на STM32 - основная причина - нехватка скорости АПЦ, скорости работы, плюс увеличение разрядности АПЦ с 10 до 12 бит. Раньше с STM32 почти не работал. Выбор пал на STM32F401CCU6. Тактовая устраивает, скорость АЦП тоже. Цена опять же вполне приемлемая. Начал изучать АПЦ - а там чудеса... Внутри не оказалось источника опорного напряжения, даже одного. В корпусах 48/64 вывода вывод Vref+ не выведен на ружу. Точнее он объединен с VDDA. Т.е. диапазон измеряемых напряжение от 0 до 3-х вольт (питания 3В). Vref- даже если в большом корпусе выведен отдельным выводом, он обязательно должен быть соединен с землей. Т.е. смещение шкалы АЦП такого вида не пройдет: на Vref- 0.4В, на Vref+ 2.2В. Измеряем в коридоре 1,8В. С PIC18 такое легко прокатывает. Собственно вопрос - есть ли среди STM32 камни с более развитым модулем АЦП? Чтобы можно было, бы хотя бы, просто на Vref+ подать 2В, не в монструозном корпусе.
  7. Здравствуйте! Имеется разработанная плата с STM32F407VET6 и PHY DP83848 для реализации Ethernet-передачи(планируется TCP-клиент или сервер). STM32F407VET6 и DP83848 соединяются по MII-интерфейсу. Используется LWIP-стек. DP83848 тактируется от отдельного кварца на 25 МГц, микроконтроллер - также от отдельного на 25 МГц. Плата и ПК соединены напрямую по Ethernet-кабелю, без роутеров и маршрутизаторов. Проект был сгенерирован из CubeMx в Keil v5.27. Далее в цикл While() добавил MX_LWIP_Process(), скомпилировал, прошил. Основная проблема - МК не принимает данные от DP83848. Что было проверено/сделано: 1. Сверил все адреса регистров/значений из даташита на DP83848 с тем, что выдает CubeMx. Пришлось в некоторых местах исправить. 2. Проверил повторно схему, соответствие подключаемых выводов на обоих сторонах (STM32 и DP83848), еще раз сверился с требованиями по подключению DP83848 из даташита. 3. Проверил осциллографом сигналы на RXD0..RXD3 - имеются (т.е. DP83848 принимает сигналы с ПК, и передает затем STM32, но он их не воспринимает что-ли?), RX_CLK и TX_CLK - имеются, генерация от кварца есть. 4. Назначил IP адрес, маску и узел в настройках адаптера Ethernet на ПК. 5. Попытался понять, где же все-таки происходит "затык", прошелся последовательно по функциям: While() -> MX_LWIP_Process() -> ethernetif_input(&gnetif) -> low_level_input(netif) -> HAL_ETH_GetReceivedFrame(&heth). В функции HAL_ETH_GetReceivedFrame(&heth) есть условие: if(((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET)), в него программа не заходит. Подумал, что возможно что-то с DMA, но так и не получилось понять. 6. Хотел проверить в RMII-режиме - схема и разводка платы не позволяет (P.S.- Хотя конечно, можно настроить "нестандартно" тактирование STM32, пустить 50 МГц с MCO на RX_CLK и X1 у DP83848 через доп.провода) После вышеописанных действий результата нет. Скриншоты с настройкой из CubeMx прикрепил. Также прикрепил пару скриншотов из WireShark, скриншоты "фейкового" пинга из командной строки и общих настроек LWIP. В WireShark видно, что ПК постоянно спрашивает "Who has 192.168.1.1.?", а плата шлет какие-то запросы (наверно связаны с автосогласованием при включении DP83848), но не слышит ПК. Я понимаю, что применять CubeMX не очень "рационально", но имеется потребность в кратчайшие сроки реализовать связь по Ethernet для передачи данных. Буду рад любым подсказкам.
  8. Место работы - удаленно. Оплата труда - по договоренности. Сроки - как можно быстрее. Суть задачи. Имеется некая новая плата в составе большой установки, на этой плате установлен контроллер STM32F407ZGT6. Есть два импульсных входа, и вход по RS485 для связи с остальной инфраструктурой по протоколу Modbus. Есть служебный разъем для прошивания. По Модбасу приходит команда Start, начиная с этого момента запускается счет импульсов по первому входу, и от него запускается счет по второму входу. По команде Stop счет импульсов прекращается синхронно (первый затем второй). Затем накопленные данные должны быть переданы наверх по Модбасу. Телефон для связи в личке.
  9. Здравствуйте! Имеется отладочная плата с STM32F303. Задача: измерять импульсный сигнал длинной 100 мкс и частотой 1000 Гц и выводить измерения на ПК. Запускаю два таймера. Первый имитирует измеряемый сигнал. Второй "толкает" АЦП Измеряю через внутренний 12-битный АЦП с использованием ДМА и запуском по таймеру. и сохраняю измерения в массив. Затем этот массив через ДМА передаю ЮАРТУ и вывожу на ПК. На выходе получаю поток невнятных чисел. Помогите разобраться в чем ошибка.
  10. Приветствую, столкнулся с проблемой при записи данных с АЦП, посредством библиотеки FATFS на SD карту. Данные с АЦП формируются в массив, после чего последовательностью функций f_mount, f_open, f_write записываются на SD карту, однако иногда функция f_write возвращает результат FR_INVALID_OBJECT и запись прерывается. Копнув глубже увидел что такой статус появляется из за того, что функция HAL_SD_GetCardState возвращает странный статус HAL_SD_CARD_SENDING, который описан как sd card is sending operation information. Большего описания нигде не нашел. Проблема исчезает посредством увеличения делителя частоты тактирования SDIO, что в свою очередь значительно режет скорость передачи созданного файла с данными на пк посредством USB HS, с чем вроде можно и свыкнуться, но хотелось бы разобраться в чём причина. Возможно кто-то сталкивался с подобной проблемой и может помочь.
  11. Привет, народ! Заметил такую странность, которую не знаю как объяснить. Плата STM32F103C8T6 (Blue Pill) Я хотел сделать мигание светодиодом на ноге A0 при инициализации контроллера на 72MHz. Взял сделанный ранее проект и стал его упрощать. И вот когда оставил в проекте, по-сути, только: - инициализацию на 72Mhz - включение тактирования портов - настройку пина A0, то заметил, что код мигания стал работать медленнее! Т. е. мигание, сделанное в бесконечном цикле, стало в 1.5-2 раза медленнее, чем было до. Я стал разбираться, что могло на это повлиять. И вернул вызов ненужной функции, в которой инициализировались пины A8, A9, B3, B4, B6, B7. И о чудо, мигание стало опять быстрым! Повторюсь, в этой функции делается только инициализация пинов, и она вызывается один раз в начале программы, ничего более. Вот полный код: https://pastebin.com/Z7d0LZif А вот код функции, которая "разгоняет" выполнение кода: // Настройка пинов A8, A9, B3, B4, B6, B7 void otherPortInit(void) { // Для начала сброс конфигурации всех используемых портов в ноль GPIOA->CRH &= ~(GPIO_CRH_MODE8 | GPIO_CRH_CNF8); GPIOA->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9); GPIOB->CRL &= ~(GPIO_CRL_MODE3 | GPIO_CRL_CNF3); GPIOB->CRL &= ~(GPIO_CRL_MODE4 | GPIO_CRL_CNF4); GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6); GPIOB->CRL &= ~(GPIO_CRL_MODE7 | GPIO_CRL_CNF7); uint32_t mode; uint32_t cnf; mode=0b11; // Режим выхода, с максимальной частотой 50 МГц cnf=0b00; // Режим push-pull GPIOA->CRH |= (mode << GPIO_CRH_MODE8_Pos) | (cnf << GPIO_CRH_CNF8_Pos); GPIOA->CRH |= (mode << GPIO_CRH_MODE9_Pos) | (cnf << GPIO_CRH_CNF9_Pos); mode=0b00; // Режим входа cnf=0b01; // Режим плавающего входа, подтяжки нет GPIOB->CRL |= (mode << GPIO_CRL_MODE3_Pos) | (cnf << GPIO_CRL_CNF3_Pos); GPIOB->CRL |= (mode << GPIO_CRL_MODE4_Pos) | (cnf << GPIO_CRL_CNF4_Pos); GPIOB->CRL |= (mode << GPIO_CRL_MODE6_Pos) | (cnf << GPIO_CRL_CNF6_Pos); GPIOB->CRL |= (mode << GPIO_CRL_MODE7_Pos) | (cnf << GPIO_CRL_CNF7_Pos); } Я не могу эту вещь объяснить. Почему настройки пинов, которые не используются в коде, так странно влияют на скорость выполнения программы контроллером? Мало того, в базовом проекте, на точно таком же коде я обнаружил обратный эффект: вызов этой функции инициализации портов замедляет мигание, а комментирование ее вызова - ускоряет. В общем, я в недоумении. Я вообще не ожидал, что такое поведение возможно. Это тормозит разработку домашнего проекта, потому то в нем критична реакция на сигналы длительностью ~500нс, и тут я вижу, что тупой бесконечный цикл работает с разной скоростью в зависимости от инициализации неиспользуемых портов. Вопрос 1: Как единственный вызов этой функции может влиять на скорость выполнения основного цикла? Вопрос 2: Почему вызов этой функции может давать строго обратный эффект?
  12. Привет, народ. Пытаюсь разобраться как прошивать плату STM32F103C8T6 (Blue Pill) по miniUSB-кабелю. Свои изыскания я записываю здесь: Как прошивать Blue Pill STM32 F103 через обычный USB-кабель в Linux Затык происходит на том, что я прошиваю DFU-бутлоадер в плату, плата становится видна по USB: [25760.232130] usb 2-2: new full-speed USB device number 7 using xhci_hcd [25760.385437] usb 2-2: New USB device found, idVendor=1eaf, idProduct=0004, bcdDevice= 2.00 [25760.385444] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [25760.385447] usb 2-2: Product: Maple [25760.385449] usb 2-2: Manufacturer: LeafLabs [25760.424009] cdc_acm 2-2:1.0: ttyACM0: USB ACM device [25760.424307] usbcore: registered new interface driver cdc_acm [25760.424310] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters Однако утилита dfu-util (версии 0.9) ни одной платы не видит. И версия 0.8 тоже не видит: > dfu-util --list dfu-util 0.9 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2016 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ Пробовал давать команду с указанием id-шников устройства: dfu-util -d 1eaf:0004 --list так тоже DFU-устройство не обнаруживается. Пробовал и под рутом, и от обычного пользователя, хотя DBUS правило для доступа пользователем прописывается при установке пакета dfu-util (Debian Linux 11). Что еще нужно донастроить, чтобы увидеть DFU-устройство?
  13. Продаются оказавшиеся лишними новые компоненты: STM32L151CCT6 80 шт - по 1000 р STM32L151C6U6A 29 шт - по 500 р atmega328pb 7 шт по 600 р Резисторы SQP 10 Вт 36 Ом 200 шт по 20 р BD244C TO-220 100 шт по 80 р itcrs собак sibnet.ru Возможны различные варианты как по оплате так и по доставке.
  14. Привет, народ. Купил себе на пробу STM32F103C8T6 (BluePill) с программатором STLink-V2. Вот что о нем рассказывает st-info --probe: Found 1 stlink programmers serial: 132014026315303030303032 openocd: "\x13\x20\x14\x02\x63\x15\x30\x30\x30\x30\x30\x32" flash: 65536 (pagesize: 1024) sram: 20480 chipid: 0x0410 descr: F1 Medium-density device Установил среду STM32CubeIDE Version: 1.8.0 Build: 11526_20211125_0815 (UTC). И попытался собрать и запустить программку мигания светодиодом. Сделал новый проект для STM32F103C8Tx, настройки брал из вот этого видео: https://www.youtube.com/watch?v=e_NSqz5P8Qk По-сути сгенерировался дефолный проект для STM32F103C8Tx, частота настроена на 72MHz, активирован пин PC13 на режим Output. В коде в бесконечный цикл вписаны команды: while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); } По ходу попыток запуска, вначале STM32CubeIDE сказал, что прошивка устарела, и надо обновить. Я согласился, но пришлось пару раз вставить-вытащиить программатор в USB, так как была ошибка: st-link is not in the DFU mode. Please restart it. Прошивка залилась, а в сети нашел инфу что если обновление прошивки предваряется такой ошибкой, то это нормально. Потом пришлось подредактировать файл stm32f1x.cfg, так как при запуске была ошибка: linux gdb ST-LINK: Could not verify ST device! Abort connection. Эту ошибку убрал по инструкции: https://stackoverflow.com/questions/58783393/atollic-couldnt-verify-st-device, заодно отладку переключил с STLink GDB Server на STLink OpenOCD (сам GDB, естественно, установлен и работает, обычный C/C++ код через него отлаживается). В результате, после устранения предыдущей ошибки, стали появляться другие ошибки: Error: STM32F103C8Tx.cpu -- clearing lockup after double fault Polling target STM32F103C8Tx.cpu failed, trying to reexamine Насколько я понял, эти ошибки возможны из-за того, что программа либо не запускается, либо крашится уже на самом микроконтроллере по причине неправильной настройки диапазонов адресного пространства или какой-то периферии. Тогда я решил снова сделать новый проект, все повторил заново, и на этот раз почти получилось. Во всяком случае, явных ошибок в логе запуска нет. Но светодиод не мигает, отладка не работает: Open On-Chip Debugger 0.11.0+dev-00438-ga75fc63 (2021-11-03-15:26) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections Info : STLINK V2J39S7 (API v2) VID:PID 0483:3748 Info : Target voltage: 2.427853 Info : Unable to match requested speed 8000 kHz, using 4000 kHz Info : Unable to match requested speed 8000 kHz, using 4000 kHz Info : clock speed 4000 kHz Info : stlink_dap_op_connect(connect) Info : SWD DPIDR 0x2ba01477 Info : STM32F103C8Tx.cpu: Cortex-M3 r2p1 processor detected Info : STM32F103C8Tx.cpu: target has 6 breakpoints, 4 watchpoints Info : starting gdb server for STM32F103C8Tx.cpu on 3333 Info : Listening on port 3333 for gdb connections Info : accepting 'gdb' connection on tcp/3333 Info : device id = 0x20036410 Info : flash size = 64kbytes undefined debug reason 8 - target needs reset O.K. O.K.:0xE00FFFD0 undefined debug reason 8 - target needs reset shutdown command invoked Info : dropped 'gdb' connection Я пробовал собрать и запуститься в режиме релиза (переткнул и конфигурацию и билд на Release), но почему-то при запуске RUN все равно IDE пытается запустить дебаггер, ей это не удается, лог запуска все тот же. Дальше я уже не знаю что делать. Прошу посоветовать что где еще надо докрутить, чтобы помигать светодиодом. * * * UPD: Иногда запуск почему-то происходит по-другому, хотя ничего ни в коде ни в конфигурации не меняю. Запуск сопровождается появлением окна с ошибкой: Could not verify STM device! Хотя, как написано выше, такая ошибка была, и верификация устройства отключена (в начало файла stm32f1x.cfg добавлена строка set CPUTAPID 0). Выхлоп запуска при этом немного другой, строки с Info те же самые, но в конце такие ошибки: undefined debug reason 8 - target needs reset O.K. O.K.:0xE00FFFD0 Error: Failed to read memory at 0xfffffffe Error: Failed to read memory at 0xfffffffe undefined debug reason 8 - target needs reset shutdown command invoked Info : dropped 'gdb' connection Вот как выглядит скриншот: https://ibb.co/JvyD2HK
  15. Добрый вечер, настроена база для передачи информации по сети CAN. не работает простой колбек (помигать светодиодом при получении сообщения) . Если смотреть при отладке код вылетает из if как я понял в моменте проверки на наличие инфы в FIFO. Rx data после отправки сообщения остается пустым. Буду благодарен за любой совет, готов ответить на конкретизирующие вопросы. /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc; CAN_HandleTypeDef hcan; TIM_HandleTypeDef htim1; /* USER CODE BEGIN PV */ CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint32_t TxMailbox = 0; uint8_t TxData[8] = {0,}; uint8_t RxData[8] = {0,}; CAN_FilterTypeDef sFilterConfig; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC_Init(void); static void MX_CAN_Init(void); static void MX_TIM1_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC_Init(); MX_CAN_Init(); MX_TIM1_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start(&htim1); HAL_CAN_Start(&hcan); TxHeader.ExtId = 0; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = ENABLE; HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR | CAN_IT_BUSOFF | CAN_IT_LAST_ERROR_CODE); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) > 0) { TxHeader.StdId = 0x0378; for (uint8_t i = 0; i < 8; i++) { TxData[i] = i; } } HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox); HAL_Delay(500); HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxData); if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK) { HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_RESET); } HAL_Delay(500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } ....описание функицй static void MX_CAN_Init(void) { /* USER CODE BEGIN CAN_Init 0 */ /* USER CODE END CAN_Init 0 */ /* USER CODE BEGIN CAN_Init 1 */ /* USER CODE END CAN_Init 1 */ hcan.Instance = CAN; hcan.Init.Prescaler = 4; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan.Init.TimeSeg1 = CAN_BS1_8TQ; hcan.Init.TimeSeg2 = CAN_BS2_7TQ; hcan.Init.TimeTriggeredMode = DISABLE; hcan.Init.AutoBusOff = DISABLE; hcan.Init.AutoWakeUp = DISABLE; hcan.Init.AutoRetransmission = DISABLE; hcan.Init.ReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN CAN_Init 2 */ sFilterConfig.FilterBank = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14; /* USER CODE END CAN_Init 2 */ } void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK) { HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_SET); HAL_Delay(50); HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_RESET); HAL_Delay(50); } }
  16. Разработка электроники. Полное ведение проекта, от проработки устройства, написания софта и firmware до отладки образца. FPGA Xilinx - проекты любой сложности. Опыт больше 20 лет. STM32 - включая BLE устройства. Большой опыт разработки для разных заказчиков. Altium Designer - разработка печатных плат. Опыт работы с JKLC PCB. Сделаны многие проекты. Написание приложений под ОС Android. ADC приложения и ЦОС (DSP). Почта для связи [email protected]
  17. Всем добрый день! На работе поручили заняться разработкой нового прибора на микроконтроллере STM32 (исходя из технической задачи мой выбор пал на STM32F407VE) с обязательным условием - использование ОСРВ FreeRTOS. С микроконтроллерами знаком, разрабатывал на их основе пару приборов, но с данной ОСР не работал никогда, и поэтому хочу попросить здесь совета. Работаю в STM32CubeIDE. Одна из возможностей моего девайся - это ручное управление коллекторным двигателем. В проекте я настроил две ножки на внешние прерывания GPIO_EXTI_3 и GPIO_EXTI_4. Включена подтяжка по питанию и срабатывание прерывания по любому изменению фронта сигнала (прибор должен реагировать на нажатие/отпускание кнопок. Пока одна из кнопок нажата - крутим вверх или вниз, а если отпустили, то остановка). Схемотехнически нажатие кнопки коммутирует вход МК с землёй. Программно я себе это представлял так: Срабатывание прерывания на одном из входов -> В перывании определяем, какой именно фронт пришёл -> Если фронт низкий, то крутим двигатель || Если фронт высокий, то останавливаемся. Вставлять в прерывание функцию вращения двигателем я, разумеется не стал. Вместо этого я решил в зависимости от статуса кнопки пересылать в функцию управления двигателем семафор. Условно говоря, код выглядит так: void EXTI3_IRQHandler(void) //Кнопка вращения двигателя вверх { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3) == GPIO_PIN_SET) //Если на входе высокий уровень, то пока ничего не делаем { asm("nop"); } else //Если уровень изменился, то { xSemaphoreGiveFromISR(sem_curr_upHandle,NULL); //Даём семафор из прерывания } } // void EXTI4_IRQHandler(void) //Кнопка вращения двигателя вниз { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_4) == GPIO_PIN_SET) //Если высокий уровень, то ничего не делаем { asm("nop"); } else //В противном случае выдаём семафор { xSemaphoreGiveFromISR(sem_curr_downHandle,NULL); } } Задача, в которой я собираюсь вращать двигателем, выглядит так: void poll_button(void const * argument) { for(;;) { if(xSemaphoreTake(sem_curr_upHandle,portMAX_DELAY) == pdPASS) //Если семафор на вращение вверх принят функцией и равен одному (время ожидания семафора максимальное) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET); } else if(xSemaphoreTake(sem_curr_downHandle,portMAX_DELAY) == pdPASS) //Если семафор на вращение вниз принят функцией и равен одному (время ожидания семафора максимальное) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET); } } } В качестве отлаживающего механизма использую светодиоды (их и пытаюсь зажечь на отладочной плате в зависимости от полученного семафора), но после прошивки платы ничего не происходит. Я понимаю, что код ещё не дописан, так как после отжатия кнопки мне надо вернуть семафор обратно (правильно ли - "вернуть"?), но по идее данная конструкция уже должна его "выдать", а задача - "принять", и в соответствии с этим что-то сделать. Поэтому мои вопросы заключаются в следующем: 1. Правильна ли моя идея с использованием семафоров в принципе для данной ситуации? В любом случае, эту ОСРВ мне надо изучать по работе; 2. После отдачи семафора по нажатию кнопки - как его вернуть обратно после её отжатия? 3. Задача poll_button не реагирует на полученный семафор. Если в одном из условий изменить "== pdPass" на "!= pdPass", то светодиод будет гореть, но если так сделать в двух условиях, то всё равно будет гореть только один светодиод, будто бы задача по какой-то причине зависает. Что это может быть? Заранее всех благодарю за ответы.
  18. В продолжение темы про защиту открытого бинарника прошивки ... Уже давно хочу сделать простенький вариант ЧПУ контроллера. Чтоб можно было и с готовыми ЧПУ системам (Mach3, LinuxCNC, ...) юзать. И, при желании, со своим вариантом ЧПУ связку сделать. Одна только проблема - в электронике не силён. Все варианты схем и разводки платы буду выкладывать прямо здесь. Опытных людей здесь много. Поэтому, если не трудно, посмотрите, что у меня получилось и обязательно дайте пинка где что исправить. Проект рисовал в easyeda, чтоб было удобно расшарить и, в последствии, заказать изготовление плат (с монтажом или без). Что требуется от контроллера: Быстрая коммуникация c ПК по сети (Ethernet 10/100) Достаточное кол-во цифровых входов/выходов (с переключаемыми уровнями 5..24V) для управления шаговыми (и серво) драйверами, лазерными модулями, энкодерами, концевиками, индуктивными датчиками и т.п. Как минимум один порт RS485 для управления частотниками (VFD) https://oshwlab.com/MX_Master/MX32 Schematic_MX32_2021-08-18.pdf Schematic_MX32_2021-08-18.svg
  19. Друзья, привет. Есть код и схема для сборки частотомера на STM32, но нет сейчас возможности проверить работоспособность данного устройства. Если у кого-нибудь есть свободные 5 минут, не могли бы вы хотя бы без запуска, беглым взглядом посмотрев код, подсказать будет ли оно работать или нет и подсказать ошибки. В лучшем случае протестировать работает ли устройство или нет. Если кто поможет, буду чрезвычайно благодарен.
  20. Здорова орлы. Проект: stm32h743 читает кадры с камеры по DCMI и кидает их по UDP(lwip работает), на стороне ПК работает прога на Qt, принимает кадры, отображает(я сделал минимальную обвязку типа протокола), все хорошо, 20-30 FPS. Разрешение: 640х512, 1 байт на пиксель, размер кадра 327.680 байт, JPEG не используется. Задача: отобразить это видео в браузере, без Qt программки. Смотрел в сторону RTSP-библиотек, но не нашел ничего относительно простого под embedded, посоветуйте что-нибудь.
  21. здравствуйте уважаемые форумчане. хочу познакомиться с микроконтроллерами и попытаться мигнуть светодиодом без IDE и библиотек. помогите пожалуйста с выбором для этой цели самого микрокотроллера и остального необходимого для этой цели. если проще, то скажите пожалуйста что нужно купить чтобы мигнуть светодиодом без IDE и библиотек. какой контроллер, какой программатор и uart, если он нужен. бюджет небольшой. желательно чтобы это можно было купить на Aliexpress. пожалуйста отнеситесь серьезно. потому что я могу не понять вашей шутки, если вдруг вы решите пошутить...
  22. Доброй всем, кто подскажет по какой то причине после загорания флажка RXFLVL при преёме setup паккета. после чтения флаг не тухнет. может я нетак четайо с fifo? в документах написано что должен сам тухнуть. code: ;define OTG_FS_H equ 0x5000 OTG_FS_L equ 0x0000 RX_FIFO_STR equ 0x1000 __usb_int proc push {LR} movw r9,#OTG_FS_L movt r9,#OTG_FS_H ldr r0,[r9,#OTG_GINTSTS_B] tst r0,#USBRST beq jmp_usb_int_reset_skip bl _device_init b jmp_usb_int_end jmp_usb_int_reset_skip tst r0,#ENUMDNE beq jmp_usb_int_enmflag_skip bl _device_enmflag b jmp_usb_int_end jmp_usb_int_enmflag_skip tst r0,#RXFLVL beq jmp_usb_int_rx_skip ldr r0,[r9,#OTG_GRXSTSR_B] ; and r1,r0,#EPNUM_MASK cmp r1,#ENPOINT0 bne jmp_usb_int_rx_endpoint1 bl _endpoint0_rx b jmp_usb_int_end jmp_usb_int_rx_endpoint1 b jmp_usb_int_end jmp_usb_int_rx_skip tst r0,#IEPINT jmp_usb_int_end pop {LR} BX LR endp _endpoint0_rx proc push {LR} ;acording to datasheet add r8,r9,#(RX_FIFO_STR) ;point to rxfifo start and r1,r0,#PKTSTS_MASK cmp r1,#PKTSTS_SETUP_REC bne jmp_endpoint0_rx_setup_rec ;disable ldr r1,[r9,#OTG_GINTMSK_B] bic r1,#(RXFLVL) str r1,[r9,#OTG_GINTMSK_B] mov r1,#BCNT_MASK ands r1,r0 ;adviced to test BYT_COUNT before poping fifo to avoid undefined behavior!!! beq jmp_endpoint0_rx_end ;first 4byt are status data ldr r0,[r8] mov r1,#BCNT_MASK and r1,r0 lsr r1,#4 ;byte received and r2,r0,#FRMNUM_MASK lsr r2,#21 ldr r3,[r8] ;only 4byt read alowed ldr r4,[r8] ;ldr r5,[r8],#4 mov32 r0,#(PKTCNT_CNT_OUT_MASK|STUPCNT_3PACK|0x40) ;pack size max 64 str r0,[r9,#OTG_DOEPTSIZ0_B] mov r0,#(CNAK) str r0,[r9,#OTG_DOEPCTL0_B] tst r3,#GET_BIT beq jmp_endpoint0_rx_setup_set and r1,r3,#GET_2BYT_MASK cmp r1,#GET_DESKRIPTOR bne jmp_endpoint0_rx_setup_get_next and r1,r3,#GET_4BYT_MASK cmp r1,#DEVICE_DESCRIPTOR bne jmp_endpoint0_rx_setup_get_next_descriptor ; bl _send_device_descriptor b jmp_endpoint0_rx_setup_get_end jmp_endpoint0_rx_setup_get_next_descriptor b jmp_endpoint0_rx_end ;---------- setup get ---------------------------------------- jmp_endpoint0_rx_setup_get_next jmp_endpoint0_rx_setup_get_end ldr r0,[r9,#OTG_GINTMSK_B] orr r0,#(RXFLVL) str r0,[r9,#OTG_GINTMSK_B] b jmp_endpoint0_rx_end ;*****SETUP set cmd *************************** jmp_endpoint0_rx_setup_set ldr r0,[r9,#OTG_GINTMSK_B] mov r0,#(RXFLVL) str r0,[r9,#OTG_GINTMSK_B] b jmp_endpoint0_rx_end jmp_endpoint0_rx_setup_rec cmp r1,#PKTSTS_SETUP_CMPL bne jmp_endpoint0_rx_out_cmpl mov32 r0,#(PKTCNT_CNT_OUT_MASK|STUPCNT_3PACK|0x40) ;pack size max 64 str r0,[r9,#OTG_DOEPTSIZ0_B] mov r0,#(CNAK) str r0,[r9,#OTG_DOEPCTL0_B] ;bl _send_device_descriptor b jmp_endpoint0_rx_end jmp_endpoint0_rx_out_cmpl cmp r1,#PKTSTS_OUT_CMPL bne jmp_endpoint0_rx_next ldr r0,[r8] b jmp_endpoint0_rx_end jmp_endpoint0_rx_next ldr r0,[r9,#OTG_GINTMSK_B] ;bic r0,#(RXFLVL) ;str r0,[r9,#OTG_GINTMSK_B] ;ldr r0,[r8] ;mov r0,#0 ;str r0,[r8] jmp_endpoint0_rx_end pop {LR} BX LR endp
  23. Добрый день! Пытаюсь настроить связь МК STM32l072 с трансивером SX1276 по шине SPI. Использую HAL библиотеку. На осциллограмме вижу, что CLK, MOSI и NSS какие нужно, а вот на приеме MISO тишина. Пробую на отладочной плате B-L072Z-LRWAN1 Код настройки SPI и осциллограмму прикладываю void MX_SPI2_Init(void) { SPI_HandleTypeDef hspi2; hspi2.Instance = SPI2; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.Direction = SPI_DIRECTION_2LINES; hspi2.Init.DataSize = SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; hspi2.Init.NSS = SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial = 7; if (HAL_SPI_Init(&hspi2) != HAL_OK) { Error_Handler(); } } void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(spiHandle->Instance==SPI2) { /* USER CODE BEGIN SPI2_MspInit 0 */ /* USER CODE END SPI2_MspInit 0 */ /* SPI2 clock enable */ __HAL_RCC_SPI2_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_SPI2_MOSI|GPIO_SPI2_MISO; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF_SPI2; HAL_GPIO_Init(GPIO_SPI2_PORT_M, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_SPI2_SCK; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF_SPI2; HAL_GPIO_Init(GPIO_SPI2_PORT_SCK, &GPIO_InitStruct); /* USER CODE BEGIN SPI2_MspInit 1 */ /* USER CODE END SPI2_MspInit 1 */ } } У кого какие мысли?)
  24. Я полный чайник в МК. Прикупил себе STM32-E407 и установил keil 5.24. Перед тем как суваться в keil. Я попытался прошить через Arduino по инструкции из даташита. Все было успешно. Потом, я пытался уже что-то сделать в keil. Для начало хотел просто убедиться, что keil видит плату, но увы. Я прочитал куча решений и ни одна мне не помогла. Устанавливал дрова из этой папки F:\Keil_v5\ARM\STLink\USBDriver. Все равно не видит. Поменял STLinkUSBDriver.dll, все равно никакого отклика. Диспетчер устройств находит его вот так. Назначал через программу Zadig драйвер WinUSB. Подключение платы выглядит следующим образом Мне кажется, что я уже все поломал и у меня куча драйвер уже установлено на компьютер. Запутался, что делать?
  25. Здравствуйте! Имеется задача. С аналоговой камеры видеосигнал поступает в STM32 через встроенный АЦП. Необходимо вывести изображение на дисплей. В качестве видеобуфера используется RAM контроллера. Изображение размером 160x120, поэтому встроенной RAM достаточно. Изображение буду выводить через LTDC. Вот тут вычитал, что руководить этим должен LTDC. В смысле, если используется несколько видеобуферов, то LTDC должен формировать прерывание в конце кадра и в прерывании менять адреса видеобуфера. Запуск камеры, я так понимаю, тоже должен быть в этом прерывании. Но какими должны быть частоты работы камеры и вывода изображения на дисплей в этом случае? В смысле, кто быстрее должен работать? или нужно подобрать одинаковые частоты? Действительно ли требуется минимум 3 видеобуфера или при определенных соотношениях частот достаточно 2?
×
×
  • Create New...