2016-06-12 26 views
0

Ich habe Probleme beim Erzeugen von Sinuswelle mit meiner STM32F303K8 Nukleoboard. Meiner Meinung nach ist alles so konfiguriert, wie es sein sollte, aber ich kann gnd auf dem Oszilloskop sehen, also funktioniert es nicht. Vielleicht hat jemand eine Idee warum? Heres des Code:Kann keine Sinuswelle mit DAC und DMA auf STM32 erzeugen

#include "stm32f30x.h" 
#include <stdio.h> 

#define DAC_DHR12R2_ADDRESS  0x40007414 

const uint16_t Sine12bit[32] = { 
    2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, 
    3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909, 
    599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 
    263, 1647}; 

DAC_InitTypeDef    DAC_InitStructure; 
DMA_InitTypeDef    DMA_InitStructure; 
GPIO_InitTypeDef   GPIO_InitStructure; 
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; 

static void DMA_setup(void){ 
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_ADDRESS; 
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit; 
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 
    DMA_InitStructure.DMA_BufferSize = 32; 
    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_Cmd(DMA1_Channel1, ENABLE); 
    DAC_DMACmd(DAC1, DAC_Channel_1, ENABLE); 
} 

static void DAC_setup(void){ 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; 
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; 
    DAC_InitStructure.DAC_Buffer_Switch = DAC_BufferSwitch_Disable; 
    DAC_Init(DAC1, DAC_Channel_1, &DAC_InitStructure); 
} 

static void TIMER_setup(void){ 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); 

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
    TIM_TimeBaseStructure.TIM_Period = 100; 
    TIM_TimeBaseStructure.TIM_Prescaler = 0; 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); 

    TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); 
    TIM_Cmd(TIM6, ENABLE); 
} 

int main(void){ 
    TIMER_setup(); 
    DAC_setup(); 
    DMA_setup(); 
    DAC_Cmd(DAC1, DAC_Channel_1, ENABLE); 
} 
+0

Hinzugefügt. Danke;) – grzemski

+0

Was passiert nach main? Wenn Sie in einer freistehenden Umgebung keine Endlosschleife haben, zählt IP, bis er die nächsten Garbagewerte erreicht und interpretiert – 12431234123412341234123

Antwort

0

Ihr Programm funktioniert nur einige Einstellungen, immer noch den „Arbeiten“ Teil fehlt -, die ein Timer-Interrupt würden und innerhalb des einen einzigen Wert von Sin12 Array unterbrechen, um den DAC gesendet werden, egal wie. Starten Sie zuerst ohne DMA und wenn OK, können Sie es verbessern, indem Sie auf DMA-Unterstützung wechseln.