硬汉嵌入式论坛

 找回密码
 立即注册
查看: 136|回复: 2
收起左侧

[SAI/I2S] I2S 缓存地址不一样,播放效果有差异

[复制链接]

16

主题

58

回帖

106

积分

初级会员

积分
106
发表于 6 天前 | 显示全部楼层 |阅读模式
定义两个缓存数组,分别指定地址在SRAM1(0x30000000)和SRAM4(0x38000000)

[C] 纯文本查看 复制代码
u32 audio_i2sbuf1[WAV_I2S_TX_DMA_BUFSIZE] __attribute__((at(0x30000000+I2SBUF1ADDR)));
u32 audio_i2sbuf2[WAV_I2S_TX_DMA_BUFSIZE] __attribute__((at(0x30000000+I2SBUF2ADDR)));

[C] 纯文本查看 复制代码
u32 audio_i2sbuf1[WAV_I2S_TX_DMA_BUFSIZE] __attribute__((at(0x38000000+I2SBUF1ADDR)));
u32 audio_i2sbuf2[WAV_I2S_TX_DMA_BUFSIZE] __attribute__((at(0x38000000+I2SBUF2ADDR)));


MPU配置如下
[C] 纯文本查看 复制代码
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();

	MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
	MPU_InitStruct.BaseAddress      = 0x24000000;
	MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
	MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
	MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
	MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
	MPU_InitStruct.SubRegionDisable = 0x00;
	MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

	HAL_MPU_ConfigRegion(&MPU_InitStruct); 

	MPU_InitStruct.Enable 		 = MPU_REGION_ENABLE; 
	MPU_InitStruct.BaseAddress	 = 0x30000000; 
	MPU_InitStruct.Size			 = ARM_MPU_REGION_SIZE_128KB; 
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; 
	MPU_InitStruct.IsBufferable	 = MPU_ACCESS_NOT_BUFFERABLE; 
	MPU_InitStruct.IsCacheable	 = MPU_ACCESS_CACHEABLE; 
	MPU_InitStruct.IsShareable	 = MPU_ACCESS_NOT_SHAREABLE; 
	MPU_InitStruct.Number 		 = MPU_REGION_NUMBER1; 
	MPU_InitStruct.TypeExtField	 = MPU_TEX_LEVEL0; 
	MPU_InitStruct.SubRegionDisable = 0x00; 
	MPU_InitStruct.DisableExec	 = MPU_INSTRUCTION_ACCESS_ENABLE; 

	HAL_MPU_ConfigRegion(&MPU_InitStruct); 

    MPU_InitStruct.Enable          = MPU_REGION_ENABLE; 
    MPU_InitStruct.BaseAddress     = 0x30020000; 
    MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB; 
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; 
    MPU_InitStruct.IsBufferable    = MPU_ACCESS_NOT_BUFFERABLE; 
    MPU_InitStruct.IsCacheable     = MPU_ACCESS_CACHEABLE; 
    MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE; 
    MPU_InitStruct.Number          = MPU_REGION_NUMBER3; 
    MPU_InitStruct.TypeExtField    = MPU_TEX_LEVEL0; 
    MPU_InitStruct.SubRegionDisable = 0x00; 
    MPU_InitStruct.DisableExec     = MPU_INSTRUCTION_ACCESS_ENABLE; 

    HAL_MPU_ConfigRegion(&MPU_InitStruct); 	
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x30040000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x30044000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

	MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
	MPU_InitStruct.BaseAddress      = 0x38000000;
	MPU_InitStruct.Size             = MPU_REGION_SIZE_64KB;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
	MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
	MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
	MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
	MPU_InitStruct.SubRegionDisable = 0x00;
	MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

	HAL_MPU_ConfigRegion(&MPU_InitStruct);  
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}


其他I2S配置及应用程序完全一样,实测输出波形有差异,正常应该持续输出1kHz正弦波,但指定在SRAM1时有畸变,为什么缓存地址不一样有这种差异

微信图片_20250604164924.jpg

SRAM4

SRAM4
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 5 天前 | 显示全部楼层
你的程序里面两个地址的此参数配置是不同的

分别被配置为MPU_TEX_LEVEL0和MPU_TEX_LEVEL1了
回复

使用道具 举报

16

主题

58

回帖

106

积分

初级会员

积分
106
 楼主| 发表于 5 天前 | 显示全部楼层
eric2013 发表于 2025-6-5 08:12
你的程序里面两个地址的此参数配置是不同的

分别被配置为MPU_TEX_LEVEL0和MPU_TEX_LEVEL1了

还真没注意这个点,解决了,感谢大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 02:53 , Processed in 0.273750 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表