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

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • admin
    • Питание
    • Ремонт
    • Системы охраны и наблюдения. Личная безопасность
    • Роботы и модели на ДУ-управлении
    • Световые эффекты и LED
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Металлоискатели
    • Автоматика
    • Электрика
    • Промышленная электроника
    • Измерительная техника
    • Мастерская радиолюбителя
    • КВ и УКВ радиосвязь
    • Радиопередатчики
    • Сотовая связь
    • Спутниковое ТВ
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • admin
    • Литература
    • Схемотехника для профессионалов
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
    • МК для начинающих
    • admin
    • AVR
    • STM32
    • PIC
    • ПЛИС
    • Другие микроконтроллеры и семейства
    • Алгоритмы
    • Программаторы и отладочные модули
    • Периферия и внешние устройства
    • Разное
  • Товары и услуги
    • Коммерческие предложения
    • Продам-Отдам, Услуги
    • Куплю
    • Уголок потребителя
    • Вакансии и разовая работа
    • Наши обзоры и тесты
  • Разное
    • Курилка
    • Сайт Паяльник и форум
    • FAQ (Архив)
    • Технический английский (English)
    • Личные блоги
    • Наши проекты для Android и Web
    • Корзина
    • Конкурсы сайта с призами
    • Вопросы с VK
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube

Blogs

  • Твори, выдумывай, пробуй.
  • fant's блог
  • Ток покоя
  • Где купить велпатасвир, epclusa, velpanat, velasof, софосбувир в России по лучшей цене.
  • Китайские бренды видеокамер
  • Создание Маленькой Мастерской
  • Блог администрации
  • STEN50's блог
  • Изучение, наладка, исследование
  • MiSol62's блог
  • короткие записки по ходу дела
  • Программирование AVR и PIC блог
  • Стабилизированный выпрямитель тока ТЕС 12-3-НТ
  • Блог getshket
  • ТНПА
  • welder's блог
  • blog cheloveka loshadi
  • OPeX3's блог
  • Подводная робототехника
  • Сабвуфер и акустика.
  • Радиоуправляемая машина
  • Консультация психолога сексолога онлайн, психолог онлайн
  • Nokian блог
  • Оповещения Dermabellix Scam !! Не покупайте это !!!
  • Cheerful Boss' блог
  • Cheerful Boss' блог
  • VLAD1996B's блог
  • "Коллективное увеличение продаж"
  • Dudok's блог
  • "Коллективное увеличение продаж"
  • Goluboglazyi's блог
  • Прибор определяющий электролитический конденсатор на работоспособность.
  • Mosfet@'s блог
  • mazzi's блог
  • Лучшие компьютерные игры 2017
  • Marchenkokerya's блог
  • Заметки начинаущего аудиофила
  • Почти бесполезные проги
  • Светлый блог.
  • дядюшка Филин's блог
  • Дневники нуба
  • satyrn's блог
  • Люк. В погреб.
  • Фильм Дом Солнца
  • Светодиодная лента B-LED 2835-120 W белая негерметичная
  • Само-Реплицируещиеся Производственные Системы
  • Блог от Eknous
  • РВС's блог
  • Den_R's blog
  • РВС's блог
  • Чтото крутое и про криворукость
  • ekadom's блог
  • Проектирование любых чертежей
  • Lisovic's блог
  • Блог уже не юного радиогубителя
  • денди
  • eHouse
  • zaregan's блог
  • Схемотехника УНЧ с низковольтным питанием на примере приёмников фирмы Grundig
  • То, что в руки попало.
  • Блок питания водородного генератора и все что с ним связано
  • slava_va@mail.ru's блог
  • Блог alex123al97
  • slava_va@mail.ru's блог
  • параленое соединение КРЕНок или как сделать стабилизатор напряжения 24-12в
  • Свободная генерация Андрея Мельниченко
  • реобас
  • Модернизации системы впрыска на 555
  • помощь
  • Копии схем и печатных плат устройств попавшие ко мне
  • MBM75's блог
  • Буду
  • lagutai's блог
  • Мои проекты.
  • lagutai's блог
  • Трудовик
  • vOVK@'s блог
  • токарь-радиолюбитель
  • azlk3000's блог
  • Коллизия сингулярности
  • SmallAlex's блог
  • Вопрос по Цифровому усилителю мощности звука 2x12 Вт YDA138-E
  • bebulo's блог
  • Простейший макет станка термо-вакуумной формовки
  • Блог им. pryanic
  • peratronika
  • Zer's блог
  • MEDBEDb's
  • Гнездо кукушки
  • hiMiческий блог
  • luna_kamen's блог
  • Изучаем USI на основе сверхэкономичного прототипа
  • Алекс-Юстасу
  • SUBWOOFER.RU
  • kot sansher's блог
  • Поделки стареющего пионера
  • доброжелатель2's блог
  • Grig96. Полезные заметки.
  • Attiny 0-ой и 1-ой серии (Attiny817, 1614 и прочие)
  • pavlo's блог
  • MSP430FR
  • viper2's блог
  • Моя Электро Чинильня
  • Selyk's блог
  • VoltServis.ru
  • kpush's блог
  • OM3 на новых платах.
  • конни's блог
  • Электронный экстазёр "MASHKA".
  • ptimai's блог
  • noc functionalities
  • Sun kapitane's blog
  • ODEON AV-500
  • Sun kapitane's blog
  • Логика на транзисторах,диодах, счетние тригери на транзисторах
  • AleksandrBulchuck's блог
  • Качественные окна от производителя
  • KRALEX's блог
  • Javaman's projects
  • SeVeR36's блог
  • 3232
  • Пять копеек.
  • Az@t's блог
  • Индукционный нагрев
  • Схемы разных устройств
  • Кардшаринг SAT ТВ блог
  • PENTAGRID SAYS
  • Ещо раз о "Кощее 5И"
  • Игровые автоматы на официальном сайте
  • коллекционер
  • дямон's блог
  • Ламповый усилитель и акустика для озвучки семейных мероприятий
  • дямон's блог
  • tiosmutoutrup1971
  • Светомузыкальная установка для новачков
  • Лучшие игры для ПК скачать бесплатно
  • sqait's блог
  • Блокнотик
  • Gubernator's блог
  • Записки электрика
  • Полстакана
  • Vrednyuka
  • Интегральные микросхемы
  • grigorik's блог
  • Интегральные микросхемы
  • VMWare удобство и безопастность
  • Профсоюз обычных пользователей
  • rtfcnf's блог
  • Гидроэнергетика в России: отечественные гидроэлектростанции, типы и характеристики
  • VMWare удобство и безопастность
  • Лайфхаки от Кати
  • Kinh chong anh sang xanh gia re
  • ukabumaga's блог
  • АО "Диполь Технологии"
  • artos5's блог
  • блог
  • Kraftwerk's блог
  • 1
  • Kraftwerk's блог
  • Как выбрать точечный светильник?
  • мастерская ky3ne4ik'а
  • Работа с микроконтроллером Atmega8
  • Aronsky
  • Игорь Камский
  • Диммеры
  • 5В = 1,5+3
  • vitiv' блог
  • Ремонт цифровой панели прибора тойоты марк 100. Замена транзистора 36 ( SOT- 23 )PNP
  • Все СРО России
  • 300writers
  • Металлоискатель Tracker FM-1D3
  • Былое
  • Создание монстра "Blaster 8920"
  • 2Smart Cloud Blog
  • EmmGold's блог
  • 2Smart Cloud Blog
  • ivan15961596's блог
  • Кумир у-001
  • ivan15961596's блог
  • My blog
  • Интернет радио в машину
  • SamON
  • Помогите люди добрые
  • AI
  • Помогите подключить маяк 231 стерео.
  • Гаусс-пушки
  • Название
  • 7400's блог
  • Как я собирал свой первый импульсный источник питания
  • Віталік Приходько_130349's блог
  • Lithium ECAD - российская САПР печатных плат
  • Евгений Малюта's блог
  • ПИшу свои мысли
  • werekpro
  • Venera Electronica
  • afurgon's блог
  • Выбросьте это в парашу!
  • odaplus' блог
  • Zvik's блог
  • Smart overload protection power amplifier «Zita (Z) ThermalTrak™»
  • радиоэлектоника
  • BoBka777's блог
  • МиУЗР - Модернизация и Усовершенствование Звуковой Радиотехники .
  • aleksey9900's блог
  • Лабораторная блок питания
  • Нашел статью о пайке проводов к светодиодов
  • Китайский городовой
  • Костик0's блог
  • УФ лампа для маникюра SK-818
  • 8 Contrasts Between Web Servers and Application Servers
  • Конденсатор
  • Новости, обзоры и другая полезная информация от ИМ "Радиодар"
  • Цветомузыка
  • OPeX3's блог
  • Sem2012's блог
  • это не хлам – это часть моей жизни
  • Контроллер на базе ПК (OS Win LTSC)
  • OdiS' блог
  • Хитрости строителя
  • aleksfil's блог
  • Color Preamp - предусилитель на лампах 12AU7
  • Проблема с зарядкой литиевого аккумулятора для шуруповерта 21 вольт
  • EmmGold's блог; AVR
  • Микроэлектроника
  • З
  • CH32V
  • Блог Плотникова Ильи
  • Бесплатные радиодетали с Алиэкспресс
  • Повышение качества и снижение временных затрат при испытаниях электронных компонентов с помощью отечественного испытательного оборудования
  • Источники питания MEAN WELL
  • Жизнь и рыбалка
  • yureika's блог
  • Глушитель спутникогого интернета
  • Всякая всячина
  • Для начинающих
  • Ignite your senses with the grace and allure of female escorts near Laguna Niguel
  • Fumitox's блог
  • Наш-RXT6 топ-10 на январь 2023: Лучшие сайты онлайн казино в России
  • Лицензионные казино онлайн в 2024 году на реальные деньги
  • Самоделки блог
  • Домашняя автоматика
  • Интересное и полезное
  • Ремонт Амфитон 35у-101с
  • ульян's блог
  • Свет в грузовой газели
  • Блок питания 0-12В для начинающих
  • Список лучших онлайн казино (RU+KZ) по играм на реальные деньги: Легальные сайты России по рейтингу 2024
  • Dimko's блог
  • Иван Самец's блог
  • SolomonVR's блог
  • gendzz's блог
  • fleh138's блог
  • Электроника forever!
  • aleksejhozhenets' блог
  • aleksejhozhenets' блог
  • diserver блог
  • aleksey290476 блог
  • ВАРГ's блог
  • Люстра Чижевского
  • wanes101's блог
  • voldemar2009's блог
  • Jana's блог
  • Jana's блог
  • Рена Искужин's блог
  • abduraxman7's блог
  • Kuzumba's блог
  • Самопальник
  • заработок через интернет на запчасти!!!
  • electric.kiev's блог
  • lolo's блог
  • leravalera's блог
  • ideomatic's блог
  • приглашаем на работу инженера-радиоэлектронщика
  • FREEMAN_77's блог
  • Блог автоэлектрика
  • Блог начинающего электронщика
  • Dersu's блог
  • Электроэнергия и её экономия!
  • Электроэнергия и её экономия!
  • Семён Ковалёв's блог
  • piligrim-666's блог
  • помогите с партотивной калонкой
  • помогите с партотивной калонкой
  • Музыка в стене.
  • m-a-r-i-k-a's блог
  • cosmos44's блог
  • oyama14's блог
  • блог Виталика!
  • ciornii's блог
  • Великий и Ужастный блог
  • Denis__Ricov's блог
  • Universal12's блог
  • Sprut's блог
  • Alexeyslav's блог
  • cosmosemo's блог
  • Заметки радиолюбителя
  • Falconist. Мемуары
  • Блог MillyVolt
  • усилитель импульсов
  • Panasonic sa-ak 18
  • Простое радиоуправление из того, что было.
  • 35house
  • Блог Радиочайника
  • Блохи iiiytnik'a
  • Хороший сервис- Бяка
  • Аудиолаборатория "Философия Звука"
  • ОколоCADовое
  • Блог KVLADS
  • Короп блог
  • Автоматизация котла Protherm MTV
  • Бложиг Касянича
  • Обо всём
  • Эксперимент
  • No electronics
  • ПРИРОДА СВЕТА и ЕГО ВОЗМОЖНОСТИ
  • Генератор на xr2206
  • HTPOWLASER
  • Когда-то были очень популярны у радиолюбителей
  • AVR - микроконтроллеры
  • Микроконтроллер
  • Самодельный автосимулятор
  • Интернет-магазин керамической плитки «Боярская Плитка»
  • Разработка электронных метрических мишеней IPSC для мягкой пневматики (страйкбол)
  • ,

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Skype


ICQ


Интересы


Город


Сфера радиоэлектроники


Оборудование

  1. Здравствуйте. У st.com, похоже, что-то сломалось, и драйвер не скачивается. Скиньте, пожалуйста, установщик драйвера.
  2. Вечер добрый! Опыта в разработки плат на основе микроконтроллеров отсутствует. Разрабатываю схему управления соленоидным насосом (активное сопротивление 14 Ом) на базе STM32 с возможностью управления по интерфейсу RS485. Также возможен ручной режим, для которого предусмотрены кнопки управления и дисплей. Прошу помощи в проверке данной схемы, с замечаниями в работе и подбору оборудования. Перечень элементов.xlsx
  3. Мне нужно получить ШИМ-сигнал на HRTIM, плата DevEBox с МК STM32H750VBT6 на борту. Вначале все вроде работало более менее, во всяком случае МК программировался без проблем, хоть и желаемый результат с экрана осциллографа я не наблюдал, но сейчас что бы я ни делал в CubeIDE и CubeMX, любой проект, который зашивается на МК просто окирпичивает его, даже самый дефолтный с вызовом HAL-функции HAL_HRTIM_SimplePWMStart. плата в итоге становится недоступной для повторной прошивки, исправляю я это тем, что подтягиваю вывод B0T к 3.3V, после в ST-Link Utility ста новится возмож ным очистить память, где хранилась прошивка, и МК снова становится доступным для прошивки, но дальше все повторяется по кругу original-schematic-STM32H7XX-M.pdf
  4. Необходима помощь в написании микрокода на С для управления STM32. Схемотехника и построения схем принципиальных приветствуется. Но эту часть могу выполнить сам. Проект связан с написанием микрокода для управления GPS чипом, RFM модулем передачи, эмулирование USB порта на STM32L433CCT6. Подробности уже в переписке лично.
  5. Написание микрокода на С для управления STM32. Опыт реализации успешных проектов очень обязателен. Опыт схемотехники и построения схем принципиальных приветствуется. Проект связан с написанием микрокода для управления GPS чипом, RFM модулем передачи, эмулирование USB порта на STM32L433CCT6. Подробности в переписке. Специалистов которые очень заняты, у которых нет времени и они спешат по другим проектам, но могут сделать за день по предоплате, просьба спешить далее. Мне нужен спокойный, четкий подход квалифицированного человека, готового работать в нужном направлении. https://t.me/NedelaS
  6. zhevak

    CH32V003

    Чем программировать CH32V Смешной вопрос! Чем вообще программируются STM32? У кого достаточно финансовых возможностей, тот покупает дорогие фирменные программаторы. Я, как и многие другие разработчики, использую китайские «свистки» по 150 рублей. (Это они раньше столько стоили. Сколько стоят сейчас — я не знаю. Уже давно не покупал. Для работы с STM32 я всё ещё пользуюсь свистком, купленным лет пять назад.) Беда, однако, в том, что ST-Link не подходит для работы с CH32V. Ну, хорошо. А чем же тогда программировать эти китайские штучки? Чем-чем — дак, почти таким же китайским «свистком», название которому WCH-LinkE. Но я не стал заморачиваться только на «свисток», а прикупил полный набор — «свисток», отладочные платы и сами микросхемы. В «суповой» набор за полторы тысячи рублей (если быть более точным — за 1515,69) входят — собственно, сам «свисток», две отладочных платы (с CH32V003 и с CH32V203) и по пять штук тех и других микросхем. Причём, что интересно, всё это «бохацтво» пришло в довольно-таки приличной упаковке, а образцы микросхем — так вообще были упакованы в пластиковые коробочки на подобие из-под ювелирных изделий или из-под наручных часов. В общем, мелочь — а приятно! Программатор собран на базе микроконтроллера тоже RISC-V — CH32V305F8. (Характеристики этого микроконтроллера не смотрел, но думаю, что они будут повкуснее CH32V203.) У меня есть предположение, что такой программатор можно повторить. Но… какой в этом смысл? Дешевле китайского-то сделать всё равно не получится. Быстрее и проще купить ещё один, если этот сдохнет. <--- Я пока не совсем разобрался со спецификой блога. Я так и не понял, как публиковать в блоге другие свои статьи. Видимо, их нужно размещать здесь же. Это немного странно. Но по мере освоения, я приведу блог в нормальное состояние. Несколько последовательных по смыслу статей будут размещены на этом месте. <--- CH32V003. Формирование временнЫх интервалов Делать так, как описано в этой короткой статье, я бы не рекомендовал. Эта статья предназначена не ради готового примера для применения в каких-либо коммерческих программах, а ради "первой ступеньки" в освоении модуля таймера. Таймеры в STM32 и в CH32V по сравнению с другими микроконтроллерами (например, MSP430, ATMEGA и другими) сильно навороченные, и разобраться сходу, как с ними работать, -- довольно-таки трудно. По себе сужу. Документация в интернете в основном представлена на английском языке. На русском тоже есть, но есть один момент. Документации по таймерам конкретно для CH32V нет. Хотя таймеры в CH32V и STM32 очень похоже, но состав, названия регистров, названия битов по отношению к STM32 несколько различаются. Поэтому у разработчиков возникают определённые трудности, которые выливаются в затягивание сроков разработки программ. Представленный в статье пример помогает быстрее начать с таймером работать. В микроконтроллерах CH32V реализованы два таймера -- таймер общего назначения (General Purpose) TIM2 и продвинутый таймер (Advanced) TIM1. В примере используется таймер общего назначения TIM2, но представленный код пригоден и для продвинутого таймера TIM1. У таймера много функций, которые он может выполнять. Начать освоения таймера лучше с самой простой функции -- формирование временнЫх промежутков. Что это значит? Допустим, мы пишем программу, которая выполняет какие-то действия (например, измеряет температуру). Поскольку программа измеряет температуру значительно быстрее, чем температура обычно меняется, то измерять температуру каждую миллисекунду нет смысла. Допустим, что нам нужно измерять температуру с периодом один раз в секунду. Само же время измерения и время передачи полученного значения температуры во внешний мир (на LCD или по последовательному каналу в компьютер) составляет 10 мс. В этом случае главный цикл программы будет выглядеть как-то так: int main(void) { ... tim_init(); // Настраиваю таймер // Главный цикл программы while (1) { temperature = get_temperature(); // Измеряю температуру send_value(temperature); // Передаю показания wait(); // Жду секунду } } В функции tim_init() производится настройка таймера на формирование секундных промежутков времени, а функция wait() тупо останавливявает выполнение программы до начала следующего промежутка времени. Вот, эти-то функции мы сейчас и рассмотрим более подробно. Начнём с функции tim_init(). Перед тем как взаимодействовать с таймером нужно разрешить его работу, или другими словами подать на него тактирование. Это делается одной командой: RCC->APB1PCENR |= RCC_TIM2EN; // Включаю таймер Следующим шагом нужно настроить работу таймера. Допустим, что тактовая частота SysClock, на которой работает ядро микроконтроллера, равно 24 МГц, а предделитель для шины мы не используем (то есть тактовая частота шины APB1 тоже 24 МГц). Тогда оставшийся код инициализации таймера будет выглядеть так: TIM2->INTFR = 0; // Предочистка TIM2->PSC = 24000 - 1; // Входная частота таймера = 1 кГц TIM2->ATRLR = 1000; // Соответствует одной секунде TIM2->CTLR1 = TIM_CEN; // Запускаю таймер в работу У каждого таймера есть свой предделитель. Он делить входную частоту на заданное значение и потом подает её на счетчик таймера. В нашем случае мы записываем коэффициент деления 24000 в регистр предделителя (PSC). Это значит, что после предделителя частота, котораяубдет поступать на счётчик таймера, будет равна 1 кГц. У каждого счётчика так же имеется регистр автозагрузки. Работа этого регистра зависит от направления счёта счетчика -- увеличивает ли счетчик свое значение или же уменьшает. Значение из этого регистра либо загружается в счётчик каждый раз при достижении счётчиком нулевого значения, либо наоборот -- при достижении счётчиком значения, равного записанному в регистре PSC, счётчик обнуляется. В обоих случая счётчик формирует событие UIF, которое мы и будем отслеживать в функции wait(). Код функции wait() ещё проще: void wait(void) { while (!(TIM2->INTFR & TIM_UIF)) ; // Ожидаю поднятия флага UIF TIM2->INTFR = 0; // Сбрасываю флаг } Как можно понять из приведённого кода, функция тормозит выполнение программы до тех пор, пока не сработает таймер и не будет взведён флаг UIF. После этого происходит очистка этого флага и программа может продолжить своё выполнение. Еще раз отмечу, что не смотря на то, что программа, построенная по предложенному способу, будет вполне рабочей, делать так не надо. Код программы был приведён только в учебных целях. С чего-то же нужно начинать? CH32V003. Генератор временнЫх интервалов По жизни намного чаще, чем описанный в предыдущей статье формирователь задержки, требуется формирователь временнЫх отметок, или другими словами -- таймер. Таймер, в нашем контексте, -- это такая бестия, которая периодически с заданным интервалом прерывает выполнение основной программы. Будем работать с таймером TIM2. Ранее я уже говорил, что периферия CH32V и периферия STM32 сильно совпадают. И это есть хорошо! Но, как обычно, есть нюансы! Количество и состав регистров таймера TIM2 у CH32V и STM32 совпадает на 100 %, хотя названия регистров сильно расходятся. Например, регистр управления у STM32 называется CR1, в то время как у CH32V он носит имя CTLR1. Или, вот, ещё например, регистр генерации событий -- у STM32 он называется EGR, а у CH32V -- SWEVGR. Не знаю, зачем это было нужно делать китайцам, но по моему мнению они сделали неверный шаг. Что же касается названий битов в регистрах, то в документации (на STM32 и на CH32V) они совпадают полностью. Но одно дело pdf-ка и совсем другое дело хэдерные файлы. Не знаю, насколько это оказалось дурным, но в данном случае ход китайцев мне понравился. Например, бит разрешения работы таймера у STM32 называется длинно -- TIM_CR1_CEN, а у китайцев этот же бит называется проще -- TIM_CEN. Во всяком случае мне показалось, что писать наименования "китайских" битов легче. Сравните: TIM2->CR1 = TIM_CR1_CEN; // STM32 и TIM2->CTLR1 = TIM_CEN; // CH32V Однако, давайте вернёмся к теме нарезки времени на кусочки определённой длительности. Обработчик прерывания от таймера TIM2 должен выглядеть следующим образом: __attribute__((interrupt("WCH-Interrupt-fast"))) void TIM2_Handler(void) { TIM2->INTFR &= ~TIM_UIF; // Очистить флаг прерывания ... // Выполнить какую-то полезную работу } В отличие от программного кода для STM32 в программах для CH32V нужно обязательно перед объявлением обработчика прерывания добавлять строку: __attribute__((interrupt("WCH-Interrupt-fast"))) Ну и не забывайте, что один обработчик может обслуживать целую кучу родственных прерываний. Например, в этом обработчике обслуживается прерывание, которое возбуждается в следствие События Подновления таймера. Кроме этого прерывания таймер может возбуждать также прерывание при возникновении условия захвата, при возникновении условия сравнении. У каждого прерывания свой флаг, который нужно сбросить при входе в обработчик прерывания. Поэтому чтобы в обработчике прерывания реагировать на своё прерывание, а не пытаться обслужить родственное, нужно по правильному писать так: __attribute__((interrupt("WCH-Interrupt-fast"))) void TIM2_Handler(void) { if (((TIM2->DMAINTENR & TIM_UIE) != 0) && ((TIM2->INTFR & TIM_UIF) != 0)) { // Это прерываение разрешено и флаг прерывания поднят TIM2->INTFR &= ~TIM_UIF; // Очистить флаг прерывания ... // Выполнить какую-то полезную работу } ... // Обслужить другие прерывания от таймера } Но если в вашей программе используется только одно прерывание (как в нашем примере), то такую проверку можно и не выполнять. С прерыванием разобрались. Теперь нужно написать код, который правильно настроит (инициализирует) таймер TIM2. Этот код выглядит так: void init_tim2(void) { RCC->APB1PCENR |= RCC_TIM2EN; // Включаю тактирование модуля таймера NVIC_EnableIRQ(TIM2_IRQn); // Разрешаю прерывания от таймера TIM2 TIM2->PSC = 24000 - 1; // Предделитель, тактовая частота счётчика 1 кГц TIM2->ATRLR = 50; // Интервал перываний 50 мс TIM2->INTFR = 0; // Сбрасываю все флаги TIM2->DMAINTENR = TIM_UIE; // Разрешаю прерывание по событию "Подновление таймера" TIM2->CTLR1 = TIM_CEN; // И наконец разрешаю работу таймера TIM2 } В результате мы получили программу, которая 20 раз в секунду прерывает работу основного цикла программы. Как видите, писать программу для CH32V не сложнее, чем для STM32.
  7. Недавно перешел с avr на stm32, для начала решил заказать Blue Pill. Нашел у себя дисплей MT-16S2H, почитал доку по нему и набросал код в Keil. Экран загорелся, но ничего на нем не появляется. И никак не могу понять или при инициализации накосячил или же с форматом вывода что-то. Кто работал с подобным, отпишитесь) Настраиваю на работу в 4х битном режиме. Работаю на порте B (PB4-PB7), A0 к B0, E к B1. main.c: #include "main.h" #define SYSLOCK 72000000U #define E1 GPIOB->BSRR |= GPIO_BSRR_BR1 #define E0 GPIOB->BSRR |= GPIO_BSRR_BS1 #define A1 GPIOB->BSRR |= GPIO_BSRR_BR0 #define A0 GPIOB->BSRR |= GPIO_BSRR_BS0 #define LCD_PINS0 GPIOB->BSRR |= (GPIO_BSRR_BS0 | GPIO_BSRR_BS1 | GPIO_BSRR_BS4 | GPIO_BSRR_BS5 | GPIO_BSRR_BS6 | GPIO_BSRR_BS7) #define LED_ON GPIOC->BSRR |= GPIO_BSRR_BR13 #define LED_OFF GPIOC->BSRR |= GPIO_BSRR_BS13 __IO static uint32_t SysTick_CNT = 0; void PORTS_INIT(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPBEN; /*PORTC settings*/ GPIOC->CRH &= GPIO_CRH_CNF13; GPIOC->CRH |= GPIO_CRH_MODE13; /*A0(PB0) & E(BP1) INIT*/ GPIOB->CRL &= GPIO_CRL_CNF0; GPIOB->CRL |= GPIO_CRL_MODE0; GPIOB->CRL &= GPIO_CRL_CNF1; GPIOB->CRL |= GPIO_CRL_MODE1; /*PORTB PB4-PB7 settings*/ GPIOB->CRL &= GPIO_CRL_CNF4; GPIOB->CRL |= GPIO_CRL_MODE4; GPIOB->CRL &= GPIO_CRL_CNF5; GPIOB->CRL |= GPIO_CRL_MODE5; GPIOB->CRL &= GPIO_CRL_CNF6; GPIOB->CRL |= GPIO_CRL_MODE6; GPIOB->CRL &= GPIO_CRL_CNF7; GPIOB->CRL |= GPIO_CRL_MODE7; } void SysTick_INIT(void) { SysTick->LOAD &= ~SysTick_LOAD_RELOAD_Msk; SysTick->LOAD = SYSLOCK/(1000000-1); SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } void delay_mks(uint32_t x) { SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->VAL = SYSLOCK/(1000000-1); SysTick_CNT = x; while (SysTick_CNT); } void SysTick_Handler(void) { if (SysTick_CNT > 0) SysTick_CNT--; } void LCD_INIT(void) { LCD_PINS0; delay_mks(20000); sendbyte(0x33, 0); delay_mks(40); sendbyte(0x32, 0); delay_mks(40); sendbyte(0x28, 0); delay_mks(40); sendbyte(0x0C, 0); sendbyte(0x06, 0); sendbyte(0x01, 0); } void sendbyte(int16_t b, uint8_t mode) { LCD_PINS0; GPIOB->ODR &= ~(b & 0xF0); if (mode == 1) A1; else A0; pulse(); LCD_PINS0; GPIOB->ODR &= ~((b & 0x0F) << 4); if (mode == 1) A1; else A0; pulse(); } void pulse(void) { E0; delay_mks(22); E1; delay_mks(22); E0; delay_mks(22); } void sendChar(char *e) { char *text; text = e; while ((*text != 0) && (*text != 0)) { sendbyte(*text, 1); text++; } } void setPos(uint8_t row, uint8_t col) { uint8_t address = 0; if (row == 0) address = 0; else address = 0x40; address |= col; sendbyte(0x80 | address, 0); } int main(void) { PORTS_INIT(); SysTick_INIT(); LCD_INIT(); setPos(0,2); sendChar("sass"); while(1) { /* LED_ON; delay_mks(200000); LED_OFF; delay_mks(200000);*/ } }
  8. Доброго времени суток! Недавно решил продолжить свое изучение микроконтроллеров и с AVR перейти на STM32. Понял специфику и решил применить новые знания на практике. Нашел дисплей MT-16S2H (https://www.melt.com.ru/pdf/mt-16s2h.pdf) и набросал кода для инициализации и вывода символа. Подсветка загорелась, но вывести ничего не получилось) Начал смотреть что написал. Порты инициализировал правильно, сам дисплей вроде тоже, запись данных вроде тоже. Предполагаю что косяк где-то с курсором или символ не правильно как-то вывожу: void setPos(int8_t row, int8_t col) { if (row == 0) col|=0x80; else col|=0xC0; sendbyte(col, 0); } void sendchar(char c) { sendbyte(c, 1); } Это мои предположения где может быть ошибка, надеюсь знаток найдется. Весь код прикладываю ниже. Заранее спасибо за помощь:) main.c
  9. Мы – команда из десятка человек. Каждый из нас имеет внешнюю постоянную работу по совершенно разным специальностям. Но нас объединило одно дело, над которым мы трудимся более трех лет. Это проект по полной автоматизации сдачи и съема жилья в аренду. Именно - полной, то есть, архитектура этой идеи более сложная и более функциональная, чем у Букинга и у иных конкурентов. В целях защиты корпоративных интересов наше название и адрес сайта я называть в этом публичном пространстве не буду. Но сделаю известным, что у нас есть инвесторы и в наш проект уже вложено порядка десятка миллионов рублей, что у нас есть созданное нами же работающее оборудование на объектах и сложнейшее серверное ПО и что уже выложено в популярные магазины наше мобильное приложения для съема жилья в аренду. Т.е. мы фактически уже не стартап, а компания с клиентами и доходами. Но, чтобы масштабировать сервис, чтобы привлечь новых инвесторов и выйти на более серьёзный уровень доходов, нам нужны новые разработки в области СКУД и тщательный анализ имеющихся на предмет модернизации. Поэтому нам нужны опытные специалисты по аналоговой и цифровой радиоэлектронике. А именно, в данный момент единица нашей системы работает на Raspberry Pi c простейшей обвязкой из реле, i2c – устройств ввода и вывода и иных простейших компонентов. Но далее предполагается усложнить ее с помощью добавления новых устройств на основе МК ESP (или более энергоэффективных МК), беспроводной связи типа LoRa и создания более сложных аналоговых устройств сбора обезличенной информации. В более далекой перспективе – создание собственных модулей шифрования и, может быть, даже собственного протокола беспроводной связи, что будет очень полезно для защиты отечественных интересов в условиях войны. От Вас не требуется менять работу, переезжать. Работу можно делать удаленно, хоть даже из другого региона, при этом строго соблюдая оговоренный график выполнения работы, неформальной отчетности и регулярного участия в онлайн-конференциях с командой. Объем работы, если у Вас есть опыт в указанных выше областях, на мой взгляд, не должен превышать нескольких часов в неделю, т.к. предполагается, что Вы уже знаете, что и как принято и нужно делать. Однако, если задача окажется более творческой, а Вы – творческим человеком, то расход времени будет таким, каким сочтете нужным. В данный момент мы можем предложить в качестве вознаграждения за работу долю в компании, для чего потребуется поработать некоторое время (полгода - год) над поставленной задачей и демонстрировать положительные результаты своей работы. А в случае успешной динамики компании, Вам, как и всем нынешним участникам компании, будет предложено перейти на оплачиваемую должность в компании. Как видите, мы не обещаем Вас озолотить. Но, с другой стороны, на данном этапе Вы ничем иным не рискуете, кроме своего времени. Для связи со мной прошу писать в личку, где нужно коротко написать о себе, в т.ч. город проживания и Ваш возраст. А здесь отвечать я не буду, потому что этот форум читают конкуренты)
  10. STM32F746NG keil 5.0 аудиокодек aday1361 При использовании одного буфера на приём и передачу звука через DMA всё работает нормально, если использовать разные буферы на приём и передачу, появляются лишние шумы и записанного голоса почти не слышно, буфер заполняется при срабатывании callback подскажите пожалуйста по данному вопросу
  11. Доброго времени суток! Недавно была предпринята попытка разобраться с STM32L071 при поддержке STM32CubeIDE. Скрины генерации проекта прилагаю. Решено было начать с самого базового - с UART. Для теста в UART была выдана строка, которая была принята компьютером. После чего я настраиваю прием данных по UART, зная максимальный объём посылки - включаю прерывание IDLE и запускаю приём. Несмотря на очевидное наличие данных на входе контроллера (видимое с помощью осциллографа), я не получаю признак их прихода, т.е. ни прерывание IDLE, ни коллбек. В чем может быть причина? //main.c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart->Instance == USART1) { } } int main (void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ uint8_t aTxBuffer[] = " ****UART_TwoBoards_ComIT**** "; /* 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_USART1_UART_Init() HAL_UART_Transmit(&huart1, (uint8_t*)aTxBuffer, sizeof(aTxBuffer), 1000); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)receive_buff, 20); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } } void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) == SET) { __HAL_UART_CLEAR_IDLEFLAG(&huart1); HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)receive_buff, 20); } /* USER CODE END USART1_IRQn 1 */ }
  12. Всем привет! Хочу разработать платку, которая расширяет возможности БК машины, не знаю с чего начать. В программировании опыта более 10 лет, но это серверное программирование Вопросы 1) На чем лучше разработать CAN сниффер? чтобы недорого и удобно разрабатывать. У меня есть готовый образен на STM32, пока смотрю в его сторону, нашел еще варианты на Arduino 2) Как можно снять прошивку с STM32, или безопасно понять есть ли там защита? 3) Инструментарий: Что нужно для разработки кроме IDE? Какой-то переходник для прошивки? 4) Кто печатает платы по проекту чтобы можно было на себя взять только разработку, а печать заказать? 5) может ли быть такое что плата что у меня в образце какая-то типовая и её просто надо купить по каталогу и прошить? 6) есть ли какие-то распространенные библиотеки для разработки в CAN? 7) как провести отладку? что для этого нужно? Как я понимаю надо одновременно и комп к плате подключить и плату к can-шине?
  13. Начал изучать UART STM32 на отладочной плате STM2F446RE. Включил UART2, по умолчанию включились порты PA2,PA3. Включил прерывания, подключил переходник UART/USB CH340, перед этим установив драйвера. Добавил простенький код в stm32f4xx_it.c: в нём объявил две переменные, когда принимается 8 бит buffrec в ответ должен отправляться "Hello world!". /* USER CODE BEGIN Includes */ uint8_t buffrec[8]; uint8_t TX_data[]="Hello world!\n\r"; /* USER CODE END Includes */ void USART2_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ /* USER CODE END USART2_IRQn 0 */ HAL_UART_IRQHandler(&huart2); /* USER CODE BEGIN USART2_IRQn 1 */ HAL_UART_Transmit(&huart2,TX_data,14,0xFFFF); HAL_UART_Receive_IT(&huart2, buffrec,8); /* USER CODE END USART2_IRQn 1 */ } В main.c объявил приём и передачу сигнала UART: /* USER CODE BEGIN 2 */ __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); __HAL_UART_ENABLE_IT(&huart2, UART_IT_TC); /* USER CODE END 2 */ В компиляции нет никаких ошибок и предупреждений. Приём и передачу мониторю через Advanced Serial Port Terminal 6. В итоге при попытке отправить комбинацию "12345" записываются только первые 2 числа. При этом происходит отправка 2 сообщений "Hello world!" сразу. При этом при записи двух бит, они записываются в пустые биты, а затем перезаписывают их. Кроме того, результат приходит на COM3 (порт подключения отладочной платы), а не на COM4 (порт подключения CH340), к которым подключены пины UART2 PA2, PA3. Из-за чего могут возникать эти проблемы?
  14. Есть плата, на которой находятся MCP348 и STM32F103T8U6. К MCP подключается термопара, стмка должна собирать преобразованные данные с MCP через интерфейс I2C и обрабатывать данные. Я застрял на моменте сбора данных. Написал функции для общения стм и mcp, но в ответ получаю это: При этом не важно какой канал выбран и к какому каналу подключена термопара. Функция main: int main(void) { Configure_GPIO_LED(); Configure_GPIO_I2C1(); Configure_I2C1_Master(); Configure_SysTick(); reg_conf = CONFIG_REG(1, 3, 1, 0, 0); while (1) { I2C_write_MCP(DA3_1_ADDR, reg_conf); delay(50); I2C_read_MCP(DA3_1_ADDR); delay(50); } } Функция чтения: void I2C_read_MCP(uint8_t slave_addr) { I2C1->CR1 |= I2C_CR1_START; while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = (uint8_t)(DEVICE_CODE | (slave_addr << 1) | MODE_READ); while(!(I2C1->SR1 & I2C_SR1_ADDR)); for(int i = 0; i < 3; i++) { while(!(I2C1->SR1 & I2C_SR1_RXNE)); output[i] = I2C1->DR; } I2C1->CR1 |= I2C_CR1_STOP; } Функция записи: void I2C_write_MCP(uint8_t slave_addr, uint8_t data) { I2C1->CR1 |= I2C_CR1_START; while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = (uint8_t)(DEVICE_CODE | (slave_addr << 1) | MODE_WRITE); while(!(I2C1->SR1 & I2C_SR1_TXE)); delay(1); I2C1->DR = data; while(!(I2C1->SR1 & I2C_SR1_TXE)); I2C1->CR1 |= I2C_CR1_STOP; } Функция настройки модуля I2C: void Configure_I2C1_Master(void) { RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; I2C1->CR1 &= ~I2C_CR1_SMBUS; I2C1->CR2 |= 48; I2C1->CCR &= ~I2C_CCR_CCR; I2C1->CCR |= 120; I2C1->CCR |= I2C_CCR_FS; I2C1->TRISE = 24; I2C1->CR1 |= I2C_CR1_PE; } Подскажите, в чем может быть проблема? Или что я делаю не так.
  15. Добрый день! Пытаюсь наладить передачу по SPI данных к дисплею с DMA. Передача работает, дисплей полностью закрашивается, но устанавливается флаг ошибки FIFO в регистрах DMA. МК: STM32F401CEU6 Инициализация //Где-то там alignas(32) uint16_t buff[80 * 160]; // SPI init SPI2->CR1 |= (0b000 << SPI_CR1_BR_Pos) | SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM; SPI2->CR2 |= SPI_CR2_TXDMAEN; SPI2->CR1 |= SPI_CR1_SPE; // DMA init DMA1_Stream4->CR |= (0b01 << DMA_SxCR_DIR_Pos) | (0 << DMA_SxCR_CHSEL_Pos) | (0b11 << DMA_SxCR_MBURST_Pos) | DMA_SxCR_MINC; DMA1_Stream4->PAR = (uint32_t)&SPI2->DR; DMA1_Stream4->M0AR = (uint32_t)getBuffer(); DMA1_Stream4->FCR &= ~DMA_SxFCR_FTH; DMA1_Stream4->FCR |= DMA_SxFCR_DMDIS; __DMB(); DMA1_Stream4->FCR |= (0b11 << DMA_SxFCR_FTH_Pos); Функции отправки void ST7735s::stopScreenUpdate() { DMA1_Stream4->CR &= ~DMA_SxCR_EN; while (DMA2_Stream4->CR & DMA_SxCR_EN) ; CS_Up(); } void ST7735s::startScreenUpdate() { stopScreenUpdate(); sendCommand(ST77XX_RAMWR); CS_Down(); DC_Up(); DMA1->HIFCR = DMA_HIFCR_CFEIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTCIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4; DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2; DMA1_Stream4->CR |= DMA_SxCR_EN; } После передачи устанавливается флаг ошибки работы FIFO-буфера в DMA. Флаг приходится сбрасывать вручную + ненормально это как-то. Ошибка, как-никак. Выдержка из документации 80 пикселей * 160 пикселей * 2 байта = 25 600 байт. Итого, если я правильно понял логику, при размере пакета в 16 кусков, при размере куска = MSIZE = 1 байту, должно всё работать, т.к. конфигурации допустима + 25 600 байт ровно делиться на транзакции по 16 байт. Пробовал менять NDTR - делил на 16, но это не помогло, т.к. надо указать именно количество передаваемых байт. С делением на 16 заполняется лишь 1/16 часть дисплея. Перезаписи (ovverun) тоже нет - все пиксели занимают свои места Ошибок SPI нет Выравнивание сделал с запасом. Пробовал ранее 4 - без результата (Точнее результат - ошибка).
  16. Привет всем! Помогите, пожалуйста, я только начал программировать МК STM32F407VG. Программирую в среде keil. Проект создал, все ок. НО есть единственное НО, в котором я не могу разобраться. Программа самая простая зажечь светодиоды на плате. #include "stm32f4xx.h" int main(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER = 0x55000000; GPIOD->OTYPER = 0; GPIOD->OSPEEDR = 0; GPIOD->ODR = 0xF000; while(1) { } } Этот код работает, все диоды загораются, все ок. Вот, если рассматривать следующий код, где я переставляю одну строчку GPIOD->ODR = 0xF000; в цикл while(1) #include "stm32f4xx.h" int main(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER = 0x55000000; GPIOD->OTYPER = 0; GPIOD->OSPEEDR = 0; while(1) { GPIOD->ODR = 0xF000; } } То код успешно НЕ работает, соответственно речи нет никакой, чтобы элементарно помигать диодами нет, через цикл for. Перерыл весь инет, инфы по данному вопросу никак не могу найти. Может кто-нибудь знает в чем дело??? Добавлю еще одно: САМОЕ интересное, что через отладку ПОШАГОВО, все работает, светодиоды загораются, а если просто выполнить код, ничего не горит P.S. не кидайте, пожалуйста, помидорами, я только начинающий...
  17. Здравствуйте! Имеется плата на основе микрокотроллера stm32f405vg, есть задача получения значения rms(среднеквадратичное значение тока) посредством АЦП ade7953. Данные с АЦП принимаются по SPI(посредством обращения к регистру 0x31a) в массив по типу arr[0] = 0x00, arr[1] = 0x00, arr[2] = 0xB1, arr[3] = 2C. Столкнулся с проблемой перевода этого значения в амперы. В application note к АЦП я нашел формулу, прикреплённых ниже, которая должна решать этот вопрос, но как применить её так и не додумался, прошу знающих помочь. Язык Си
  18. Здравствуйте, хочу впаять АУКС в магнитолу CD. Кассетные переделываются легко(замыкаются нужные концевики чтобы магнитофон думал что работает кассета, а на предусилитель кидаем линии aux, и специальную ножку мк подтягиваем к лог 1 или 0). А вот с мафоном CD все сложно, линии аукс включаются по цифровому протоколу, и с CD сигнал передается по SPI, что тоже вызывает сложность в переделке. Было решено обойти сам предусилитель магнитолы, а именно с помощью реле переключить линии основного усилителя на заказанный модуль USB-Bluetooth-MP3 из Китая. Также была разведена и изготовлена печатная плата с универсальными входами и выходами и реле. Управление платой осуществляю с помощью родной кнопки достать диск и при ее нажатии переключается управления родного энкодера. Оставалась сложность с регулировкой звука, решил попробовать цифровой потенциометр, и просто им подтягивать сигнал к земле(не знаю на сколько это правильно). Все алгоритмы реализовал, треки переключает, в память сохраняет. Но вот уже 2 день сижу и пытаюсь крутить цифровой потенциометр AD5263. Посмотрите пожалуйста, что я не так делаю? Питание логики у него разрешено 3V3, далее везде 5V. Подтянул res, shdn к +5V. Отправка по SPI 10bit, старших 2 адрес. Только не понятно нужно ли дергать ножку CS после каждых 10bit, или же можно отправить 4 по 10bit и потом дернуть CS чтобы данные потенциометре внеслись в регистр (стр.28)? Схема подключения: https://cloud.mail.ru/public/BQ7p/biynVUh2V Даташит AD5263: https://cloud.mail.ru/public/ihyh/sJzPohn2f Инициализировал SPI uint16_t spi_data; void Init_SPI(void){ //SPI1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //подключение портов //GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0);//NSS GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);//SCK GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);//MISO GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);//MOSI CLEAR_BIT(SPI1->CR1, SPI_CR1_BIDIMODE); //0: 2-line unidirectional data mode selected SET_BIT(SPI1->CR1, SPI_CR1_BIDIOE);//1: Output enabled (transmit-only mode) CLEAR_BIT(SPI1->CR1, SPI_CR1_CRCEN | SPI_CR1_CRCNEXT | SPI_CR1_CRCNEXT | SPI_CR1_CRCL);//0: CRC calculation disabled | 0: Next transmit value is from Tx buffer | 0: 8-bit CRC length CLEAR_BIT(SPI1->CR1, SPI_CR1_RXONLY);//0: Full-duplex (Transmit and receive) SET_BIT(SPI1->CR1, SPI_CR1_SSM);//1: Software slave management enabled SET_BIT(SPI1->CR1, SPI_CR1_SSI);////SS в высоком состоянии CLEAR_BIT(SPI1->CR1, SPI_CR1_LSBFIRST);//0: data is transmitted/received with the MSB first // Первым отправляется старший бит MODIFY_REG(SPI1->CR1, SPI_CR1_BR , SPI_CR1_BR_2 | SPI_CR1_BR_0);//011: fPCLK/16 SET_BIT(SPI1->CR1, SPI_CR1_MSTR);//1: Master configuration CLEAR_BIT(SPI1->CR1, SPI_CR1_CPOL);//0: CK to 0 when idle **** 1: CK to 1 when idle CLEAR_BIT(SPI1->CR1, SPI_CR1_CPHA);//0: The first clock transition is the first data capture edge ***** 1: The second clock transition is the first data capture ed SET_BIT(SPI1->CR2, SPI_CR2_TXDMAEN);//1: Tx buffer DMA enabled CLEAR_BIT(SPI1->CR2, SPI_CR2_RXDMAEN);//0: Rx buffer DMA disabled CLEAR_BIT(SPI1->CR2, SPI_CR2_SSOE);//0: SS output is disabled in master mode and the SPI interface can work in multimaster configuration CLEAR_BIT(SPI1->CR2, SPI_CR2_NSSP);//0: No NSS pulse CLEAR_BIT(SPI1->CR2, SPI_CR2_FRF);//0: SPI Motorola mode **** 1 SPI TI mode CLEAR_BIT(SPI1->CR2, SPI_CR2_ERRIE | SPI_CR2_RXNEIE | SPI_CR2_TXEIE); //0: Error interrupt is masked | 0: RXNE interrupt masked | 0: TXE interrupt masked MODIFY_REG(SPI1->CR2, SPI_CR2_DS, SPI_CR2_DS_3 | SPI_CR2_DS_0);//1001: 10-bit CLEAR_BIT(SPI1->CR2, SPI_CR2_FRXTH | SPI_CR2_LDMARX | SPI_CR2_LDMATX);//Last DMA transfer for reception/transmission SET_BIT(SPI1->CR1, SPI_CR1_SPE);//SPI enable// 1: Peripheral enabled } void start_SPI(uint8_t num){ //количество слов DMA_Cmd(DMA1_Channel3, DISABLE);//выкл для установки CNDTR DMA1_Channel3->CNDTR = num; SPI1_CS_ON(); DMA_Cmd(DMA1_Channel3, ENABLE); } void set_SPI_Tx(uint8_t adr, uint16_t Data) { SPI1_TX_buff[adr] = Data; } DMA uint16_t SPI1_TX_buff[4]; void SPI_DMA_Init(void){ //TX DMA1_Channel3->CPAR = (uint32_t)(&SPI1->DR); DMA1_Channel3->CMAR = (uint32_t)(SPI1_TX_buff); DMA1_Channel3->CNDTR = 0; CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_MEM2MEM); CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_PL); //Channel priority level 00:low MODIFY_REG(DMA1_Channel3->CCR, DMA_CCR_MSIZE, DMA_CCR_MSIZE_0);//01: 16-bits MODIFY_REG(DMA1_Channel3->CCR, DMA_CCR_PSIZE, DMA_CCR_PSIZE_0);//01: 16-bits SET_BIT(DMA1_Channel3->CCR, DMA_CCR_MINC);//1: Memory increment mode enabled CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_PINC);//0: Peripheral increment mode disabled CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_CIRC);//0: Circular mode disabled SET_BIT(DMA1_Channel3->CCR, DMA_CCR_DIR);//1: Read from memory CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_TCIE | DMA_CCR_HTIE | DMA_CCR_TCIE);//Transfer error interrupt disable | Half transfer interrupt disable | Transfer complete interrupt disable SET_BIT(DMA1_Channel3->CCR, DMA_CCR_EN); } В таймере собираю и отправляю в потенциометр, также выключаю CS if(vol_level.send_flag_for_spi){//флаг отправки по SPI если выставлен, отправляем в потенциометр vol_level.send_flag_for_spi = OFF; set_SPI_Tx(0, vol_level.pot_1); set_SPI_Tx(1, (0x100 + vol_level.pot_2)); set_SPI_Tx(2, (0x200 + vol_level.pot_3)); set_SPI_Tx(3, (0x300 + vol_level.pot_4)); start_SPI(4); }else SPI1_CS_OFF();
  19. Приветствую уважаемые дамы и господа! Занимаюсь разработкой носимого устройства с целью исследования технологий LoRaWAN и BLE 5.0. А также поработать с энергоэффективными режимами работы МК STM32L4-серии. Исходные данные: где - D3 микросхема зарядки Li-ion\Li-Pol аккумулятора (MCP73831), D4 - DC\DC преобразователь USB -> 3.3V (LM3671), D5 - DC\DC преобразователь VBAT -> 3.3V (LM3671). Суть моего вопроса: Если присутствует напряжение VBUS (USB), то необходимо выключать преобразователь D5 сигналом LM3671_BAT, но включать D4 сигналом LM3671_USB. Таким образом получается, что аккумулятор будет заряжаться, а питаться прибор будет от USB. Мои предположения, рассуждения и решения которые я вижу: Если управлять преобразователями при помощи GPIO портов МК, то получится, что как только питание по USB отключится, то прибор выключится быстрее, чем успеет включиться преобразователь работающий от VBAT, ввиду чего я такое решение и отмёл. Использовать небольшую схемку на двух полевых транзисторах в одном корпусе (p и n типа). В симуляторе вроде как всё работает, но вероятно может произойти та же ситуация, что и в случае 1; Использовать микросхему выполняющую данную задачу, но тут играет роль, что достать её сложно, стоит 7$ и выглядит как overkill для такой простой задачи. Покидайтесь, пожалуйста, камнями и критикой решений, своими вариантами решения задачи или же исправлениями к приложенным схемам. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Если вдруг кого-то заинтересует, то вот ссылка на GitHub проекта, а так же ссылка на GitHub библиотеки. Используются шрифты T-Flex GOST, можно получить по ссылке.
  20. Я написал программу последовательного порта с stm32, OP отправляет число, а затем возвращает число, но возвращаемое число - это какой-то неизвестный символ, скорость передачи синхронизирована 9608, стоп-биты данных и т.д. одинаковы, от tx до rx, все еще грязный код. Я поменял 3 помощника для отладки последовательного интерфейса, но они все одинаковые, кто-нибудь знает? Спасибо за ваш ответ.
  21. Добрый день. На проект требуется программист микроконтроллеров STM32 с пониманием Ethernet. Проект: плата работает под управлением STM32F413VGT6, представляет собой SIP-приставку для домофона. Для связи с Ethernet используется микросхема ENC424J600-I/P - мост SPI <-> Ethernet. Ниже приведено краткое описание функционала: Устройство должно обеспечивать: 1. Прием голоса из домофоной линии и оцифровка с помощью встроенного в контроллер АЦП. 2. Передача голоса по сети Ethernet по протоколу RTP. В качестве транспорта использовать UDP. 3. Прием голосовых сообщений по Ethernet по протоколу RTP и передачу их на встроенный ЦАП. 4. Микроконтроллер должен обеспечивать связь с внешним миром с помощью интерфейса Ethernet через микросхему ENC424J600-PT. 5. Для установления соединения с сервером голосовых сообщений используется протокол SIP 2.0. с поддержкой методов, описанных в RFC 3261. 6. Прием и отработку команд, приходящих по MQTT: открыть входную дверь, открыть шлагбаум и т.п. 7. WEB-интерфейс для удаленных настроект и мониторинга рабочих параметров устройства. 8. Для работу через VPN-роутер контроллер должен поддерживать STUN. Есть проект для микроконтроллера для аналогичного устройства. Там используется STM32L475RET6. Для связи с Ethernet используется так же ENC424J600-I/P. Устройство успешно звонить по SIP на сервер. Выполняет приходящие MQTT-команды по открыванию дверей. Требуется: поправить ПО под STM32F413VGT6, добавить WEB-интерфейс, добавить возможность удаленного обновления ПО через WEB-интерфейс, добавить возможность перезагрузки устройства через WEB-интерфейс, добавить возможность хранения данных абонентов во FLASH микроконтроллера и возможность синрохизации этих данных с сервером, добавить STUN, исправить метод определения квартиры в которую звонят. Есть ТЗ на ПО.
  22. Вопрос такой: как запросить содержимое корневого каталога при использовании библиотеки lfs.h. При этом я имею дело с чужим кодом и там файловая система уже отформатирована (когда-то) и смонтирована (при запуске устройства). Оперировать с каталогами и файлами имена которых я заведомо знаю (или сам создаю) у меня получатся, но для текущей задачи это мне никак не помогает. Вероятно мой вопрос очень простой и для многих очевидный, но я тем не менее не смог с наскока найти на него ответ ни в гугле, ни в lfs.h. Очень извиняюсь за невежество, я новичек
  23. Представляю вам свой проект, предназначенный для повторения начинающими роботостроителям: Android-управление машинкой по Bluetooth при помощи акселерометра. Проект полностью Open Source, все исходники прикреплены внизу статей. Видео работы: Вводная статья на сайте Проект под STM32 Проект под Arduino Проект под .NET Micro Framework Данный топик - тема поддержки проекта, т.к. по связи Android <-> МК возникает много вопросов, как правило по части ПО (Java). Видео работы на другом шасси:
  24. Хочу сделать вольтамперметр на базе STM32L151, есть ли какие нибудь особенности при разводке платы? Свой вариант прикрепляю ниже. Буду благодарен за дельные комментарии. ВА-30.dch
×
×
  • Create New...