[Решено] 3-канальный генератор PWM с использованием DMA, вызванного таймером, DMA

Тед
Вт, 3 июля 2018 г., 12:10
Привет
Чтобы узнать таймеры, которые я пытаюсь добавить в 2 -канальный генератор, третий, но у меня ничего нет на PIN PB1.
Что я делаю не так ?
#define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3 ; int flag1 = 0; int flag2 = 0; int flag3 = 0; int out1 = PB7; int out2 = PA8; int out3 = PB1; //int out3 = PA7; int val1[SAMPLES]; int val2[SAMPLES]; int val3[SAMPLES]; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; //120 deg = stp/3 int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; uint8 cc_channel4 = PIN_MAP[out3].timer_channel; void fun() { flag1++; } void fun2() { flag2++; } void fun3() { flag3++; } ////////////////////////////////////////////////////////// void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); // 3 channel /////////////////////////////////////////////////////////////////// timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR1); ///////////////////////////////////////////////////////////////// timer_dma_set_burst_len(dev3, 1); timer_dma_enable_req(dev3, cc_channel4); timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); ///////////////////////////////////////// /* T3C3 DMA C3 */ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH2; dma_cfg.target_data = 0; //////////////////////////////////////////// } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); ////////////////////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); dma_enable(DMA1, DMA_CH4); timer_resume(dev3); /////////////////////////////////////////// } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = 50 + amp * cos(stp * i); val3[i] = 50 + amp * sin(stp * i); } } void get_wave(int16 shift) { int i; for (i = 0; i < SAMPLES; i++) { val2[i] = 50 + amp * sin( stp * i + shift * 0.1 * 6.2831 / 360); } } */ void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); init_wave(); // get_wave(shift); } void loop() { }

Стивестронг
Вт, 3 июля 2018 г., 7:10
Какая доска?
Какое ядро?
Который ide? Скриншот?
Какой метод загрузки?

Тед
Вт. 3 июля 2018 г. 9:29 утра
Arm Cortex M3 STM32F103, синяя таблетка.

Стивестронг
Вт, 3 июля 2018 г., 9:45 утра
Вы устанавливаете неправильный базовый адрес для DMA и DMA REQ SRC также неверны для PB1.
PB1 IS T3C4, DMA_C3. Проверьте код.

Тед
Вт, 3 июля 2018 г., 11:07
Я исправил первую часть, вторую, у меня нет уверенности.

#define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3 ; int flag1 = 0; int flag2 = 0; int flag3 = 0; int out1 = PB7; int out2 = PA8; int out3 = PB1; //int out3 = PA7; int val1[SAMPLES]; int val2[SAMPLES]; int val3[SAMPLES]; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; //120 deg = stp/3 int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; uint8 cc_channel4 = PIN_MAP[out3].timer_channel; void fun() { flag1++; } void fun2() { flag2++; } void fun3() { flag3++; } ////////////////////////////////////////////////////////// void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); // 3 channel /////////////////////////////////////////////////////////////////// timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR1); ///////////////////////////////////////////////////////////////// timer_dma_set_burst_len(dev3, 1); timer_dma_enable_req(dev3, cc_channel4); timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); ///////////////////////////////////////// /* T3C3 DMA C3 */ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; // dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH2; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH4; dma_cfg.target_data = 0; //////////////////////////////////////////// } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); ////////////////////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); dma_enable(DMA1, DMA_CH4); timer_resume(dev3); /////////////////////////////////////////// } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = 50 + amp * cos(stp * i); val3[i] = 50 + amp * sin(stp * i); } } void get_wave(int16 shift) { int i; for (i = 0; i < SAMPLES; i++) { val2[i] = 50 + amp * sin( stp * i + shift * 0.1 * 6.2831 / 360); } } void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); init_wave(); // get_wave(shift); } void loop() { }

Стивестронг
Вт. 3 июля 2018 г. 12:24
timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR4); // T3 channel 4

