2399782_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2399782_ja-JP

2399782_ja-JP

mcxn947 dma传输开启後没进入回调
#include "fsl_debug_console.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "app.h"

#include "fsl_flexio_spi_edma.h"
#include "board.h"
//#include "app.h"
#include "fsl_debug_console.h"

void BOARD_InitHardware ( void );
#include "fsl_debug_console.h"
#include "fsl_flexio.h"
#include "fsl_edma.h"
#include "fsl_inputmux.h"
#include "fsl_common.h"

/* ハードウェア常数定义 */
#define DEMO_FLEXIO_BASE FLEXIO0
#define DEMO_DMA_BASE DMA0
#define DEMO_DMA_CH      0 /* DMA チャネル 61 を使用 */

#define CHANNEL_COUNT    20 /* 20路并行引 */
#define BIT_DEPTH        24 /* 24位深度 */
#define SHIFTERS_USED    8 /* 次回 DMA 充填 8 个 シフター */

/* データ缓冲区:DMA パフォーマンスを強化する必要があります */
SDK_ALIGN ( uint32_t g_dac_buffer [ BIT_DEPTH ], 32 );

edma_handle_t g_edma_handle ;
volatile bool g_transfer_done = false ;

/* DMA 完了回调 */
void EDMA_Callback ( edma_handle_t * handle , void * param , bool transferDone , uint32_t tcds )
{
   if ( transferDone )
    {
       /* FlexIO の最後の一組のデータを確保します */
       while ( ! ( FLEXIO_GetShifterStatusFlags ( DEMO_FLEXIO_BASE ) & 0x01U ));

       /* 立即关闭 DMA 请要求、生成仮想假触発を防止 */
       FLEXIO_EnableShifterStatusDMA ( DEMO_FLEXIO_BASE , 1 << 0 , false );
       g_transfer_done = true ;
   }
}

void Init_FlexIO_DAC ( void )
{
   flexio_config_t fxioConfig ;
   flexio_shifter_config_t shConfig = { 0 };
   flexio_timer_config_t timConfig = { 0 };

   FLEXIO_GetDefaultConfig ( & fxioConfig );
   FLEXIO_Init ( DEMO_FLEXIO_BASE & fxioConfig );
   FLEXIO_Reset ( DEMO_FLEXIO_BASE );

   /* 配置 8 个 Shifter 并行出力 */
   for ( uint8_t i = 0 ; i < SHIFTERS_USED ; i ++ )
    {
       shConfig.timerSelect   = 0 ;
       shConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive ;
       shConfig . pinConfig     = kFLEXIO_PinConfigOutput ;
       shConfig.pinSelect     = 0 ; /* 引脚から D0 開始 */
       shConfig . pinPolarity   = kFLEXIO_PinActiveHigh ;
       shConfig.shifterMode   = kFLEXIO_ShifterModeTransmit ;
       shConfig.inputSource   = kFLEXIO_ShifterInputFromPin ;
       shConfig . shifterStop   = kFLEXIO_ShifterStopBitDisable ;
       shConfig . shifterStart  = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable ;
       shConfig 平行幅= CHANNEL_COUNT - 1U ; /* 20路并行宽度 */

       FLEXIO_SetShifterConfig ( DEMO_FLEXIO_BASE , i , & shConfig );
   }

   /* タイマー 0 を SCLK 時間源として設定 */
   timConfig.triggerSelect   = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT ( 0 );
   timConfig.triggerPolarity= kFLEXIO_TimerTriggerPolarityActiveLow ;
   timConfig.triggerSource   = kFLEXIO_TimerTriggerSourceInternal ;
   timConfig . pinConfig       = kFLEXIO_PinConfigOutput ;
   timConfig.pinSelect       = 20 ; /* 時刻信号出力 D20 */
   timConfig.timerMode       = kFLEXIO_TimerModeDual8BitBaudBit ;
   timConfig.timerDisable    = kFLEXIO_TimerDisableOnTimerCompare ;
   timConfig.timerEnable     = kFLEXIO_TimerEnableOnTriggerHigh ;
   /* 8 位 = 16 边沿線 (15)、周波数分周波数 = 10 */
   timConfig.timerCompare    = ( 15U << 8U ) | 10U ;

   FLEXIO_SetTimerConfig ( DEMO_FLEXIO_BASE , 0 , & timConfig );
}

