Datum:
Hallo, ich versuche grade ein buffer über die DMA mit einem DAC auszugeben. Leider funktioniert dies nicht. Ich verwende DAC Channel 1 und DMA1 Stream 5 Channel 7 des STM32F4Discovery Board (STM32F407VG). Ich schätze, das liegt daran, das ich das falsche Register als PeripheralBaseAdress ausgewählt habe (DAC->DOR1). Wer weiß welches Register ich nehemen muss? (DAC->?????). Oder ist es doch ein anderes Problem?? Hier noch mal mein Code:
#include "stm32f4xx.h" void DAC_CH1_Init(void); uint16_t buffer[4096]; int i; int main(void) { SystemInit(); for(i = 0; i < 4096; i++) { buffer[i] = i; } DAC_CH1_Init(); while(1) { } return 1; } void DAC_CH1_Init(void) { //GPIO RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_DeInit(GPIOA); GPIO_InitTypeDef GPIO_A4; GPIO_A4.GPIO_Mode = GPIO_Mode_AN; GPIO_A4.GPIO_OType = GPIO_OType_PP; GPIO_A4.GPIO_Pin = GPIO_Pin_4; GPIO_A4.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_A4.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_A4); //TIM6 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); TIM_DeInit(TIM6); TIM_TimeBaseInitTypeDef TIM6_Init_Struct; TIM6_Init_Struct.TIM_ClockDivision = TIM_CKD_DIV1; TIM6_Init_Struct.TIM_CounterMode = TIM_CounterMode_Up; TIM6_Init_Struct.TIM_Period = 0xFF; TIM6_Init_Struct.TIM_Prescaler = 0; TIM_TimeBaseInit(TIM6, &TIM6_Init_Struct); TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); TIM_Cmd(TIM6, ENABLE); //DAC RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); DAC_DeInit(); DAC_InitTypeDef DAC_CH1; DAC_CH1.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_CH1.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_CH1.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_Init(DAC_Channel_1, &DAC_CH1); //DMA RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); DMA_DeInit(DMA1_Stream5); DMA_InitTypeDef DMA1_STR5_CH7; DMA1_STR5_CH7.DMA_BufferSize = 4096; DMA1_STR5_CH7.DMA_Channel = DMA_Channel_7; DMA1_STR5_CH7.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA1_STR5_CH7.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA1_STR5_CH7.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA1_STR5_CH7.DMA_Memory0BaseAddr = (uint32_t)&buffer; DMA1_STR5_CH7.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA1_STR5_CH7.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA1_STR5_CH7.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA1_STR5_CH7.DMA_Mode = DMA_Mode_Circular; DMA1_STR5_CH7.DMA_PeripheralBaseAddr = DAC->DOR1; //-----??????????------ DMA1_STR5_CH7.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA1_STR5_CH7.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA1_STR5_CH7.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA1_STR5_CH7.DMA_Priority = DMA_Priority_High; DMA_Init(DMA1_Stream5, &DMA1_STR5_CH7); DMA_Cmd(DMA1_Stream5, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_1, ENABLE); } |
mfg Moritz
Datum:
PS: Es muss an der DMA liegen, da ich mit dem GPIO, Timer, DAC ohne Probleme ein Triangle/Noise Signal erzeugen kann.
Datum:
> DMA1_STR5_CH7.DMA_Memory0BaseAddr = (uint32_t)&buffer; DMA1_STR5_CH7.DMA_Memory0BaseAddr = (uint32_t)buffer; > DMA1_STR5_CH7.DMA_PeripheralBaseAddr = DAC->DOR1; //-----??????????------ These bits are read-only, they contain data output for DAC channel1. Also ich würde sagen es ist DAC_DHR12R1.
Datum:
Hallo, warum = (uint32_t)buffer? es memory0address soll doch die anfangsaddresse sein oder? Es kommt allerdings auch die ganze Zeit 3.3V. Moritz
Datum:
Moritz M. schrieb: > Hallo, > > warum = (uint32_t)buffer? > > es memory0address soll doch die anfangsaddresse sein oder? Eben. "buffer" ist ein Zeiger auf das erste Element des Arrays. "&buffer" ist die Adresse der Adresse ;) Du könntest natürlich "&(buffer[0])" schreiben.
Datum:
funktioniert trotzdem nicht. Moritz
Datum:
Hallo nochmal, hat niemand eine Idee. Also UART mit DMA funktioniert. Und da verwende ich:
Memory0BaseAddr = (uint32_t)&buffer; |
Moritz
Datum:
>hat niemand eine Idee. Also UART mit DMA funktioniert. Und da verwende >ich: > >Memory0BaseAddr = (uint32_t)&buffer; Dann zeig doch mal wie buffer da deklariert ist.
Datum:
Hallo: also der Buffer ist so deklariert:
uint16_t buffer[4096]; for(int i = 0; i < 4096; i++) { buffer[i] = i; } |
Moritz
Datum:
Hi, I'm using libopenstm and this helped me: DMA1_S5PAR = (u32*)&DAC_DHR12R1; (first i have here DMA1_S5PAR = (u32*)DAC_DHR12R1; and DMA always stops with transfer error) Regards Tomas
Datum:
#define DAC_DHR12R1_ADDRESS 0x40007408 DMA1_STR5_CH7.DMA_PeripheralBaseAddr = DAC->DOR1; //-----??????????------ DMA1_STR5_CH7.DMA_PeripheralBaseAddr = DAC_DHR12R1_ADDRESS;