Тед
Вт
Спасибо
Я сделал эти изменения, но должен быть что -то еще, нет сигнала на PB1
#define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3 ; int flag1 = 0; int flag2 = 0; int flag3 = 0; int out1 = PB7; int out2 = PA8; int out3 = PB1; //int out3 = PA7; int val1[SAMPLES]; int val2[SAMPLES]; int val3[SAMPLES]; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; //120 deg = stp/3 int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; uint8 cc_channel4 = PIN_MAP[out3].timer_channel; void fun() { flag1++; } void fun2() { flag2++; } void fun3() { flag3++; } ////////////////////////////////////////////////////////// void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); // 3 channel /////////////////////////////////////////////////////////////////// //timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR1); //timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR3); timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR4); // T3 channel 4 ///////////////////////////////////////////////////////////////// timer_dma_set_burst_len(dev3, 1); timer_dma_enable_req(dev3, cc_channel4); timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); ///////////////////////////////////////// /* T3C3 DMA C3 */ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; // dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH4; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM3_CH4; // T3 channel 4 dma_cfg.target_data = 0; //////////////////////////////////////////// } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); ////////////////////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); dma_enable(DMA1, DMA_CH4); timer_resume(dev3); /////////////////////////////////////////// } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = 50 + amp * cos(stp * i); val3[i] = 50 + amp * sin(stp * i); } } void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); init_wave(); // get_wave(shift); } void loop() { }

Тед
Вт. 3 июля 2018 г. 13:01
Я думаю, что что -то не правильно здесь.
весело и весело 3 идентичны
void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); ////////////////////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); dma_enable(DMA1, DMA_CH4); timer_resume(dev3); ///////////////////////////////////////////

Тед
Вт
Чтобы избежать путаницы, я изменил таймер 3 на канал 3 = PB0, не помог.
#define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3 ; int flag1 = 0; int flag2 = 0; int flag3 = 0; int out1 = PB7; int out2 = PA8; //int out3 = PB1; //int out3 = PA7; int out3 = PB0; int val1[SAMPLES]; int val2[SAMPLES]; int val3[SAMPLES]; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; //120 deg = stp/3 int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; //uint8 cc_channel4 = PIN_MAP[out3].timer_channel; uint8 cc_channel3 = PIN_MAP[out3].timer_channel; void fun() { flag1++; } void fun2() { flag2++; } void fun3() { flag3++; } ////////////////////////////////////////////////////////// void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); // 3 channel /////////////////////////////////////////////////////////////////// //timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR1); //timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR3); // timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR4); // T3 channel 4 timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR3); ///////////////////////////////////////////////////////////////// timer_dma_set_burst_len(dev3, 1); //timer_dma_enable_req(dev3, cc_channel4); timer_dma_enable_req(dev3, cc_channel3); timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); ///////////////////////////////////////// /* T3C3 DMA C3 */ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; // dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH4; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM3_CH4; // T3 channel 4 dma_cfg.tube_req_src = DMA_REQ_SRC_TIM3_CH3; // T3 channel 3 dma_cfg.target_data = 0; //////////////////////////////////////////// } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); ////////////////////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); //dma_enable(DMA1, DMA_CH4); dma_enable(DMA1, DMA_CH3); timer_resume(dev3); /////////////////////////////////////////// } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = 50 + amp * cos(stp * i); val3[i] = 50 + amp * sin(stp * i); } } void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); init_wave(); // get_wave(shift); } void loop() { }

Стивестронг
Вторник 3 июля 2018 г. 14:24
Ваша оригинальная настройка использовалась:

PB7 = T4C2 -> DMA_CH4
PA8 = T1C1 -> DMA_CH2
PB1 = T3C4 -> DMA_CH3

Так почему вы используете DMA_CH4 для PB1? Это должно быть dma_ch3.
Пожалуйста, обратите внимание на это и настройте DMA соответственно.

