реклама на сайте
подробности

 
 
> ADC+DMA в STM32F107, Глюк DMA??
pr0m
сообщение Jan 31 2011, 11:36
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Всем привет.

Играюсь со слегка модицицированным примером для STM32F10x "RegSimul_DualMode" для ADC (из стандартной STM32F10xFWLib).
Там используются 2 ADC в режиме DualMode, 2 группы по 2 канала, после окончания конверсии каждой пары 32-битный результат складывается посредством DMA1 в буфер в ОЗУ. Так вот, я его переделал в том смысле, что зациклил процесс опроса (а не однократный опрос, как в оригинальном примере), после чего обнаружил несколько шокирующую картину - положение данных опроса в ОЗУ меняется от опроса к опросу, т.е. в том месте, где я ожидаю увидеть результат от каналов 1,2 через раз оказываются данные каналов 3,4, и наоборот.
Что это??? Только бы не глюк контроллера.... Собираюсь использовать его именно в режиме циклического опроса регулярной группы каналов АЦП.
Прилагаю кейловский проект.
Прикрепленные файлы
Прикрепленный файл  Project.rar ( 25.63 килобайт ) Кол-во скачиваний: 29
 


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kan35
сообщение Feb 14 2011, 06:19
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Работа ADC1 через HT и FT прерывания. Оцифровка 3 каналов в непрерывном режиме
Код
#include "stm32f10x.h"

unsigned short dmaarray[66];


DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;



void Driver_init(void)
{
    GPIO_InitStructure.GPIO_Pin = PIN_ACCTESTON;
    GPIO_Init(PORT_ACCTESTON, &GPIO_InitStructure);
    
    // ADC Init
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_InitStructure.GPIO_Pin = PIN_ACCTESTIN;
    GPIO_Init(PORT_ACCTESTIN, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_POWERTESTIN;
    GPIO_Init(PORT_POWERTESTIN, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_CURRENTTESTIN;
    GPIO_Init(PORT_CURRENTTESTIN, &GPIO_InitStructure);
    
    // тактируем DMA    
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    /* DMA1 channel1 configuration ----------------------------------------------*/
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
    DMA_InitStructure.DMA_MemoryBaseAddr = (unsigned long)dmaarray;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = sizeof(dmaarray)/sizeof(*dmaarray);
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);

    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC | DMA_IT_HT, ENABLE);
    
    DMA_Cmd(DMA1_Channel1, ENABLE);
    
    // тактируем ADC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div2);

    // ADC SETUP-----------------------------------------------------------------    
    ADC_Cmd(ADC1, DISABLE);        

    ADC_DeInit(ADC1);
    /* ADCx Configuration (ADC1CLK = 14 MHz) -----------------------------------*/
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 3;
    ADC_Init(ADC1, &ADC_InitStructure);

    /* Enable ADCx */
    ADC_Cmd(ADC1, ENABLE);
    
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1) == SET);
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1) == SET);

    ADC_RegularChannelConfig(ADC1, PIN_ACCTESTADCCH, 1, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, PIN_POWERTESTADCCH, 2, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, PIN_CURRENTTESTADCCH, 3, ADC_SampleTime_239Cycles5);

    ADC_DMACmd(ADC1, ENABLE);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);


    NVIC_InitTypeDef NVIC_InitStructure;
    /* Configure and enable ADC interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void DMA_Irq_half(void)
{

}

void DMA_Irq_full(void)
{

}


В stm32f10x_it.c:
Код
void DMA_Irq_half(void);
void DMA_Irq_full(void);

void DMA1_Channel1_IRQHandler(void)
{
    if (DMA_GetITStatus(DMA1_IT_HT1) == SET)
    {
        DMA_ClearITPendingBit(DMA1_IT_HT1);
        DMA_Irq_half();
    }
    if (DMA_GetITStatus(DMA1_IT_TC1) == SET)
    {
        DMA_ClearITPendingBit(DMA1_IT_TC1);
        DMA_Irq_full();
    }
}

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- pr0m   ADC+DMA в STM32F107   Jan 31 2011, 11:36
- - scifi   Разбираться времени нет. Прикладываю свой модуль А...   Jan 31 2011, 11:42
|- - pr0m   Цитата(scifi @ Jan 31 2011, 14:42) Разбир...   Jan 31 2011, 20:03
- - akimych   ЦитатаПрилагаю кейловский проект. Вот что мне не н...   Jan 31 2011, 16:01
- - akimych   ЦитатаВсё равно у меня в тылу остался вопрос, пред...   Feb 1 2011, 17:16
|- - pr0m   Цитата(akimych @ Feb 1 2011, 20:16) Не мо...   Feb 1 2011, 20:19
- - akimych   ЦитатаРазве такое возможно? Сложно сказать. Я не д...   Feb 1 2011, 22:23
|- - pr0m   Цитата(akimych @ Feb 2 2011, 01:23) Хм, а...   Feb 2 2011, 09:48
- - akimych   Правильно, я что-то стормозил, счетчик же к нулю с...   Feb 2 2011, 20:13
- - kan35   Во первых размер буфера посчитан не верно: КодDMA_...   Feb 12 2011, 05:14
|- - pr0m   Цитата(kan35 @ Feb 12 2011, 08:14) Во пер...   Feb 12 2011, 11:43
- - kan35   да, то, что идет работа синхронно 2 каналов я не у...   Feb 12 2011, 17:52
|- - pr0m   Цитата(kan35 @ Feb 12 2011, 20:52) да, то...   Feb 12 2011, 19:00
- - akimych   ЦитатаУже решил задачу, но посмотреть как другие д...   Feb 12 2011, 20:35
|- - pr0m   Цитата(akimych @ Feb 12 2011, 23:35) В че...   Feb 13 2011, 07:56
- - akimych   Да не, я пока разбирался, вдруг заметил, что если ...   Feb 13 2011, 11:26
|- - pr0m   Цитата(akimych @ Feb 13 2011, 14:26) Да н...   Feb 13 2011, 16:20
- - akimych   ЦитатаТогда для эксперименту одновременно в DualMo...   Feb 15 2011, 11:05


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th September 2025 - 16:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.0214 секунд с 7
ELECTRONIX ©2004-2016