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

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,否则可能会出问题,包括程序卡死都是可能的。


使用I2S DMA功能时程序出现卡死?

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版