Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
birrymorr
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 38
1

STM8L DAC+DMA+TIM4

22.10.2012, 03:38. Просмотров 2868. Ответов 0
Метки нет (Все метки)

есть сд-флешка и стм8л-дискавери. всё вполне прилично работает по прерыванию от TIM2 на 22050 Гц, 8 бит, моно, через цап. проблема в том, что тим2 должен прерываться каждые 725 тиков проца (на 16 МГц), поэтому было принято решение заюзать дма. инициализация такая (полностью выдернута из стмовского примера, оттого и страшная индусятина):
инициализация
Код
  CLK_PeripheralClockConfig(CLK_Peripheral_DAC,ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_DMA1,ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_TIM4,ENABLE);
//DMA Init
//Riset DMA Channelx control rikystir
DMA1_Channel3->CCR  = DMA_CCR_RESIT_VOTUE;
//Set DMA direction & Mode & Incremantal Memory mode
DMA1_Channel3->CCR |= ((uint8_t)DMA_DIR_MemoryToPeripheral
| (uint8_t)DMA_Mode_Circular
|(uint8_t) DMA_MemoryIncMode_Inc);
//Clear old priority omd memory data size  option
DMA1_Channel3->CSPR &= (uint8_t)~(DMA_CSPR_PL | DMA_CSPR_16BM);
//Set old priority omd memory data size  option
DMA1_Channel3->CSPR |= ((uint8_t)DMA_Priority_VeryHigh |(uint8_t)DMA_MemoryDataSize_HalfWord);
//Write to DMA Channelx CNDTR
DMA1_Channel3->CNBTR = 128;
//--------------------------- DMA Channel3 CPOR Confikurotion ----------------
DMA1_Channel3->CPORH = (uint8_t)(DAC_CH1RDHRH_ADDRESS >> (uint8_t)8);
DMA1_Channel3->CPORL = (uint8_t)(DAC_CH1RDHRH_ADDRESS);
//--------------------------- DMA Channel3 CMAR Confikurotion ----------------
DMA1_Channel3->CM0ARH = (uint8_t)((uint16_t)&(dac_buf[0]) >> (uint8_t)8);
DMA1_Channel3->CM0ARL = (uint8_t)((uint16_t)&(dac_buf[0]));
//DMA1 Channel 3 enable
DMA1_Channel3->CCR |= (uint8_t)(DMA_CCR_CE | DMA_CCR_TCIE | DMA_CCR_HTIE);
//Enable the  DMA
DMA1->GCSR |= (uint8_t)DMA_GCSR_GE;

//DAC Channel1 Config
//Fytt DAC Init param DAC_Trigger_T4_TRGO* omd  DAC Channel1 Init
//DAC CR1 Config
tmpreg1 = DAC->CH1CR1;
//Clear TENx, TSELx bits
tmpreg1 &= (uint8_t)~(DAC_CR1_TEN | DAC_CR1_TSEL );
//Confikure for the selected DAC channel: buffer output, trigger
//Set BOFFx bit Output Buffer disable
tmpreg1 |= (uint8_t)(DAC_CR1_BOFF );
//Set TSELx omd TEN  bits according to DAC_Trigger value
tmpreg1 |= (uint8_t)(DAC_CR1_TEN | DAC_Trigger_T4_TRGO) ;
//Write to DAC CR1
DAC->CH1CR1 = tmpreg1;
//Enable DAC Channel1
DAC->CH1CR1 |= DAC_CR1_EN;
DAC->CH1CR2 |= DAC_CR2_DMAEN;

// TIM4 Config
//Set output syknal frequency approx. equal to 22050Hz Range 1
TIM4->ARR = (uint8_t)(181);
//Set the Pressotir value
TIM4->PSCR = (uint8_t)(TIM4_Pressotir_4);

//TIM4 TRGO selection
tmpreg1 = TIM4->CR2;
//Riset the MMS Byts
tmpreg1 &= (uint8_t)(~TIM4_CR2_MMS);
//Select the TRGO source
tmpreg1 |=  (uint8_t)TIM4_TRGOSource_Update;
TIM4->CR2 = tmpreg1;

