For my application I have a DAC communicating with an STM32F4 through I2S. On the microcontroller's side, informations are send to the DAC through a DMA stream, with a circular buffer. On an external interrupt, I would like to pause the DMA, change some sound parameters and then resume the DMA stream.
My interrupt routine is basically like that :
void HAL_GPIO_EXTI_Callback(uint16_t pin)
{
if(pin == GPIO_PIN_13)
{
HAL_I2S_DMAPause(&hi2s2);
changeSound(&sound);
HAL_I2S_DMAResume(&hi2s2);
}
}
And I have 2 interrupt routines triggered on DMA TxHalf/TxCplt that fill each half of my DMA buffer with the sound. (EDIT : during my research I also learned that there is a "double buffer mode" that allows to do that with some advantages, but that's off topic.)
What I want to avoid is to transfer some remaining samples of the old sound after my Exti interrupt. So my idea was to fill the whole buffer after changing the sound, and then reset the memory pointer of the DMA stream to the beginning of my buffer.
It would look something like that :
void HAL_GPIO_EXTI_Callback(uint16_t pin)
{
if(pin == GPIO_PIN_13)
{
HAL_I2S_DMAPause(&hi2s2);
changeSound(&sound);
fillBuffer( address_of_1st_half, &sound);
fillBuffer( address_of_2nd_half, &sound);
*reset_DMA(&hi2s2)*; <==== this is the function I'm looking for
HAL_I2S_DMAResume(&hi2s2);
}
}
nb : as you can see I'm using CubeMX's HAL drivers
I have looked into the HAL datasheet for such a function but I haven't found any.
The only thing that is close to that is using DMAStop() and then Transmit_DMA() again. But I'm afraid that would take too much time...
If anybody has an idea I'd be glad to hear it!
Thanks