www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F4 DAC + DMA


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Moritz M. (avrprogger)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Moritz M. (avrprogger)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
PS: Es muss an der DMA liegen, da ich mit dem GPIO, Timer, DAC ohne 
Probleme ein Triangle/Noise Signal erzeugen kann.

Autor: holger (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>  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.

Autor: Moritz M. (avrprogger)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

warum = (uint32_t)buffer?

es memory0address soll doch die anfangsaddresse sein oder?

Es kommt allerdings auch die ganze Zeit 3.3V.

Moritz

Autor: Michael Frangenberg (startrekmichi)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Moritz M. (avrprogger)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
funktioniert trotzdem nicht.

Moritz

Autor: Moritz M. (avrprogger)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo nochmal,

hat niemand eine Idee. Also UART mit DMA funktioniert. Und da verwende 
ich:
Memory0BaseAddr = (uint32_t)&buffer;

Moritz

Autor: holger (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>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.

Autor: Moritz M. (avrprogger)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo:

also der Buffer ist so deklariert:
uint16_t buffer[4096];

for(int i = 0; i < 4096; i++)
{
    buffer[i] = i;
}

Moritz

Autor: Tomas Poruba (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: pp (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
#define DAC_DHR12R1_ADDRESS    0x40007408


DMA1_STR5_CH7.DMA_PeripheralBaseAddr = DAC->DOR1; 
//-----??????????------


DMA1_STR5_CH7.DMA_PeripheralBaseAddr = DAC_DHR12R1_ADDRESS;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net