Например TDA7294

Форум РадиоКот • Просмотр темы - Изучение STM32
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 11:39:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 65 ]    , , , 4
Автор Сообщение
 Заголовок сообщения: Re: Изучение STM32
СообщениеДобавлено: Чт дек 01, 2016 21:30:54 
Всё! Сдаюсь!
В SPL АЦП запускал - настроилосьи работало. На CMSIS что то буксую...
Задача: Настроить DMA, настроить АЦП1+АЦП2 в фаст интерливе, 1,5 Cycle, однократный ручной запуск (SWSTART), 160 отсчётов.
Делаю настройку DMA:
Спойлер
Код:
/***********************************************************************/
/***************   ИНИЦИАЛИЗАЦИЯ АЦП1+АЦП2 ЧЕРЕЗ ДМА  ******************/
/***********************************************************************/
void Init_ADC_DMA(void)
{
/*******  Настраиваем DMA1_Channel1 для ADC1+ADC2  *********/

// Сброс DMA1_Channel1
    DMA1_Channel1->CCR &= (uint16_t)(~DMA_CCR1_EN); // Отключить DMA1_Channel1
    DMA1_Channel1->CCR = 0;
    DMA1_Channel1->CNDTR = 0;
    DMA1_Channel1->CPAR = 0;
    DMA1_Channel1->CMAR = 0;
    DMA1->IFCR |= (uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1);    // Сброс прерываний

// Настройка DMA1_Channel1
    DMA1_Channel1->CCR &= (uint32_t)0xFFFF800F;     // Сброс битов MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR

    RCC->AHBENR |= RCC_AHBENR_DMA1EN;               // подаём такты на DMA1
    DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;      // адрес периферийного устройства
    DMA1_Channel1->CMAR = (uint32_t)&BUFFER_ADC;    // адрес памяти
    DMA1_Channel1->CCR |= DMA_CCR1_MINC;            // увеличиваем адрес памяти
    DMA1_Channel1->CNDTR = buffer_size;             // количество ячеек для АЦП
    DMA1_Channel1->CCR |= DMA_CCR1_MSIZE_0;         // Half-word
    DMA1_Channel1->CCR |= DMA_CCR1_PSIZE_0;         // Half-word
    DMA1_Channel1->CCR |= DMA_CCR1_PL;              // Наивысший приоритет (ADC1+ADC2)->DMA->SRAM
    DMA1_Channel1->CCR |= DMA_CCR1_TCIE;            // прерывание по окончанию передачи
    DMA1_Channel1->CCR |= DMA_CCR1_EN;              // разрешаем работу DMA

Настраиваю АЦП1 и АЦП2 в фаст интерлив:
Спойлер
Код:
/*******  Настраиваем ADC1+ADC2 (interleaved) *********/

    // ADC_Deinit
    RCC->APB2RSTR |= RCC_APB2RSTR_ADC1RST;  // Сброс модуля АЦП1
    RCC->APB2RSTR &= ~RCC_APB2RSTR_ADC1RST;

    RCC->APB2RSTR |= RCC_APB2RSTR_ADC2RST;  // Сброс модуля АЦП2
    RCC->APB2RSTR &= ~RCC_APB2RSTR_ADC2RST;

    RCC->CFGR &=~ RCC_CFGR_ADCPRE_DIV2;     // Fsmpl=PCLK/2

//  Включить тактирование ADC1 и ADC2
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
    RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;

    // ADC1
    ADC1->CR1 = 0;
    ADC1->CR1 |= (ADC_CR1_DUALMOD_0 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_2);   // Fast-интелив ADC1+ADC2
    ADC1->CR2 = 0;
    ADC1->CR2 |= (ADC_CR2_DMA | ADC_CR2_CONT);  // Задействуем DMA и непрерывный режим
    ADC1->CR2 &=~ ADC_CR2_EXTTRIG;
    ADC1->CR2 |= ADC_CR2_EXTSEL;    // запуск от SWSTART
    ADC1->SQR1 &=~ ADC_SQR1_L;      // 1 преобразование
    ADC1->SQR3 &=~ ADC_SQR3_SQ1;    // Канал 0
    ADC1->SMPR2 &=~ ADC_SMPR2_SMP0; // 1.5 cycle

    // ADC2
    ADC2->CR1 = 0;
    ADC2->CR1 |= (ADC_CR1_DUALMOD_0 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_2);   // Fast-интелив ADC1+ADC2
    ADC2->CR2 = 0;
    ADC2->CR2 |= (ADC_CR2_DMA | ADC_CR2_CONT);   // Задействуем DMA и непрерывный режим
    ADC2->CR2 |= ADC_CR2_EXTTRIG;   // зачем ???
    ADC2->CR2 |= ADC_CR2_EXTSEL;    // запуск от SWSTART
    ADC2->SQR1 &=~ ADC_SQR1_L;      // 1 преобразование
    ADC2->SQR3 &=~ ADC_SQR3_SQ1;    // Канал 0
    ADC2->SMPR2 &=~ ADC_SMPR2_SMP0; // 1.5 cycle

    ADC1->CR2 |= ADC_CR2_DMA;       // Включить DMA
    ADC1->CR2 |= ADC_CR2_ADON;      // Включить ADC1
    ADC1->CR2 |= ADC_CR2_RSTCAL;    // Сброс калибровки ADC1
    while(ADC1->CR2 & ADC_CR2_RSTCAL) {}    // Ждём пока сбросится ADC1
    ADC1->CR2 |= ADC_CR2_CAL;           // Калибруемся
    while (!(ADC1->CR2 & ADC_CR2_CAL)); // Ждём окончания


    ADC2->CR2 |= ADC_CR2_ADON;      // Включить ADC2
    ADC2->CR2 |= ADC_CR2_RSTCAL;    // Сброс калибровки ADC2
    while(ADC2->CR2 & ADC_CR2_RSTCAL) {}    // Ждём пока сбросится ADC2
    ADC2->CR2 |= ADC_CR2_CAL;           // Калибруемся
    while (!(ADC2->CR2 & ADC_CR2_CAL)); // Ждём окончания

Пускаю так:
Спойлер
Код:
// Стартуем !!!
    ADC1->CR2 |= ADC_CR2_SWSTART;   // SWSTART
    while(DMA1->ISR & DMA_ISR_TCIF1) {} // Ждём когда флаг окончания передачи
    DMA1->IFCR |= DMA_IFCR_CTCIF1;  // Сбросим флаг
    DMA1_Channel1->CNDTR = buffer_size;  // Пинаем ДМА

    uint8_t i, j;
    for(i = 0; i < 160; i++)
    {
        BUFFER2_ADC_16[j++] = BUFFER_ADC[i] >> 16;       // из ADC2
        BUFFER1_ADC_16[j++] = BUFFER_ADC[i] & 0xFFFF;    // из ADC1
    }

Вроде всё по RM и примерам с ST делал, а так же ковырялся в исходниках SPL.
Возможно где то что то я уже изменил, глаз замылен, так что сорри.
ЧЯДНТ?
Уж извините что заставляю копаться в моём коде... :dont_know:
Спасибо.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Изучение STM32
СообщениеДобавлено: Пт дек 02, 2016 10:04:21 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 155
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Ну и что? Что именно не работает? И снова таки - камень-то какой?
Счетчик DMA транзакций может быть загружен только при выключенном канале.


Вернуться наверх
 
 Заголовок сообщения: Re: Изучение STM32
СообщениеДобавлено: Пт дек 02, 2016 12:24:28 
Извиняюсь. F103. Про отключение DMA каюсь, забыл.


Вернуться наверх
   
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Изучение STM32
СообщениеДобавлено: Пт дек 02, 2016 12:50:26 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 155
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Chettuser, внимание! Не самого DMA , а только канала. Там еще есть нюансы для каждой периферии - что и как отключать.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
 Заголовок сообщения: Re: Изучение STM32
СообщениеДобавлено: Пн дек 19, 2016 21:45:13 
Продолжаю глумиться над STM32F103.
Возник вопрос по EXTI_11 (тот что ADC запускает):
Если EXTI настраиваю так:
Код:
void Init_EXTI(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;     // Включить тактирование альт-ных функци

    AFIO->EXTICR[3] |= AFIO_EXTICR3_EXTI11_PA; // Выбрали PORTA.11

    EXTI->RTSR |= EXTI_RTSR_TR11;           // Прерывание по фронту на ноге 11 порта
//    EXTI->IMR |= EXTI_IMR_MR11;     // разрешили прерывание EXTI
    EXTI->EMR |= EXTI_EMR_MR11;     // по событию EXTI11 запустить ADC
}
то АЦП не хочет запускаться. Никак. Что странно - ведь EMR я настроил, значит pulse generator должен работать!
Изображение

Сделал временное рукожопое решение через включение регистра прерывания и контроль EXTI_PR_PR11:
Код:
EXTI->IMR |= EXTI_IMR_MR11;
...
while(!(EXTI->PR & EXTI_PR_PR11));


Не понимаю - почему не запускается АЦП от нижней ветки через Event Mask Register и Pulse Generator?

PS: Разумеется ADC настроен через EXTTRIG и EXTI_11.


Вернуться наверх
   
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 65 ]    , , , 4

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y