你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F405rgt6 I2S DMA输入会造成卡死,这个芯片有BUG

[复制链接]
贱独呱 提问时间:2026-2-5 17:26 / 未解决

当我定义了一个长度为32的数组,然后告诉DMA数组长度,如果为32,将彻底卡死,状态灯不再闪烁,HAL_I2S_RxCpltCallback也不会进入,当我设置为24,状态灯闪烁,但是HAL_I2S_RxCpltCallback依然不会进入,当我设置为19或者更低,一切就正常了(读取start_tick也有问题,比如数值从16,35,45然后突然65530,25这个样子,貌似是使用I2S之后出现的问题)Snipaste_2026-02-06_11-02-35.png

Snipaste_2026-02-06_11-02-26.png


以下代码在H743&F429都有测试过,H7没问题,F4有一点问题,但是没有总结

void main_app_init()
{
    my_uart_init();
    inmp441_init();

    start_tick = HAL_GetTick();
}

uint8_t main_app_loop()
{
//  uint8_t bufp[] = {1,2,3,4,5,6,7,8};
    uint8_t str_buff[1024];                 //接收缓存

    if(usart_check_data_update())           //获取数据更新
    {
        memset(str_buff,0,sizeof str_buff);
        usart_read_data(str_buff);
        printf("->%s\n",str_buff);
    }

//  if((HAL_GetTick() - start_tick) >= 100)
//  {

        HAL_GPIO_TogglePin(LED_RUN_GPIO_Port, LED_RUN_Pin);
//      HAL_Delay(100);
        start_tick = HAL_GetTick();
    }
    return 0;
}
#include "inmp441.h"
#include "my_usart.h"


extern I2S_HandleTypeDef hi2s2;

uint16_t i2s_dma_buf[32];
uint32_t audio_value;
int val32;

unsigned int cb_cnt=0;

void inmp441_init(void)
{
    HAL_I2S_Receive_DMA(&hi2s2,(uint16_t *)i2s_dma_buf,20);
}

//I2S鎺ユ敹瀹屾垚鍥炶皟鍑芥暟
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{

    if(hi2s==&hi2s2){
        printf("A\n");
    }
}
Snipaste_2026-02-05_17-17-49.png
Snipaste_2026-02-05_17-18-01.png
Snipaste_2026-02-06_11-02-35.png
收藏 评论7 发布时间:2026-2-5 17:26

举报

7个回答
贱独呱 回答时间:2026-2-10 09:19:58

xmshao 发表于 2026-2-9 10:54
谢谢补充信息。</p>
<p>你现在定义了一个用于I2S的接收缓冲数组,数组的数据类型为16bit,长度为32.

[md]感谢您的耐心解答,我反应过来了

xmshao 回答时间:2026-2-6 11:21:06

你注意下,调用

HAL_I2S_Receive_DMA(I2S_HandleTypeDef hi2s, uint16_t pData, uint16_t Size);

这里Size对应数据个数,比方传输10个数据,不管数据配置的是16位,或者24位 甚至32位,

这里都是直接写10。

贱独呱 回答时间:2026-2-6 11:29:25

xmshao 发表于 2026-2-6 11:21
你注意下,调用</p>
<p>HAL_I2S_Receive_DMA(<strong>I2S</strong>_HandleTypeDef <em>hi2s, uint16_t </em>pData, uint16_t Size) ...

[md]这个我明白,我也并没有超出自己定义的数组大小,很奇怪的是,相同的程序,H743是没有问题的。我的I2S问题点很多,最显著的就是如果完全将DMA给定我的数组长度,LED状态灯也不闪烁了,回调函数也不进入了,如果我尝试减小,状态灯开始闪烁(主函数运行),再减小,我的回调函数也能进入了,但是if(hi2s == &hi2s2)还是不成立的,当我继续减小才能正常

xmshao 回答时间:2026-2-6 11:38:17

贱独呱 发表于 2026-2-6 11:29
这个我明白,我也并没有超出自己定义的数组大小,很奇怪的是,相同的程序,H743是没有问题的。我的I2 ...

[md]没有很明白 你说的 “完全将DMA给定我的数组长度” 。

注意DMA传输长度不能超过65535,具体这里的I2S传输,若数据宽度是24或32位的话,那个size就不要超过32768了。

另外,你注意下堆栈方面的问题,可以尝试调整下。

贱独呱 回答时间:2026-2-6 14:01:50

xmshao 发表于 2026-2-6 11:38
没有很明白 你说的 “完全将DMA给定我的数组长度” 。</p>
<p>注意DMA传输长度不能超过65535,具体这里的I2 ...

[md]那我简短说明,我定义了一个为uint16_t的数组,长度为32,给到HAL_I2S_Receive_DMA(&hi2s2,(uint16_t *)i2s_dma_buf,32);就会卡死(H743不存在这种问题),不存在你说的超出65535问题

贱独呱 回答时间:2026-2-6 14:19:28

xmshao 发表于 2026-2-6 11:38
没有很明白 你说的 “完全将DMA给定我的数组长度” 。</p>
<p>注意DMA传输长度不能超过65535,具体这里的I2 ...

[md]那我简短说明,我定义了一个为uint16_t的数组,长度为32,给到HAL_I2S_Receive_DMA(&hi2s2,(uint16_t *)i2s_dma_buf,32);就会卡死(H743不存在这种问题),不存在你说的超出65535问题

xmshao 回答时间:2026-2-9 10:54:30
贱独呱 发表于 2026-2-6 14:19
那我简短说明,我定义了一个为uint16_t的数组,长度为32,给到HAL_I2S_Receive_DMA(&hi2s2,(uint16_t ...


[md]谢谢补充信息。

你现在定义了一个用于I2S的接收缓冲数组,数组的数据类型为16bit,长度为32.

你现在的I2S配置为24bit帧格式,那么你的调用`HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)`函数时,此时的Size 不能大于16,否则可能会出问题,包括程序卡死都是可能的。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版