void Init_DMA_DAC ( void )
{
   edma_config_t edmaConfig ;

   /* 修正後の MCXN947 InputMux 接続 */
   /* 結果 kINPUTMUX_Flexio0Shift0ToDma0Ch61Ena 依然报错,
      kINPUTMUX_Flexio0Request0ToDma0Ch61Ena */
   INPUTMUX_Init (INPUTMUX0);
   //INPUTMUX_EnableSignal(INPUTMUX0, kINPUTMUX_Flexio0Shift0ToDma0Ch61Ena, true);
   INPUTMUX_EnableSignal (INPUTMUX0, kINPUTMUX_FlexIO0ShiftRegister0RequestToDma0Ch61Ena , true );

   EDMA_GetDefaultConfig ( & edmaConfig );
   EDMA_Init ( DEMO_DMA_BASE , & edmaConfig );
   EDMA_CreateHandle ( & g_edma_handle , DEMO_DMA_BASE , DEMO_DMA_CH );
   EDMA_SetCallback ( & g_edma_handle , EDMA_Callback , NULL );
}

void DAC_Transmit ( void )
{
   edma_transfer_config_t xferConfig ;
   edma_minor_offset_config_t offsetConfig ;

   g_transfer_done = false ;

   /*
      パラメータ修正説明:
1.bytesEachRequest = 32 (每次触発行搬运 8 个 Shifter、每个 4 字节)
2.transferBytes = 96 (总共 24 位データ、每位 4 字节、24 * 4 = 96)
      このように 96 % 32 == 0、承認すれば通過できます。
   */
   EDMA_PrepareTransferConfig ( & xferConfig
( void * )g_dac_buffer, /* srcAddr */
                              4 , /* srcWidth: 4文字节 */
                              4 /* srcOffset: 4 */
( void * ) & ( DEMO_FLEXIO_BASE -> SHIFTBUF [ 0 ]), /* destAddr */
                              4 , /* destWidth: 4文字节 */
                              4 /* destOffset: 4 */
                              32 /* bytesEachRequest: 32 */
                              96 /* transferBytes: 96 (!!修正点) */
                              );

   /* 提交配置 */
   EDMA_SubmitTransfer ( & g_edma_handle , & xferConfig );

   /* 配置地址回帰:マイナーループ終了後、目的地址减去 32 字节回帰 SHIFTBUF[0] */
   offsetConfig.enableSrcMinorOffset  = false ;
   offsetConfig.enableDestMinorOffset = true ;
   offsetConfig.minorOffset           = -32 ;

   EDMA_SetMinorOffsetConfig ( DEMO_DMA_BASE , DEMO_DMA_CH , & offsetConfig );

   /* DMA と FlexIO の要求 */
   EDMA_StartTransfer ( & g_edma_handle );
   FLEXIO_EnableShifterStatusDMA ( DEMO_FLEXIO_BASE , 1 << 0 , true );
}

int main ( void )
{
   /* 基础ハードウェア初期化 (時間钟/引脚) */
   BOARD_InitHardware ();

   Init_FlexIO_DAC ();
   Init_DMA_DAC ();

   /* 例データ充填 */
   for ( int i = 0 ; i < BIT_DEPTH ; i ++ ) g_dac_buffer [ i ] = 0xAAAAA ;

   
    {
       DAC_Transmit ();

       /* 等待ち回调执行 */
       while ( ! g_transfer_done );

       /* 間隔 */
       SDK_DelayAtLeastUs ( 1000 、 SystemCoreClock);
   }
}
 
 
程序卡死在 while(!g_transfer_done); 問題はここにあります
通信・制御(I3C |I2C |SPI |FlexCAN |イーサネット |FlexIO)Re: mcxn947 dma传输开启后没有进入回调

コールバックは実行されませんでした。

ここではどのチャネルをDMAに使用すべきでしょうか?チャネル61ではアサーションが満たされません。チャネル61は16を超えることはできません。

DMAチャネルが0に設定されている場合、DMAコールバックは一切実行されません。

Re: mcxn947 dma传输开启后没有进入回调

こんにちは、 @justdomyself

1) デバッグ用のブレークポイントを設定し、eDMA割り込み関数とコールバック関数が実行されているかどうかを確認します。

2) 使用されているeDMAチャネルを確認してください。

#定義する DEMO_DMA_CH      / * DMAチャネル61を使用 */ ここではチャネル0が使用されているようです。

INPUTMUX_EnableSignal(INPUTMUX0, kINPUTMUX_FlexIO0ShiftRegister0RequestToDma0Ch61Ena, true); ただし、コメントとこのコード行から判断すると、チャネル61を使用しているようです。


BR

アリス


タグ(1)
評価なし
バージョン履歴
最終更新日:
2 週間前
更新者: