STM32F4 - contando envolturas DMA

Estoy usando DMA en una placa Discovery STM32F4 para enviar valores de una matriz a un periférico. Esto debe hacerse repetidamente, por lo que estoy usando el modo DMA circular: DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; que obtiene la dirección de origen de DMA para volver al inicio de la matriz automáticamente.

Me gustaría contar cuántas veces ha sucedido esta envoltura. ¿Hay una interrupción u otra característica incorporada para hacer esto?

Respuestas (2)

STM32 DMA tiene algunas interrupciones. Puede intentar usar el indicador DMA_IT_TC . No lo he probado con el modo de matriz a periferia, pero funcionó con periferia a matriz (ejemplo de mi código):

DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);

También debería tener que configurar la interrupción NVIC (ejemplo):

ADCNVICConfig.NVIC_IRQChannel = DMA2_Stream0_IRQn;
ADCNVICConfig.NVIC_IRQChannelPreemptionPriority = 0;
ADCNVICConfig.NVIC_IRQChannelSubPriority = 1;
ADCNVICConfig.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&ADCNVICConfig);

La bandera TC significa "transferencia completada".

Ejemplo de interrupción:

void DMA2_Stream0_IRQHandler(void)
{

    //Something

    if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0) != RESET)
    {
        DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
        //Something
    }

    //Something

}
Oh, eso es genial: la "transferencia completa" todavía funciona, aunque la transferencia continúa.
Funciona cada transferencia completada. Pero es importante borrar la bandera de interrupción, como en cualquier otra interrupción. Ver publicación editada.
Como es habitual en las interrupciones STM32. Aseado - ¡muy bueno saberlo!

si no desea enviar la misma matriz cada vez. Debe esperar ambas devoluciones de llamada, TxHalfCpltCallback y TxCpltCallback. Cuando se transmite la primera mitad, se llama a TxHalfCpltCallback, debe escribir esta mitad del búfer con datos nuevos, luego, cuando se llama a TxCpltCallback, escribir la segunda mitad del búfer y seguir haciéndolo hasta que sea necesario.