Tim19 -> DMA -> значение ADC в memory
03.06.2014, 12:41
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Tim19 -> DMA -> значение ADC в memory
План такой. ADC работает в непрерывном режиме тоесть в регистре данных ADC постоянно обновляется значение. Таймер (tim19 compare1) пинает DMA (dma1 канал1) а DMA перекладывает значение ADC в массив.
|
Код:
|
void TIM19_init(void) {
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* Enable TIM19 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE);
/* TIM19 Configuration */
TIM_DeInit(TIM19);
/* Fills each TIM_TimeBaseInitStruct member with its default value */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
/* Time base configuration*/
TIM_TimeBaseStructure.TIM_Period = 50-1;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 (OC1) */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1; // !! // в примере из интернета здесь "1"
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //!! // в примере из интернета этой стоки вообще нет
TIM_OC1Init(TIM19, &TIM_OCInitStructure);
/* TIM1 Update DMA Request enable */
TIM_DMACmd(TIM19, TIM_DMA_CC1, ENABLE);
/* Enable TIM19 counter */
TIM_Cmd(TIM19, ENABLE);
} |
|
Код:
|
void DMA_init(void) {
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
// DMA1 канал 1 - сигма-дельта АЦП
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &SDADC1-›JDATAR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &ex[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // направление от периферии к памяти
DMA_InitStructure.DMA_BufferSize = 100; // длинна буфера = ARRAY_LENGHT(mas1)
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // инкримент периферии отключен
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // инкремент в памяти - включен
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; // размер данных в периферии 32 бита
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // размер данных в памяти 32 бита
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // режим DMA - обычный, не круговой
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // поскольку DMA задействовано одно - его приоритет не имеет смысла
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // Memory-to-memory Disable
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
} |
инициализацию АЦП не привожу, оно точно работает, в регистре SDADC1-›JDATAR правильные данные. DMA массив не заполняет. предполанаю что я неправильно запускаю DMA таймером. связка ADC -› DMA - работает (стартовать ADC каждый раз не надо, оно запускается один раз, при инициализации и непрерывно измеряет), массив заполняется.
__________________
Kvsrk85(Андрей)
Последний раз редактировалось kvark85; 03.06.2014 в 13:38.
|
|
|
|
03.06.2014, 12:47
|
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: Tim19 -> DMA -> значение ADC в memory
АЦП не правильно настроен. Процессор какой?
|
|
|
|
03.06.2014, 13:09
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Tim19 -> DMA -> значение ADC в memory
Сообщение от Impartial
|
|
АЦП не правильно настроен. Процессор какой?
|
с чего это? я же говорю, оно работает, я могу свободно в любой момент считывать с него значения и эти значения правильные. процессор
STM32F373. а в той связке что я хочу реализовать АЦП с DMA никак не связано
__________________
Kvsrk85(Андрей)
|
|
|
|
03.06.2014, 13:25
|
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: Tim19 -> DMA -> значение ADC в memory
|
Цитата:
|
|
в регистре SDADC1-›JDATAR правильные данные.
|
Судя по этой фразе АЦП использует инжекторный режим. Он работает по другому.
|
|
|
|
03.06.2014, 13:39
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Tim19 -> DMA -> значение ADC в memory
поясните. то есть результаты инжекторной группы нельзя передавать с помощью DMA при условии что DMA запускается таймером? Потому что как я уже писал у меня получается эти же данные передавать с помощью DMA если DMA настроено брать данные по завершению преобразования SDADC.
__________________
Kvsrk85(Андрей)
|
|
|
|
03.06.2014, 13:55
|
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: Tim19 -> DMA -> значение ADC в memory
В инжекторной группе 4 регистра. Какой из них указан в CPAR?
|
|
|
|
03.06.2014, 15:00
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Tim19 -> DMA -> значение ADC в memory
Разобрался и заработало. Ошибка в даташите. На странице 172 на картинке показано что DMA1 канал1 может запускаться tim19_ch1, а на странице ниже (173-й) в таблице указано что DMA1 канал1 может запускаться tim19_ch3, tim19_ch4. Поменял настройку таймера на 3-й канал и заработало как и ожидалось.
__________________
Kvsrk85(Андрей)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:41.
|
|