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

snn_krs

Members
  • Постов

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

  • Посещение

Весь контент snn_krs

  1. Попробуйте это. Скомпилировался без проблем. Ардуино ИДЕ 1.8.3
  2. В цикле ожидается установка флага TWINT. Устанавливается он аппаратно. Возможно на вашей плате выходы SDA или SCL используются для других целей. Посмотрите какие на них напряжения при запущенной программе.
  3. Извиняюсь, похоже вчера был пьян. У вас скорее всего висит на ожидании флага Закоментируйте оба вызова функций, затем по одной. Узнаете точнее на какой функции висит.
  4. snn_krs

    STM32F103: ADC+DMA

    Была аналогичная проблема с STM32F373 и SDADC. Разбираться было некогда. Попробуйте обработать ошибку в прерывании DMA. Если DMA пропускает запрос от периферии он должен выставить флаг ошибки.
  5. I2C интерфейс у R2S15900 питается от 5 В ( внутренний источник ). Если у вас ардуино питается от 3.3 в, то могут быть такие проблемы. Возьмите ардуино с питанием 5В.
  6. В руководстве по программированию есть такое требование: For write and erase operations on the Flash memory (write/erase), the internal RC oscillator (HSI) must be ON Проверьте на всякий случай включен у вас HSI или нет. При запуске он всегда включен, но если работаете на внешнем кварце, то могли выключить.
  7. Сам я именно такой вариант не делал, но попробовал бы сделать так Таймер TIMN сделал ведущим с частотой 20 кГц * 16. TIMM ведомый с запуском от TIMN и счетом до 16, его выход в режиме переключения выдает меандр с частотой 20 кГц. По TIMN запуск АЦП + ДМА. В буфере будут по четным адресам 0-й канал, а по нечетным поочереди 1, 2 каналы.
  8. Да, это пустой цикл ожидания установки флага UDRE.
  9. Обычно , если надо передать один символ, делают так void sendusart( unsigned char but ) { while ( !( UCSRA&( 1 << UDRE ))); UDR = but; }
  10. Да ВООТ0 в единицу, подключить если есть такая возможность УАРТ1 и утилитой Flash Loader Demo попробовать записать. На 100 серии ботлоадер только на УАРТ1.
  11. Попробуйте загрузить или стереть через бутлоадер.
  12. Попробуйте вставить такое перед #include <util/delay.h> , иногда помогает в АС7 #define __DELAY_BACKWARD_COMPATIBLE__
  13. Все отлично работает. Покажите полный код с обеих устройств, тогда можно будет сказать, где ошибка.
  14. Наверно лучший вариант взять STM32F103 с двумя АЦП. Там они будут работать независимо. На вашем можно сделать иначе. Если 3 преобразования не получается, то делайте по 2. При 22 кГц время между двумя выборками 2.8 мкс ( меандр 45 мкс и 16 выборок = 2.8 мкс ). При Sample time = 1.5 время одного преобразования 1.17 мкс и двух соответственно 2.34 мкс.Делаете регулярные группы 0, 1, 0, 2 и запускаете по два канала. В буфере будет по 32 значения, канал 0 обрабатываете постоянно, а 1 и 2 по желанию.
  15. Думаю лучше задавать частоту одного таймера более высокочастотного, а второй запускать от него с постоянным делителем например 10. Книга называется "Мартин М. Инсайдерское руководство по STM32". Если не найдете могу скинуть.
  16. Похоже я не правильно понял. Запускать можно группу каналов, но если вам надо равномерно распределять выборки по меандру, то конечно надо второй таймер. Я имел ввиду вот такие преобразования.
  17. Да. Обработку я делаю по прерываниям от ДМА - половина буфера и полный. Пока обрабатываю первую половину, заполняется вторая.
  18. Зачем два таймера. АЦП сам запускает ДМА по окончанию каждого преобразования. У АЦП есть режим запуска по триггеру. Таймер будет запускать все 10 преобразований по вашему меандру. Только посмотрите какие таймеры и по какому событию могут запускать АЦП.
  19. Максимальная частота АЦП 12 МГц. Около 850 000 преобразований в секунду. Другая периферия на время преобразования не влияет. В ДМА лучше для АЦП поставить высший приоритет.
  20. Делал типа такого ADC_InitStr.ADC_ContinuousConvMode = ENABLE; ADC_InitStr.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStr.ADC_Mode = ADC_Mode_Independent; ADC_InitStr.ADC_NbrOfChannel = 4; ADC_InitStr.ADC_ScanConvMode = ENABLE; ADC_InitStr.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_Init( ADC1, &ADC_InitStr ); ADC_RegularChannelConfig( ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig( ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig( ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig( ADC1, ADC_Channel_TempSensor, 4, ADC_SampleTime_239Cycles5 ); ADC_TempSensorVrefintCmd( ENABLE ); ADC_DMACmd( ADC1 , ENABLE ); ADC_Cmd( ADC1, ENABLE ); ADC_InitStr.ADC_NbrOfChannel = 4; - это число каналов в группе ставите 16 ADC_RegularChannelConfig( ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); - число 1 - канал 0 будет запущен первым и т. д. Лучше порядок преобразований и число задать через регистры ADC_SQR1, ADC_SQR2 и ADC_SQR3. ADC_SQR1 = 0х00F00000; - типа такого.
  21. Если устроит, то есть регулярные каналы и можно настроить групповое преобразование. В группе может быть до 16 каналов. Можно сделать 14 преобразований важного канала и 2 преобразования вспомогательных каналов. При этом можно задать любой порядок следования каналов например: 1,1,2,1,1,3,1,1... Не надо будет перенастраивать, ДМА будет складывать так как зададите. Число каналов и последовательность задается в регистрах ADC_SQR1,2,3.
  22. Верхние транзисторы не открываются полностью. Обычно в верхнее плечо ставят pnp транзисторы. Другой вариант поставить готовые драйверы.
  23. snn_krs

    rcall

    На скриншоте видно, что функция main( uint32_t x ) тоже задана с аргументом и 6 байт стека сразу используются. Сделайте функцию main( void ) и освободятся 6 байт.
×
×
  • Создать...