Тед
Вт
PB1 Это канал 4 ?
Я попробовал обе строки.
dma_cfg.tube_nr_xfers = SAMPLES; dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE; // dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH4; // T3 channel 4 dma_cfg.tube_req_src = DMA_REQ_SRC_TIM3_CH3; // T3 channel 3

Тед
Вт
Это для PB0, канал 3.
#define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3 ; int flag1 = 0; int flag2 = 0; int flag3 = 0; int out1 = PB7; int out2 = PA8; //int out3 = PB1; //int out3 = PA7; int out3 = PB0; int val1[SAMPLES]; int val2[SAMPLES]; int val3[SAMPLES]; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; //120 deg = stp/3 int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; uint8 cc_channel3 = PIN_MAP[out3].timer_channel; void fun() { flag1++; } void fun2() { flag2++; } void fun3() { flag3++; } ////////////////////////////////////////////////////////// void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); // 3 channel /* /////////////////////////////////////////////////////////////////// //timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR1); //timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR3); timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR4); // T3 channel 4 ///////////////////////////////////////////////////////////////// */ // channel 3 timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR3); timer_dma_set_burst_len(dev3, 1); timer_dma_enable_req(dev3, cc_channel3); timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); ///////////////////////////////////////// /* T3C3 DMA C3 */ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; // dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH4; // T3 channel 4 dma_cfg.tube_req_src = DMA_REQ_SRC_TIM3_CH3; // T3 channel 3 ret = dma_tube_cfg(DMA1, DMA_CH3, &dma_cfg); dma_cfg.target_data = 0; //////////////////////////////////////////// } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); /* ////////////////////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); dma_enable(DMA1, DMA_CH4); timer_resume(dev3); /////////////////////////////////////////// */ dma_attach_interrupt(DMA1, DMA_CH3, fun3); dma_enable(DMA1, DMA_CH3); timer_resume(dev3); } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = 50 + amp * cos(stp * i); val3[i] = 50 + amp * sin(stp * i); } } void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); init_wave(); // get_wave(shift); } void loop() { }

Стивестронг
Вт. 3 июля 2018 г. 18:02
Смотрите здесь сопоставление булавки на каналы таймера: https: // github.com/rogerclarkmelbourne/ ... Стр.#L58-L84
Для картирования канала DMA см. RM0008 Глава 13.3.7, стр. 281, Рисунок 50.

Тед
Вт, 3 июля 2018 г., 20:17
Я не знаком с этим, я всегда использую это.
Изображение

Тед
Вт, 3 июля 2018 г., 21:20
Я пытаюсь использовать таймер 2, PA3 работает с другой программой.
#define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3; int flag1 = 0; int flag2 = 0; int flag3 = 0; int out1 = PB7; int out2 = PA8; //int out3 = PA2; // Timer #2, Channel #3 int out3 = PA3; // Timer #2, Channel #4 int val1[SAMPLES]; int val2[SAMPLES]; int val3[SAMPLES]; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; uint8 cc_channel4 = PIN_MAP[out3].timer_channel; void fun() { flag1++; } void fun2() { flag2++; } void fun3() { flag3++; } void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); ////////////////////////////// //timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR1); // ????????? timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev3, 1); timer_dma_enable_req(dev3, cc_channel4); // timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); ////////////////////////////// } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 , timer #4*/ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2, Timer #1*/ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); /////////////////////////////////// /* T2C1 DMA C3, Timer #2*/ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM2_CH4; // dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); // //////////////////////////////////////// } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); //////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); // dma_enable(DMA1, DMA_CH4); // timer_resume(dev3); //////////////////////////////// } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = 50 + amp * cos(stp * i); val3[i] = 50 + amp * sin(stp * i); } } void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); timer_conf(); dma_conf(); dma_start(); init_wave(); } void loop() { }

Col68
Ср. 04 июля 2018 г. 12:06
Привет, дорогой Тед, желая помочь вам, я использую слова «таймер 2 и PA3», я падаю на эту таблицу, которые могут вас заинтересовать.

Изображение

Спасибо за то, что поделились, и я благодарю опытных добровольцев, которые помогают и приносят свою поддержку.

