Jump to content
Ivan Rusev

stm32f4 ADC+DMA interrupt запуск несколько каналов ацп

Recommended Posts

Не получается у меня запустить несколько каналов АЦП в прерывании по DMA.Чего не хватает?

Share this post


Link to post
Share on other sites
2 часа назад, Ivan Rusev сказал:

Чего не хватает?

Знаний не хватает.


У человека нет возможности всем делать добро, но у него есть возможность не причинять зла.

Share this post


Link to post
Share on other sites

Взаимодействие устройств IoT от Microchip с облаком Google

Благодаря облачным технологиям появилась возможность реализовать сложные проекты на базе микроконтроллера путем перераспределения вычислительной нагрузки между микроконтроллером и облаком. Простые в использовании отладочные платы, такие как AVR- и PIC-IoT WG, позволяют выполнять ресурсоемкие вычисления, передавая их в облако.
Подробнее

10 часов назад, Гар сказал:

Знаний не хватает.

это  верно поэтому и спрашиваю как запустить ADC более одного канала в прерывании по DMA ?

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Умный и безопасный дом от STMicroelectronics – строим вмеSTе!» (23.06.2021)

Приглашаем 23/06/2021 всех желающих принять участие в вебинаре, посвященном проектированию и разработке систем умного дома на базе компонентов STMicroelectronics. Предлагаемые ST ресурсы позволят разработчику легко построить каркас системы и быстро создать прототип своего приложения. На вебинаре также расскажем о беспроводных интерфейсах – ведь благодаря поддержке стандартов BLE и ZigBee разработчики смогут при необходимости интегрировать устройства сторонних производителей и создавать открытые системы.

Подробнее

13 часов назад, Ivan Rusev сказал:

запустить несколько каналов АЦП в прерывании по DMA

У дма есть прерывание по ошибкам, половины буфера, и окончании передачи данных. Прерывание дма вообще никак не связано с ацп и всем остальным - там код только для дма.

У ацп есть много режимов, в том числе и смешанных. Искать пример бесполезно, потому как настройки из примера не совпадут с вашими желаниями. 

Кстати насчёт желаний, тут вообще ничего не понятно. Что значит "несколько": 1-2-16? Насчёт мк я уже говорил, и не раз, это только у вас он один единственный, а в серии stm32f4 - их просто дофига. Нам тут угадывать нужно?

Share this post


Link to post
Share on other sites

LDH-25/65 – новые серии повышающих DC/DC LED-драйверов от Mean Well

Компания Mean Well расширила семейство популярных повышающих DC/DC LED-драйверов LDH двумя новыми сериями меньшей и большей мощности – LDH-25 и LDH-65, соответственно. Новые серии, обладая высоким КПД, применимы для изготовления экономичных светодиодных светильников с питанием от автономных источников тока, в том числе – на транспорте. Конструктивно драйверы выпускаются в двух различных вариантах.
Подробнее

1 час назад, AVI-crak Home сказал:

У дма есть прерывание по ошибкам, половины буфера, и окончании передачи данных. Прерывание дма вообще никак не связано с ацп и всем остальным - там код только для дма.

У ацп есть много режимов, в том числе и смешанных. Искать пример бесполезно, потому как настройки из примера не совпадут с вашими желаниями. 

Кстати насчёт желаний, тут вообще ничего не понятно. Что значит "несколько": 1-2-16? Насчёт мк я уже говорил, и не раз, это только у вас он один единственный, а в серии stm32f4 - их просто дофига. Нам тут угадывать нужно?

Stm32f407

Вобщето в серии F4 RM регистры все одинаковые . Прерывание  по DMA конечно не связано по АЦП.ИНжект каналы 4 по ацп в прерывании мне удалось заппустить правда с запуском таймером а не стартовим битом.Мне неудаётся запустить два канала ацп в прерывании по DMA? 

2 канала

Share this post


Link to post
Share on other sites
14.05.2021 в 20:41, Ivan Rusev сказал:

Вобщето в серии F4 RM регистры все одинаковые

Вообще то в серии F4 существует 8 разных RM. Не нужно делать вид что ты умный.

Share this post


Link to post
Share on other sites

проблема в том что преобразовуется  1 канал по счёту это может быть 0-10 .а дальше не происходит сканирование.В Инжект каналах у меня в прерываниях всё получилось.Сдесь с ДМА ?

Share this post


Link to post
Share on other sites

Я понял в чём проблема в алгоритме.Каналы переключаются .Но вот буфер один а как вытащить с масива одну единицу?

Share this post


Link to post
Share on other sites

