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 :)