为了在NXP S32K142/144中使用FlexIO实现I2S连续音频传输,避免时钟重新初始化,请按以下步骤优化配置:
// 配置DMA传输描述符为循环模式
DmaChannel_SetLoopMode(DMA_CH0, true);
DmaChannel_SetTransferSize(DMA_CH0, BUFFER_SIZE); // BUFFER_SIZE为音频缓冲区大小 // 在DMA完成中断中切换缓冲区
void DMA_IRQHandler() {
if (currentBuffer == BufferA) {
DmaChannel_ConfigDestination(DMA_CH0, BufferB);
currentBuffer = BufferB;
} else {
DmaChannel_ConfigDestination(DMA_CH0, BufferA);
currentBuffer = BufferA;
}
// 处理数据填充(如从音频流读取到非活动缓冲区)
} // 初始化FlexIO定时器为连续运行
FLEXIO_TIMER_CFG_Type timerConfig;
timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(0);
timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh;
timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal;
timerConfig.mode = kFLEXIO_TimerModeDual8BitBaudBit; // I2S常用模式
timerConfig.output = kFLEXIO_TimerOutputOneNotAffectedByReset;
timerConfig.decrementerResetCondition = kFLEXIO_TimerDecReloadOnTimerDisable;
timerConfig.decrementerSource = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput;
timerConfig.reset = kFLEXIO_TimerResetNever;
timerConfig.disable = kFLEXIO_TimerDisableNever; // 关键:定时器永不停止
FLEXIO_TIMER_Init(FLEXIO0, &timerConfig, TIMER_CHANNEL); // 确保FlexIO时钟源配置正确且未被更改
CLOCK_SetFlexio0Clock(FLEXIO0_CLK_SOURCE); // 例如,使用PLL分频后的时钟 NVIC_SetPriority(DMA_CH0_IRQn, 1); // 设置DMA中断为较高优先级通过以上调整,FlexIO和DMA将协同工作,实现无中断的I2S音频流传输,避免时钟重新初始化导致的延迟问题。
举报
更多回帖