Желаю вам успеха для вашего проекта.

Тед
Ср. 04 июля 2018 г. 12:43
Спасибо за таблицу, можете ли вы дать ссылку на нее, может быть, я найду решение моей проблемы ?

Рик Кимбалл
Ср. 04 июля 2018 г., 4:12
Можете ли вы иметь два разных таймера, используя один и тот же канал DMA? Я не вижу, как это будет работать.

Кроме того, почему вы используете 32 бита, разве таймер CCRX Регистры 16 бит?

Тед
Ср. 04 июля 2018 г. 10:52 утра
[Тед - Вторник 3 июля 2018 г. 13:01] - Я думаю, что что -то не правильно здесь.
весело и весело 3 идентичны
void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); ////////////////////////////////////////////// dma_attach_interrupt(DMA1, DMA_CH4, fun3); dma_enable(DMA1, DMA_CH4); timer_resume(dev3); ///////////////////////////////////////////

Тед
Ср. 04 июля 2018 г. 10:56 утра
Итак, я пытаюсь использовать DMA2, но у меня есть ошибка.
C:\Users\OWNER\Desktop\DMA_2_3_CH\DMA_2_3_CH.ino: In function 'void dma_conf()': DMA_2_3_CH:104: error: 'DMA2' was not declared in this scope dma_init(DMA2); ^ C:\Users\OWNER\Desktop\DMA_2_3_CH\DMA_2_3_CH.ino: In function 'void dma_start()': DMA_2_3_CH:135: error: 'DMA2' was not declared in this scope dma_attach_interrupt(DMA2, DMA_CH4, fun3); // ^ exit status 1 'DMA2' was not declared in this scope

Рик Кимбалл
Ср. 04 июля 2018 г. 15:32
PB6 TIM4_Channel1 может быть хорошим выбором, поскольку он использует DMA1_Channel1 и не будет конфликтовать с другими булавками.

Тед
Ср. 04 июля 2018 г. 15:46
Таймер 4 уже используется - OUT1 = PB7;

Рик Кимбалл
Ср. 04 июля 2018 г. 16:12
PB6 использует TIM4_CH1 .. И это использует dma1_channel1
PB7 с использованием TIM4_CH2 .. И это использует dma1_channel4
dma1_chan_map.png
dma1_chan_map.PNG (62.56 киб) просмотрено 316 раз

Тед
Ср. 04 июля 2018 г. 16:49
Спасибо
Но таймер 4 уже используется первым выходом - Val #1, я хочу добавить независимый третий таймер.

Col68
Чт, 5 июля 2018 г., 12:51
[Тед - Ср. 04 июля 2018 г. 12:43] - Спасибо за таблицу, можете ли вы дать ссылку на нее, может быть, я найду решение моей проблемы ?
Конечно, это обложка книги по этому вопросу.
https: // книги.Google.FR/книги?id = uytedw ... A3&f = false

Тед
Пт, 6 июля 2018 г., 14:40
Чтобы избежать каких -либо конфликтов, я пытаюсь сделать один генератор синусоидальных волн, используя таймер № 3 на базе рабочего генератора сборка Ontimer # 4.

Что я не так ?

Таймер генератора квадратных волн № 3 работает с PIN PB0, так что должен SINE.

