Loading...
 

Zephyr project on STM32

   Zephyr Workbench, a VSCode extension to manage Zephyr on STM32.
It enables users to easily create, develop, and debug Zephyr applications.
Main features:
  • Install host dependencies.
  • Import toolchain and SDK.
  • Create, configure, build and manage apps.
  • Debug STM32.
You can directly download it from the VSCode marketplace
For more details, visit the Zephyr Workbench

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


 

Newest Forum Posts

  1. reservation car service Seattle by Jamesprede, 2025-05-01 10:06
  2. Last day: drone bonus by Danielrug, 2025-04-19 16:55
  3. SPI on Nucleo_STMH533RE by higginsa1, 2025-03-25 07:37
  4. SPI on Nucleo_STMH533RE by royjamil, 2025-03-23 11:31
  5. SPI on Nucleo_STMH533RE by higginsa1, 2025-03-23 09:33
  6. Configuring DMA for ADC in SW? by sam.hodgson, 2025-03-04 12:58
  7. Insightful Perspectives on This Subject by davidsycle, 2025-03-04 05:45
  8. Build a project in "release" mode by info@creosrl.it, 2025-02-20 18:12
  9. Build a project in "release" mode by info@creosrl.it, 2025-02-20 17:05
  10. Build a project in "release" mode by tang, 2025-02-20 10:36

Last-Modified Blogs