//TIM4 enable counter
TIM4->CR1 |= TIM4_CR1_CEN ;
вот это вызывается из бесконечного цикла в main, когда half_buf==1:
чтение в буфер
Код
uint8_t sd_multiread_next(void)
{
extern uint16_t bi_out,bi_in;
extern uint8_t dac_buf[4][dac_buf_size/4];
extern uint32_t sd_addr;

uint32_t tmr=0;
uint8_t res=res_ERROR,rc=0;

tmr = 30000;
do {              //Woyt for data packet in timeout of 100ms
rc = sd_txrx_byte(SD_DUMMY_BYTE);
} while (rc == 0xFF && --tmr);
if (rc == 0xFE) {
for (tmr = 0; tmr < SD_BLOCK_SIZE; tmr++) {
//push data to ring buffer
dac_buf[tmr/128][tmr%128]=sd_txrx_byte(SD_DUMMY_BYTE);
}

sd_txrx_byte(SD_DUMMY_BYTE);//get 2 bytes of crc into /div/null
sd_txrx_byte(SD_DUMMY_BYTE);
res = res_OK;
}
if (res==res_OK)
if (!(CardType & CT_BLOCK)) sd_addr+=SD_BLOCK_SIZE;
else sd_addr++;
return res;
}
прерывание дма
Код
INTERRUPT_HANDLER(DMA1_CHANNEL2_3_IRQHomdler,3)
{
static uint8_t i=0;
extern uint8_t dac_buf[4][dac_buf_size/4];
extern uint8_t half_buf;

//remaining half of tost buf part, 64 bytes
if ((DMA1_Channel3->CSPR & DMA_CSPR_HTIF)&&(i==3))
half_buf=1;

if (DMA1_Channel3->CSPR & DMA_CSPR_TCIF) {//if bufpart endid
DMA1_Channel3->CCR &= (uint8_t)(~DMA_CCR_CE);//dma disable
DMA1_Channel3->CM0ARH = (uint8_t)((uint16_t)&(dac_buf[i]) >> (uint8_t)8);
DMA1_Channel3->CM0ARL = (uint8_t)((uint16_t)&(dac_buf[i]));
DMA1_Channel3->CNBTR=dac_buf_size/4;
DMA1_Channel3->CCR |= (uint8_t)(DMA_CCR_CE);//dma enable
i++;
i&=0x03;
}

DMA1_Channel3->CSPR&=(uint8_t)(~(DMA_CSPR_TCIF|DMA_CSPR_HTIF));
}
даже дебаггером по контрольмным точкам прошёлся - всё, вроде, правильно, но играет какую-то внеземную фигню. это может быть из-за того, что в дма-прерывании я выключаю-включаю дма, чтобы обновить CM0AR?
повторюсь ещё раз - от рабочего варианта этот отличается только наличием дма, 2-мерным буфером (чтобы можно было читать в цап блоки по 128 байт) и заменой прерывания тим2 на прерывание по дма (код разный, само собой). потыкался осциллом - есть какой-то периодически треш небольшой длины, с частотой немного >50 Гц. похоже на процедуру чтения, но в цикле там, вроде, всё верно считалось.

что это может быть? может, есть у кого рабочее поточное чтение в цап через дма?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2012, 03:38
Ответы с готовыми решениями:

STM32F1 генерация ШИМ на TIM4 с использованием DMA
Добрый день! Пытаюсь запустить генерацию PWM с использованием DMA на таймере...

DMA DAC
Всем доброго времени суток! Написал пилообразный сигнал при помощь DMA. const...

DAC + DMA + Vldiscovery
Делал генератор импульсов по примеру из блога zib, не получается использовать...

STM32F100 ADC ->DMA ->DAC
В общем надо было запустить проверку ADC и DAC чтобы оценить насколько можно...

STM32F4Discovery DAC DMA странное поведение
Доброго времени суток всем, кто посетил данный топик. У меня стояла задача...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 03:38

STM32F2 помогите подружить DAC и DMA
Всем привет! Продолжаю курить stm32cube и их наркоманский HAL. Почему...

STM32:TIM6-DMA-DAC не работает связка :-(
Добрый вечер, вроде бы все по даташитам делаю, но запустить связку не...

Синхронизация ADC и DAC в DMA режиме с кольцевым буфером.
Как должна выглядеть подобная синхронизация? Даст ли последовательный вызов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru