bobbjenkins

Members
  • Публикации

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

  • Посещение

Репутация

5 Обычный

О bobbjenkins

  • Звание
    Осваивающийся

Электроника

  • Стаж в электронике
    Менее года

Посетители профиля

307 просмотров профиля
  1. STM32 для чайника

    Такой вопрос "начинающего": В чем отличие/преимущество DMA от обычных прерываний при работе с I2C в stm32? Частота контроллера 72 МГц, частота шины I2C - 400 кГц. Если работать с I2c блокирующими функциями (операции read/write), толку от частоты контроллера немного - большую часть времени будем ждать на этих функциях I2C. Можно сделать, чтоб операции read/write, по их окончании, вызывали обработчики прерывания. Тогда микроконтроллер не будет простаивать на read/write вызовах, они вернут управление моментально, в то время как модуль I2C дождется окончания операции и дернет прерывание, когда данные будут приняты или отправлены. Почему в таких случаях предпочитают DMA, какой дополнительный ощутимый выигрыш он дает ?
  2. I2C иногда выдает HAL_BUSY после включения

    Оказывается, проблема еще глубже. Если кому-то интересно, в эррата есть подробное описание решения: "I2C analog filter may provide wrong value, locking BUSY flag and preventing master mode entry" http://www.st.com/content/ccc/resource/technical/document/errata_sheet/7d/02/75/64/17/fc/4d/fd/CD00190234.pdf/files/CD00190234.pdf/jcr:content/translations/en.CD00190234.pdf#page26 Там приводятся 15 шагов по обходу этой проблемы И еще вот решения: https://electronics.stackexchange.com/questions/272427/stm32-busy-flag-is-set-after-i2c-initialization https://electronics.stackexchange.com/questions/267972/i2c-busy-flag-strange-behaviour Описанный в прошлом посте метод в большинстве случаев работает (иногда все-таки выдает HAL_BUSY, хоть и намного реже), поэтому пока оставлю реализацию этого кода из errata на потом, когда появится свободное время разобраться во всем этом.
  3. I2C иногда выдает HAL_BUSY после включения

    Спасибо за ответ. Нашел совет вот здесь: https://community.st.com/thread/15632. Судя по всему - это баг в реализации HAL для F10* контроллеров. Рекомендуют включать тактирование i2c вручную (в обход куба) перед инициализацией gpio, + установить/сбросить бит RESET у i2c. Добавил вот этот код в начало main(), перед инициализацией периферии: /* USER CODE BEGIN SysInit */ __HAL_RCC_I2C1_CLK_ENABLE(); HAL_Delay(100); __HAL_RCC_I2C1_FORCE_RESET(); HAL_Delay(100); __HAL_RCC_I2C1_RELEASE_RESET(); HAL_Delay(100); /* USER CODE END SysInit */ Пока что нет (и, надеюсь, не будет) проблем с BUSY, независимо от длительности перезагрузки. HAL_Delay'и здесь не нужны, верно? Update: Как оказалось, задержки нужны. Без них, при длительном зажатии кнопки Reset, HAL_BUSY появлялись. Кстати и сейчас изредка появляются, но очень редко и при зажатии ресета на несколько секунд. Но работать можно. Вот такой костыль...
  4. Привет Иногда, например сразу после прошивки контроллера (STM32F103), HAL_I2C_Mem_Read/HAL_I2C_Mem_Write возвращают HAL_BUSY. Но, если перезагрузить контроллер - все начинает работать. Иногда после перезагрузки кнопкой на плате i2c с этим i2c устройством не заводится, приходится заводить его как мопед - с нескольких перезагрузок reset'ом. Такое зависание обычно бывает, если зажать кнопку RESET и подержать секунду - сама плата с stm32 стартует нормально, а устройство I2c не работает, хотя зависания i2c случаются и при кратковременном резете. Приаттачены настройки I2c из куба и отрывок из Datasheet I2C устройства (гироскоп/акселерометр MPU9250). Как думаете, в чем может быть причина? Подтягивающие резисторы (sda-vcc, scl-vcc), разумеется, на самой плате имеются. Что я пробовал сделать (ничего из этого не помогло): 1) добавлял HAL_Delay(1000) при старте STM32 2) также при старте добавил (mpu9250 подключен к i2c1) __HAL_RCC_I2C1_FORCE_RESET(); HAL_Delay(1000); __HAL_RCC_I2C1_RELEASE_RESET(); 3) менял настройки i2c в кубе: выставил StandardMode/1khz (хотя по спецификации, MPU9250 поддерживает i2c 4кгц). В самом протоколе I2c, к сожалению, недостаточно хорошо разбираюсь, чтобы понять, что может происходить...
  5. методы измерения параметров звуковых сигналов

    одной частоты обычно нет (если это не синусоидальное пищание), в звуке обычно много частот, но может быть одна преобладающая, наверное это и понимается под частотой. Нужно применить преобразование фурье и взять составляющую с наибольшей амплитудой. Громкость относительна. Если например к микрофону поднести источник звука, то будет громко, а если удалить - то тише Измеряется в децибелах обычно по силе сигнала на входе относительно тишины. Время затухания определяется например звапуском таймера, когда звук начался и считыванием значения таймера, когда звук прекратился, и вычисления разницы во времени тембр - это спектральный состав звука, делается с помощью преобразования фурье. На выходе у вас будет набор амплитуд по каждой частоте, они определябют окраску звука. как то так,
  6. STM32 для чайника

    Попробуйте Arduino IDE, его можно настроить под STM32. Эта среда как раз для начинающих. А так для вашей цели лучше подходит сама плата ардуино (arduino compatible), китайский клон такой платы стоит пару долларов, зачем вам сам stm32? См https://geektimes.ru/post/277928/
  7. STM32 HAL IRQHandler

    Хм странно, я использую: http://www.keil.com/support/man/docs/armcc/armcc_chr1359124989221.htm Может версия другая или компилятор другой?
  8. STM32 HAL IRQHandler

    Не встречал такого. В gcc, keil точно работает. А можно пример из современных?
  9. STM32 HAL IRQHandler

    Как уже писали, нужно обьявить переменную в С файле, чтоб компилятор выделил под нее память. Например int a; Тогда не будет ошибок undefined symbol. Не в h, а в с (иначе будет multiple definitions), и только в одном. Затем в h файле написать: extern int a; Эта строка не выделяет память а просто дает указание нижеследующему коду (который ссылается на переменную) что память под переменную с таким именем уже выделена в каком то .с файле и вы не будете получать undefined reference/symbol Вместо ifndef ... define...endif можно писать #pragma once - так меньше писанины - почти все современные компиляторы это поддерживают.
  10. STM32 HAL IRQHandler

    Переменная определяется в одном из .c файлов (int a, например), а в .h файле (или можно напрямую в других .c файлах) пишется "extern int a" - так она становится видна остальным .с файлам. Присваивать где хотите. Или при обьявлении (если значение заранее известно), или из другой функции (если сложная инициализация вызовом функции).
  11. STM32 HAL IRQHandler

    У меня i2c устройство сбоило, пока не добавил небольшую задержку после включения МК перед началом передачи данных. Не знаю с чем это связано, наверное не успевало проинициализироваться (как только питание подавалось я отправлял первую и2с команду). Теперь работает без проблем.
  12. STM32 HAL IRQHandler

    А что именно глючного в hal в f103? Показалось что учтены и обойдены все ошибки (по сравнению с сырой реализацией на spl), по крайней мере все заработало сразу как перешел на хал
  13. STM32 HAL IRQHandler

    .С файлы обычно используются для самого кода, а .Н файлы - для связки этих С файлов. То есть в С файле вы пишете саму функцию (реализацию), а в h файле - только ее обьявление (имя), а потом этот h файл включаете (с помощью #include) в другие .c файлы, где эту функцию хотите вызвать. Получается что другие .c файлы видят обьявление вашей функции, но реализация по прежнему одна (в одном из c файлов).
  14. Управление мощной нагрузкой от gpio 3.3v

    Понял, спасибо Спасибо. Уже купил мощный в след раз возьму из этой серии.
  15. Управление мощной нагрузкой от gpio 3.3v

    Спасибо. Да, включалась нагрузка кратковременно при подаче питания на мк. Добавил резистор на входе - прошло. 0 выкл, 1 вкл, все верно. не совсем понял про то что, будет после трех ампер - транзистор не выдаст больше 3 ампера на выходе из-за внутреннего сопротивления? Собственно у меня нагрузка до ампера будет, но просто любопытно