ST意法半导体
直播中

王鹏

7年用户 1339经验值
私信 关注
[问答]

STM32H7 SAI不能使用fifo请求中断怎么解决?

代码是:
hsai_BlockB2.InterruptServiceRoutine = fifoReqCallback;

void fifoReqCallback(SAI_HandleTypeDef *hsai)
{
        如果(hsai->Instance = SAI2_Block_B)
        {
HAL_GPIO_TogglePin(test_GPIO_Port, test_Pin);
        }


HAL_SAI_Receive_DMA(&hsai_BlockB2, (uint8_t*)&noisebuf[0], BLOCK_SIZE*3);
__HAL_SAI_ENABLE_IT(&hsai_BlockB2,SAI_IT_FREQ);
HAL_延迟(5);

结果是:很多fifo请求中断,阻止循环执行。

我还知道数据表警告:“设置此位时,如果设置了 SAI_xSR 寄存器中的 FREQ 位,则会生成中断。由于音频模块默认在复位后作为发送器运行,因此必须在设置 FREQIE 之前配置 MODE 位以避免接收器模式下的寄生中断”。我认为这很遗憾地意味着在应收账款中你不能从 Tx 模式下的 fifo 请求中断中受益。


回帖(1)

杨帆

2022-12-27 09:42:35
因为要删除中断源,我们需要通过读取或写入 SAI 的 DR 来调查它。
工作代码:
hsai_BlockB2.InterruptServiceRoutine = fifoReqCallback;
__HAL_SAI_ENABLE_IT(&hsai_BlockB2,SAI_IT_FREQ);

__HAL_SAI_ENABLE(&hsai_BlockB2);
而 (1)
{


// while(hsai_BlockB2.State != HAL_SAI_STATE_READY);
// HAL_SAI_Receive(&hsai_BlockB2, (uint8_t*)&noisebuf[0], BLOCK_SIZE*3,10);
如果(赛数==10)
{
        __HAL_SAI_DISABLE(&hsai_BlockB2);
        HAL_延迟(1);
        __HAL_SAI_ENABLE(&hsai_BlockB2);
        赛数=0;
}

}
}

void fifoReqCallback(SAI_HandleTypeDef *hsai)
{
        如果(hsai->Instance = SAI2_Block_B)
        {
                HAL_SAI_Receive(&hsai_BlockB2, (uint8_t*)&adcbuf[0], 1,10);
                赛数++;
                HAL_GPIO_TogglePin(test_GPIO_Port, test_Pin);
        }

}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分