Тед
Вт, 3 июля 2018 г., 12:10
Привет
Чтобы узнать таймеры, которые я пытаюсь добавить в 2 -канальный генератор, третий, но у меня ничего нет на PIN PB1.
Что я делаю не так ?
Чтобы узнать таймеры, которые я пытаюсь добавить в 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? Скриншот?
Какой метод загрузки?
Какое ядро?
Который ide? Скриншот?
Какой метод загрузки?
Тед
Вт. 3 июля 2018 г. 9:29 утра
Arm Cortex M3 STM32F103, синяя таблетка.
Стивестронг
Вт, 3 июля 2018 г., 9:45 утра
Вы устанавливаете неправильный базовый адрес для DMA и DMA REQ SRC также неверны для PB1.
PB1 IS T3C4, DMA_C3. Проверьте код.
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
Я сделал эти изменения, но должен быть что -то еще, нет сигнала на 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 идентичны
весело и весело 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 соответственно.
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.
Для картирования канала 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 бит?
Кроме того, почему вы используете 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
PB7 с использованием TIM4_CH2 .. И это использует dma1_channel4
- dma1_chan_map.PNG (62.56 киб) просмотрено 316 раз
Тед
Ср. 04 июля 2018 г. 16:49
Спасибо
Но таймер 4 уже используется первым выходом - Val #1, я хочу добавить независимый третий таймер.
Но таймер 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.
Что я не так ?
Таймер генератора квадратных волн № 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:
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 -канальный генератор имеет некоторый фазовый сдвиг, когда оба установлены для синуса, как это устранить ? - Фазовая коррекция ?
СПАСИБО !!!
Наконец я могу собрать вещи вместе.
Вопрос.
Оригинальный 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
Ваш модифицированный, ОК
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
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 град, я думаю, что смогу справиться с этим.
еще раз спасибо.
Я сделал это - без изменений.
Существует небольшая проблема с фазовой коррекцией, по сравнению с 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 ☆