Перейти к содержанию

bobbjenkins

Members
  • Постов

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

  • Посещение

Электроника

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

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

1 322 просмотра профиля

Достижения bobbjenkins

Стажер

Стажер (3/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

7

Репутация

  1. Такой вопрос "начинающего": В чем отличие/преимущество DMA от обычных прерываний при работе с I2C в stm32? Частота контроллера 72 МГц, частота шины I2C - 400 кГц. Если работать с I2c блокирующими функциями (операции read/write), толку от частоты контроллера немного - большую часть времени будем ждать на этих функциях I2C. Можно сделать, чтоб операции read/write, по их окончании, вызывали обработчики прерывания. Тогда микроконтроллер не будет простаивать на read/write вызовах, они вернут управление моментально, в то время как модуль I2C дождется окончания операции и дернет прерывание, когда данные будут приняты или отправлены. Почему в таких случаях предпочитают DMA, какой дополнительный ощутимый выигрыш он дает ?
  2. Оказывается, проблема еще глубже. Если кому-то интересно, в эррата есть подробное описание решения: "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. Спасибо за ответ. Нашел совет вот здесь: 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. Попробуйте Arduino IDE, его можно настроить под STM32. Эта среда как раз для начинающих. А так для вашей цели лучше подходит сама плата ардуино (arduino compatible), китайский клон такой платы стоит пару долларов, зачем вам сам stm32? См https://geektimes.ru/post/277928/
  7. Хм странно, я использую: http://www.keil.com/support/man/docs/armcc/armcc_chr1359124989221.htm Может версия другая или компилятор другой?
  8. Не встречал такого. В gcc, keil точно работает. А можно пример из современных?
  9. Как уже писали, нужно обьявить переменную в С файле, чтоб компилятор выделил под нее память. Например int a; Тогда не будет ошибок undefined symbol. Не в h, а в с (иначе будет multiple definitions), и только в одном. Затем в h файле написать: extern int a; Эта строка не выделяет память а просто дает указание нижеследующему коду (который ссылается на переменную) что память под переменную с таким именем уже выделена в каком то .с файле и вы не будете получать undefined reference/symbol Вместо ifndef ... define...endif можно писать #pragma once - так меньше писанины - почти все современные компиляторы это поддерживают.
  10. Переменная определяется в одном из .c файлов (int a, например), а в .h файле (или можно напрямую в других .c файлах) пишется "extern int a" - так она становится видна остальным .с файлам. Присваивать где хотите. Или при обьявлении (если значение заранее известно), или из другой функции (если сложная инициализация вызовом функции).
  11. У меня i2c устройство сбоило, пока не добавил небольшую задержку после включения МК перед началом передачи данных. Не знаю с чем это связано, наверное не успевало проинициализироваться (как только питание подавалось я отправлял первую и2с команду). Теперь работает без проблем.
  12. А что именно глючного в hal в f103? Показалось что учтены и обойдены все ошибки (по сравнению с сырой реализацией на spl), по крайней мере все заработало сразу как перешел на хал
  13. .С файлы обычно используются для самого кода, а .Н файлы - для связки этих С файлов. То есть в С файле вы пишете саму функцию (реализацию), а в h файле - только ее обьявление (имя), а потом этот h файл включаете (с помощью #include) в другие .c файлы, где эту функцию хотите вызвать. Получается что другие .c файлы видят обьявление вашей функции, но реализация по прежнему одна (в одном из c файлов).
  14. Понял, спасибо Спасибо. Уже купил мощный в след раз возьму из этой серии.
  15. Спасибо. Да, включалась нагрузка кратковременно при подаче питания на мк. Добавил резистор на входе - прошло. 0 выкл, 1 вкл, все верно. не совсем понял про то что, будет после трех ампер - транзистор не выдаст больше 3 ампера на выходе из-за внутреннего сопротивления? Собственно у меня нагрузка до ампера будет, но просто любопытно
×
×
  • Создать...