This program allows to have only one output instead of two.
I can have signal on PB6 or PB7 but not both on one time.
conflict is in this two lines.
Code: Select all
timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2);
timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR2);
Code: Select all
#define SAMPLES 100
#include <libmaple/dma.h>
dma_tube_config dma_cfg, dma_cfg2;
int val1[SAMPLES];
int val2[SAMPLES];
int amp = 35;
int cnt = 0;
int time_track = 0;
float stp = 6.2831 / SAMPLES;
int ret = 17;
int out1 = PB7; // TIM4_CH2 DMA_CH4 .
int out2 = PB6; // TIM4_CH1 DMA_CH3 . ***************************
timer_dev *dev1 = PIN_MAP[out2].timer_device;
timer_dev *dev2 = PIN_MAP[out2].timer_device;
void timer_conf()
{
// PB7 TIM4_CH2 DMA_CH4
timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); // CCR1, CCR1 = PB6
timer_dma_set_burst_len(dev1, 1); // CCR1, CCR2 = PB7
timer_dma_enable_req(dev1, PIN_MAP[out1].timer_channel); //CCR2, CCR2 = PB7
timer_set_reload(dev1, 102); //CCR2, CCR1 = PB6
timer_set_prescaler(dev1, 0);
// PB6 TIM4_CH1 DMA_CH3 . *********************
timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR2);
timer_dma_set_burst_len(dev2, 1);
timer_dma_enable_req(dev2, PIN_MAP[out2].timer_channel);
timer_set_reload(dev2, 102);
timer_set_prescaler(dev2, 0);
}
void dma_conf()
{
dma_init(DMA1);
// PB7 TIM4_CH2 DMA_CH4
// PB6 TIM4_CH1 DMA_CH3
dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); // PB7
dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); // PB6********************
dma_cfg.tube_src = val1; // PB7
dma_cfg.tube_src = val2; // PB6********************
dma_cfg.tube_src_size = DMA_SIZE_32BITS;
dma_cfg.tube_nr_xfers = SAMPLES;
dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC;
dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; //PB7
dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH1; //PB6 ********************
dma_cfg.target_data = 0;
ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg);
ret = dma_tube_cfg(DMA1, DMA_CH3, &dma_cfg);
}
void dma_start()
{
// PB7 TIM4_CH2 DMA_CH4
dma_enable(DMA1, DMA_CH4);
timer_resume(dev1);
dma_enable(DMA1, DMA_CH3);
timer_resume(dev2);
}
void init_wave()
{
int i;
for (i = 0; i < SAMPLES; i++)
{
val1[i] = 50 + amp * sin(stp * i);
val2[i] = 50 + amp * sin(stp * i);
}
}
void setup() {
pinMode(out1, PWM);
pinMode(out2, PWM);
timer_conf();
dma_conf();
dma_start();
init_wave();
}
void loop() {
}