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?
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
}
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.
Greg de Eon
Sławomir Kozok
Greg de Eon