Loading...
 

SW4STM32 and SW4Linux fully supports the STM32MP1 asymmetric multicore Cortex/A7+M4 MPUs

   With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world. And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
You can get more information from the ac6-tools website and download (registration required) various documents highlighting:

System Workbench for STM32


function to reset the I2S DMA address pointer

Hello everyone.

For my application I have a DAC communicating with an STM32F4 through I2S. On the microcontroller’s side, informations are sent 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.

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( &buffer, &sound);
*reset_DMA(&hi2s2)*;

Hello everyone.

For my application I have a DAC communicating with an STM32F4 through I2S. On the microcontroller’s side, informations are sent 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.

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( &buffer, &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