Ну так ДМА и вытягивает, самый нормальный и удобный способ. Настраиваешь АЦП (не знаю я что там конкретно в F4), АЦП настраиваешь так чтобы давал он после преобразования запрос ДМА, настраиваешь ДМА на прием N полуслов (N количество каналов АЦП), стартуешь первое преобразование как тебе надо руками или таймером, в конце получаешь прерывание от ДМА что он принял все данные. и все. Все описано в RM, гугопереводчик в помощь. 

Share this post


Link to post
Share on other sites

Как то криво работает преобразование

58 минут назад, MasterElectric сказал:

Ну так ДМА и вытягивает, самый нормальный и удобный способ. Настраиваешь АЦП (не знаю я что там конкретно в F4), АЦП настраиваешь так чтобы давал он после преобразования запрос ДМА, настраиваешь ДМА на прием N полуслов (N количество каналов АЦП), стартуешь первое преобразование как тебе надо руками или таймером, в конце получаешь прерывание от ДМА что он принял все данные. и все. Все описано в RM, гугопереводчик в помощь. 

Буду дальше в лес идти.Может много дров принесу на форум.Потихоньку сдвигается с места задача.Задача повторить Бобр AVR(станция управления с защитой по току).На инжект каналах не хотелось бы.По ДМА хочу.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

  • Similar Content

    • By Ivan Rusev
      Меня интересует какие флаги в преривании устанавливать по ДМА ?Кусок кода можно?
    • By Ivan Rusev
      Меня интересует вот что .Я пытаюсь передать данные через терминал .А у меня он выводит не  текст а кието 0 и козябрики .Почему?
      main.c
    • By Ivan Rusev
      Можно ли на одно шине I2C подключать модуль часов реального времени ds3231 и LCD через модульI2C.У меня не получается почему?
    • By Любовь Бертулите
      Компания производитель вендинговых автоматов для розлива питьевой воды в поисках инженера-системотехника/инженера электронщика.
      График 5/2 с 9 до 18, здесь удаленный формат не рассматриваем.
      Место работы – г. Екатеринбург.
      Мы ищем специалиста, который будет делать прототипы нового для контроллера, курировать производство, проверять, дорабатывать, перепаивать, а также:
      Переписывать текущие программы на С++; Создавать программу для Android для конфигурации параметров контроллера через bluetooth. (т.е. предлагать новые, современные идеи и подходы для развития имеющихся контроллеров, которыми вы владеете); Предлагать новые программные продукты, среды разработки. Будет в тренде мира микроэлектроники, китайского контрактного производства. Может предложить совершенно новую реализацию наших текущих задач, чтобы это было лучше и эффективнее. В идеале, нам нужен специалист, который имеет:
      Опыт программирования микроконтроллеров Atmega, STM32, ESP32; Опыт работы в Altium Designer; Опыт работы в c++ (IAR, QT); Опыт работы с modbus, rs485/232, SPI. Готовы рассматривать специалистов с разным опытом, поэтому пишите, задавайте вопросы.
      Резюме можно отправить на почту lb@ktekt.ru (да, мы кадровое агентство), позвонить можно по следующему тел. 89068001212 - Любовь. 
       
    • By Ivan Rusev
      Уже не один день  сижу думаю как  запустить stm32  с eeprom для сохранения данных.И в кубе такая же история.Записую функцию чтения в майн и контролер  садится ничего не работает ? В чём дело ? Сталкивались с таким чудом.Записывал без функции тоже самое одна сторока  его убивает.
      #include"main.h"
      #define I2C_REQUEST_WRITE                       0x00//0
      #define I2C_REQUEST_READ                        0x01
      #define EEPROM_ADDRESS                   0b1010000
      #define I2C_OWNADDRESS1_7BIT             0x00004000U
      void i2c1_AF_init(void)
      {
        GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_0;
        GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_1;
        GPIOB->AFR[0]|=GPIO_AFRL_AFSEL7_2    ;
        GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_3;
        GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_0;
        GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_1;
        GPIOB->AFR[0]|=GPIO_AFRL_AFSEL6_2;
        GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_3;
      }
      void i2c1_init(void)
      {
          GPIOB->MODER|=GPIO_MODER_MODE7_1;
          GPIOB->MODER&=~GPIO_MODER_MODE7_0;
          GPIOB->OTYPER|=GPIO_OTYPER_OT7;
          GPIOB->MODER|=GPIO_MODER_MODE6_1;
          GPIOB->MODER&=~GPIO_MODER_MODE6_0;
          GPIOB->OTYPER|=GPIO_OTYPER_OT6;
          RCC->APB1ENR|=RCC_APB1ENR_I2C1EN;
          I2C1->CR2&=~I2C_CR2_FREQ_2  ;
          I2C1->TRISE=9;
          I2C1->CCR&=~I2C_CCR_FS;
          //I2C1->OAR1|=I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE;
           I2C1->OAR1|= I2C_OWNADDRESS1_7BIT;
          //I2C1->CR1|=I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP;

          I2C1->CR1|=I2C_CR1_ACK;
          I2C1->OAR2|=I2C_OAR2_ADD2;
          I2C1->CR1|=I2C_CR1_PE;
      }
      void I2C1_SendByteByADDR1(uint16_t adres,uint8_t  data)
      {
          //uint8_t data2;
          I2C1->CR1|=I2C_CR1_ACK;
          I2C1->CR1|=I2C_CR1_START;
            while(!(I2C1->SR1&I2C_SR1_SB))
            {
            }
          (void) I2C1->SR1;
          I2C1->DR|=  EEPROM_ADDRESS |I2C_REQUEST_WRITE;
          //I2C1->DR|= addr | I2C_REQUEST_WRITE;//
           while (!(I2C1->SR1& I2C_SR1_ADDR))
           {
           }
           (void) I2C1->SR1;
           (void) I2C1->SR2;
           I2C1->DR|=(uint8_t)adres;//
           while (!(I2C1->SR1& I2C_SR1_TXE))
           {
           }
           I2C1->DR|=(uint8_t) (adres>>8) ;//
           while (!(I2C1->SR1 & I2C_SR1_TXE))
           {
           }
           I2C1->DR|=data;
           while (!(I2C1->SR1 & I2C_SR1_BTF))
           {
           }
           I2C1->CR1|=I2C_CR1_STOP;
      }
      void I2C1_readByteByADDR1(uint16_t adres,uint8_t data)
      {
          //uint8_t data2;
          //uint8_t data1;
          I2C1->CR1|=I2C_CR1_ACK;
            I2C1->CR1|= I2C_CR1_START;
            while (!(I2C1->SR1& I2C_SR1_SB)){}
            (void) I2C1->SR1;
            I2C1->DR|=  EEPROM_ADDRESS |I2C_REQUEST_WRITE;
           // I2C1->DR|= SLAVE_OWN_ADDRESS | I2C_REQUEST_WRITE;
            while (!(I2C1->SR1& I2C_SR1_ADDR)){}
            (void) I2C1->SR1;
            (void) I2C1->SR2;
            //Transmit Address begin EEPROM
            I2C1->DR|=  (uint8_t) adres;
           while (!(I2C1->SR1& I2C_SR1_TXE)){}
           I2C1->DR|=(uint8_t) (adres>>8);
            while (!(I2C1->SR1& I2C_SR1_TXE)){}
            I2C1->CR1 |= I2C_CR1_START;
             while (!(I2C1->SR1 & I2C_SR1_SB)){}
             (void) I2C1->SR1;
             I2C1->DR = EEPROM_ADDRESS|I2C_REQUEST_READ;
             while (!(I2C1->SR1 & I2C_SR1_ADDR)){}
              (void) I2C1->SR1;
              (void) I2C1->SR2;
              I2C1->CR1 &= ~I2C_CR1_ACK;
                      while (!(I2C1->SR1 & I2C_SR1_RXNE)){}

                       data= I2C1->DR;
                  //    while (!(I2C1->SR1 & I2C_SR1_RXNE)){}
                       //data2 =I2C1->DR;
                    I2C1->CR1 |= I2C_CR1_STOP;
                  //   return data;
                  //    Delay(5);
      }
      void i2c2_AF_init(void)
      {
          GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_0;
            GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_1;
            GPIOB->AFR[1]|=GPIO_AFRH_AFSEL10_2    ;
            GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_3;
            GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_0;
            GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_1;
            GPIOB->AFR[1]|=GPIO_AFRH_AFSEL11_2;
            GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_3;
      }
      void i2c2_init(void)
      {
          GPIOB->MODER|=GPIO_MODER_MODE10_1;
              GPIOB->MODER&=~GPIO_MODER_MODE10_0;
              GPIOB->OTYPER|=GPIO_OTYPER_OT10;
              GPIOB->MODER|=GPIO_MODER_MODE11_1;
              GPIOB->MODER&=~GPIO_MODER_MODE11_0;
              GPIOB->OTYPER|=GPIO_OTYPER_OT11;
              //RCC->APB1ENR|=RCC_APB1ENR_I2C2EN;
      }
       
       
      вот на  этой строчке
×
×
  • Create New...