Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

4 votos

La adición de tercer canal para el PIC32 starter kit `DMA encadenamiento de PWM y de ejemplo

Acabo de recibir mi PIC32 starter kit, y jugó con los demos. Nunca he utilizado ninguno de alta gama uCs de la 8 bits de Fotos.

Una de las cosas nuevas para mí en el PIC32 es la DMA. El starter kit vino con el demo que utiliza encadenado transferencias de DMA para el control de los pwms y dim dos de los leds.

Traté de experimentar agregando el tercer lugar a la cadena, pero no funcionó. Yo creo que es porque no sé cómo la cadena de los tres canales DMA.

Básicamente estoy tratando de conseguir una cadena: DMACh0 -> DMACh1 -> DMAch2 -> DMACh0 -> ...

Aquí está una de las versiones modificadas (Algunos de stock comentarios de configuración y cortar para obtener más pequeño):

const unsigned short pwm_duty_cycles[] = {...};
#define ARRAY_SIZE                      (sizeof(pwm_duty_cycles))
#define DMA0                            (0)
#define DMA1                            (1)
#define DMA2                            (2) // Added this line

unsigned char srcSize = ARRAY_SIZE;
unsigned char cellSize = 2;     
unsigned int dstSize = 2;

unsigned short* volatile pDma_0_Dst = (void*) &OC1RS;
unsigned short* volatile pDma_1_Dst = (void*) &OC2RS;  
unsigned short* volatile pDma_2_Dst = (void*) &OC3RS;     // Also added this
const unsigned short* pDmaSrc = pwm_duty_cycles;        

#define SYS_FREQ            (80000000)
#define PWM_PERIOD          (25000)

//  pwm_dma application code
int main(void)
{
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

    DmaChnOpen(DMA0, 0, DMA_OPEN_CHAIN_LOW);
    DmaChnOpen(DMA1, 0, DMA_OPEN_CHAIN_HI);
    DmaChnOpen(DMA2, 0, DMA_OPEN_CHAIN_HI);   // Added this line, I'm not sure how to set up the
                                              // chaining. What should be LOW and what should be HIGH


    DmaChnSetEventControl(DMA0, DMA_EV_START_IRQ(_TIMER_4_IRQ));
    DmaChnSetEventControl(DMA1, DMA_EV_START_IRQ(_TIMER_4_IRQ));
    DmaChnSetEventControl(DMA1, DMA_EV_START_IRQ(_TIMER_4_IRQ));   // Added

    DmaChnSetTxfer(DMA0, pDmaSrc, pDma_0_Dst, srcSize, dstSize, cellSize);
    DmaChnSetTxfer(DMA1, pDmaSrc, pDma_1_Dst, srcSize, dstSize, cellSize);
    DmaChnSetTxfer(DMA2, pDmaSrc, pDma_2_Dst, srcSize, dstSize, cellSize); // Added

    OpenOC1(OC_ON | OC_TIMER_MODE16 | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0,0);
    OpenOC2(OC_ON | OC_TIMER_MODE16 | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0,0);
    OpenOC3(OC_ON | OC_TIMER_MODE16 | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0,0); // Added
    OpenTimer3(T3_ON | T3_PS_1_64, PWM_PERIOD);
    OpenTimer4(T4_ON | T4_PS_1_256, 100000);

    DmaChnEnable(DMA0);

    while(1);
}

Creo que el problema es con la configuración de DMA_OPEN_CHAIN_LOWs y DMA_OPEN_CHAIN_HIs. Supongo que estos de alta y BAJA significa que el canal de prioridades. Estos sólo me permiten especificar el siguiente canal, ya sea con mayor o menor prioridad. ¿Cómo puedo hacer es saltar por encima de un canal (ch2 -> ch0)?

Yo estoy usando el Mplab C32 v2.02. Esto trae recuerdos, tratando de modificar los ejemplos para obtener uno más de parpadeo del led :)

1voto

Patrick Ritchie Puntos 1292

La razón se explica en el PIC32MX controlador de DMA manual de referencia (página 31-35):

Un canal (canal esclavo) puede ser encadenado a un canal adyacente (canal principal).

Esto significa que usted no puede de la cadena de 3 canales DMA juntos.

Pero para responder a su pregunta acerca de cómo este encadenamiento de las obras, mire la página 31-16 en el manual:

CHCHNS: la Cadena de de Selección de Canal bit(5)

1 = Cadena de canal inferior en natural prioridad (CH1 será habilitado por CH2 transferencia completa)

0 = Cadena canal más natural prioridad (CH1 será habilitado por CH0 transferencia completa)

El canal 0 tiene la más alta prioridad, y el canal 3 en la menor (la Pic32MX360F512L tiene 4 canales). Por lo que al establecer el primer canal de DMA a la cadena de orden inferior significa que se activa por el canal 1 (en tu ejemplo).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X