HardwareTimer pwmtimer3(3); void setup() { //T3CH3 //pinMode(PA7, PWM); pinMode(PB0, PWM); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(1); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer3.setOverflow(1000-1); // PWM Period width for 720kHz ? pwmtimer3.setCompare(TIMER_CH3, 500); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); } void loop() { }

Рик Кимбалл
Пт, 6 июля 2018 г., 17:35
Я добавил некоторые определения, чтобы облегчить тестирование с другими булавками:

PB0 с использованием TIM3_CH3, который работает с DMA CH2

Это выводит греховную волну на PB0: //#define SAMPLES 1000 #include #define F_TIMER 72000000 #define FREQ 7200 // 7kHz #define SAMPLES ((int)sqrt(F_TIMER / FREQ)) #define T_CNT ((F_TIMER/FREQ)/SAMPLES) dma_tube_config dma_cfg ; int flag1 = 0; int out1 = PB0; // PB0 TIM3 CH3 uses DMA CH2 #define DMA_REQ_SRC_TIMX_CHX DMA_REQ_SRC_TIM3_CH3 #define TIMER_DMA_BASE_CCRX TIMER_DMA_BASE_CCR3 #define DMA_CHX DMA_CH2 int val1[SAMPLES]; int16 shift = 30; int amp = 50; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; void fun() { flag1++; } void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCRX); // timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1);// timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); } void dma_conf() { dma_init(DMA1); /* T3C3 DMA C2 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIMX_CHX; // dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CHX, &dma_cfg); } void dma_start() { dma_attach_interrupt(DMA1, DMA_CHX, fun); dma_enable(DMA1, DMA_CHX); timer_resume(dev1); } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); } } void setup() { int i; pinMode(out1, PWM); timer_conf(); dma_conf(); dma_start(); init_wave(); } void loop() { }

Тед
Пт, 6 июля 2018 г., 18:28
БОЛЬШОЙ !!!
СПАСИБО !!!
Наконец я могу собрать вещи вместе.
Вопрос.
Оригинальный 2 -канальный генератор имеет некоторый фазовый сдвиг, когда оба установлены для синуса, как это устранить ? - Фазовая коррекция ?

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); } }

Тед
Пт 06 июля 2018 г., 20:18
Я изменил некоторые имена, поэтому они будут отличаться от 2 -канального генератора (= #1) и работают ОК, однако добавляя его в генератор № 1, у меня есть 2 конфликта. Когда я активирую конфликт № 1, сигнал на PA8 на 50% более слабее и не синхронизуется с сигналом на PB7, когда #2 сигнал на PA8 исчезнет.

void timer_conf () = конфликт #1, void dma_conf () = конфликт #2

Ваш модифицированный, ОК
//#define SAMPLES 1000 #include #define F_TIMER 72000000 #define FREQ 7200 // 7kHz #define SAMPLES ((int)sqrt(F_TIMER / FREQ)) #define T_CNT ((F_TIMER/FREQ)/SAMPLES) dma_tube_config dma_cfg ; int flag3 = 0; int out3 = PB0; // PB0 TIM3 CH3 uses DMA CH2 #define DMA_REQ_SRC_TIMX_CHX DMA_REQ_SRC_TIM3_CH3 #define TIMER_DMA_BASE_CCRX TIMER_DMA_BASE_CCR3 #define DMA_CHX DMA_CH2 int val3[SAMPLES]; int16 shift = 30; int amp = 50; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; int ret = 17; timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel3 = PIN_MAP[out3].timer_channel; void fun3() { flag3++; } void timer_conf() { timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCRX); // timer_dma_set_burst_len(dev3, 1); timer_dma_enable_req(dev3, cc_channel3);// timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); } void dma_conf() { dma_init(DMA1); /* T3C3 DMA C2 */ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIMX_CHX; // dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CHX, &dma_cfg); } void dma_start() { dma_attach_interrupt(DMA1, DMA_CHX, fun3); dma_enable(DMA1, DMA_CHX); timer_resume(dev3); } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val3[i] = 50 + amp * sin(stp * i); } } void setup() { int i; pinMode(out3, PWM); timer_conf(); dma_conf(); dma_start(); init_wave(); } void loop() { }

Рик Кимбалл
Пт, 6 июля 2018 г., 20:48
Я сам успешно пробовал каждую булавку само по себе: #if 0 static const int WS281X_PIN = PB0; #define DMA_REQ_SRC_TIMX_CHNX DMA_REQ_SRC_TIM3_CH3 #define TIMER_DMA_BASE_CCRX TIMER_DMA_BASE_CCR3 #define DMA_CHX DMA_CH2 #elif 1 static const int WS281X_PIN = PB7; #define DMA_REQ_SRC_TIMX_CHNX DMA_REQ_SRC_TIM4_CH2 #define TIMER_DMA_BASE_CCRX TIMER_DMA_BASE_CCR2 #define DMA_CHX DMA_CH4 #elif 0 static const int WS281X_PIN = PA8; #define DMA_REQ_SRC_TIMX_CHNX DMA_REQ_SRC_TIM1_CH1 #define TIMER_DMA_BASE_CCRX TIMER_DMA_BASE_CCR1 #define DMA_CHX DMA_CH2 #endif

Тед
Пт, 6 июля 2018 г., 20:51
Эти две строки вызывают проблемы.
//timer_dma_enable_req(dev3, cc_channel3);//

Рик Кимбалл
Пт, 6 июля 2018 г., 21:01
@stevestestrong дал вам ответ, на какие булавки использовать здесь:

ViewTopic.PHP?F = 19&T = 3820#P46900

#IF 1
Static Const int ws281x_pin = pb1;
#define dma_req_src_timx_chnx dma_req_src_tim3_ch4
#define timer_dma_base_ccrx timer_dma_base_ccr4
#define DMA_CHX DMA_CH3

#elif 0
Static Const int ws281x_pin = pb7;
#define dma_req_src_timx_chnx dma_req_src_tim4_ch2
#define timer_dma_base_ccrx timer_dma_base_ccr2
#define DMA_CHX DMA_CH4

#elif 0
Static Const int ws281x_pin = pa8;
#define dma_req_src_timx_chnx dma_req_src_tim1_ch1
#define timer_dma_base_ccrx timer_dma_base_ccr1
#define DMA_CHX DMA_CH2

#elif 0
Static Const int ws281x_pin = pb0;
#define dma_req_src_timx_chnx dma_req_src_tim3_ch3
#define timer_dma_base_ccrx timer_dma_base_ccr3
#define DMA_CHX DMA_CH2
#endif

Тед
Пт, 6 июля 2018 г., 22:32
Я перешел на PB1, никаких конфликтов и никаких сигналов на PB1.
#define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3; /* /////////////// // PB0 TIM3 CH3 uses DMA CH2 #define DMA_REQ_SRC_TIMX_CHX DMA_REQ_SRC_TIM3_CH3 #define TIMER_DMA_BASE_CCRX TIMER_DMA_BASE_CCR3 #define DMA_CHX DMA_CH2 ///////////////// */ //////////////////////// //static const int WS281X_PIN = PB1; #define DMA_REQ_SRC_TIMX_CHNX DMA_REQ_SRC_TIM3_CH4 #define TIMER_DMA_BASE_CCRX TIMER_DMA_BASE_CCR4 #define DMA_CHX DMA_CH3 //////////////////////// int flag1 = 0; int flag2 = 0; int flag3 = 0; int out1 = PB7; int out2 = PA8; int out3 = PB1; int val1[SAMPLES]; int val2[SAMPLES]; int val3[SAMPLES]; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; /////////////////////////////// timer_dev *dev3 = PIN_MAP[out3].timer_device; uint8 cc_channel3 = PIN_MAP[out3].timer_channel; ////////////////////////// void fun() { flag1++; } void fun2() { flag2++; } void fun3() { flag3++; } void timer_conf() { //T4 timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); //T2 timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); //////////////////////////////////// timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR4); // timer_dma_set_burst_len(dev3, 1); // conflict #1 timer_dma_enable_req(dev3, cc_channel3);// timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); /////////////////////////////////// } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); /////////////////////// /* T3C3 DMA C2 */ dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_CMPLT_IE; //dma_cfg.tube_req_src = DMA_REQ_SRC_TIMX_CHX; // dma_cfg.tube_req_src = DMA_REQ_SRC_TIM3_CH4; // dma_cfg.target_data = 0; // conflict #2 ret = dma_tube_cfg(DMA1, DMA_CH3, &dma_cfg); ////////////////////// } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); //////////////////////////// dma_attach_interrupt(DMA1, DMA_CH3, fun3); dma_enable(DMA1, DMA_CH4); timer_resume(dev3); //////////////////////////// } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = val1[i]; val3[i] = val1[i]; } } void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); timer_conf(); dma_conf(); dma_start(); init_wave(); } void loop() { }

Рик Кимбалл
Пт 06 июля 2018 г. 22:33
Я не думаю, что мы можем вам помочь ... Мы объяснили это 6 способами с воскресенья

Тед
Пт, 6 июля 2018 г. 22:40
Спасибо, Рик, за вашу помощь, я постараюсь решить эту проблему.
С уважением
Тед

Тед
Пт, 6 июля 2018 г., 22:41
Спасибо всем вам

Рик Кимбалл
Пт, 6 июля 2018 г., 22:59
Протестировано и работает: #define SAMPLES 100 #include dma_tube_config dma_cfg, dma_cfg2, dma_cfg3; int val1[SAMPLES]; int val2[SAMPLES]; int val3[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 timer_dev *dev1 = PIN_MAP[out1].timer_device; int out2 = PA8; // TIM1_CH1 DMA_CH2 timer_dev *dev2 = PIN_MAP[out2].timer_device; int out3 = PB1; // TIM3_CH4 DMA CH3 timer_dev *dev3 = PIN_MAP[out3].timer_device; void timer_conf() { // PB7 TIM4_CH2 DMA_CH4 timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, PIN_MAP[out1].timer_channel); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); // PA8 TIM1_CH1 DMA_CH2 timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); 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); // PB1 TIM3_CH4 DMA CH3 timer_dma_set_base_addr(dev3, TIMER_DMA_BASE_CCR4); // timer_dma_set_burst_len(dev3, 1); timer_dma_enable_req(dev3, PIN_MAP[out3].timer_channel);// timer_set_reload(dev3, 102); timer_set_prescaler(dev3, 0); } void dma_conf() { dma_init(DMA1); // PB7 TIM4_CH2 DMA_CH4 dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; 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; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); // PA8 TIM1_CH1 DMA_CH2 dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; 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_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); // PB1 TIM3_CH4 DMA CH3 dma_cfg.tube_dst = &(dev3->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val3; 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_TIM3_CH4; // dma_cfg.target_data = 0; 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); // PA8 TIM1_CH1 DMA_CH2 dma_enable(DMA1, DMA_CH2); timer_resume(dev2); // PB1 TIM3_CH4 DMA CH3 dma_enable(DMA1, DMA_CH3); timer_resume(dev3); } void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = val1[i]; val3[i] = 50 + amp * sin(stp * i); } } void setup() { pinMode(out1, PWM); pinMode(out2, PWM); pinMode(out3, PWM); timer_conf(); dma_conf(); dma_start(); init_wave(); } void loop() { }

Тед
Пт, 6 июля 2018 г., 23:44
Спасибо, Рик, ты лучший.
Существует небольшая проблема с фазовой коррекцией, по сравнению с PB7, PB1 смещается примерно на 10 градусов. и PA8 60 град, я думаю, что смогу справиться с этим.
еще раз спасибо.

Я сделал это - без изменений.
{ val1[i] = 50 + amp * sin(stp * i); //val2[i] = val1[i]; val2[i] = 50 + amp * sin(stp * i); val3[i] = 50 + amp * sin(stp * i); }

Тед
Сб -7 июля 2018 г. 12:29
Решено мистером. Рик

Col68
Sun 8 июля 2018 г., 16:14
[Тед - SAT 7 июля 2018 г. 12:29 AM] - Решен г -ном. Рик

Поздравляю и удачи :)

Когда я увидел, как Рик помогает тебе, я подумал: «Он преуспеет», потому что Рик слишком сильный.

Уважение к ☆ rick ☆

Adapter Retro Game Controller STM32

5x5x5 Rubik's Cube Rosling Robot