2020年5月18日月曜日

PIC32MX DMA転送サンプル "文字列" ⇒UART2 TX へDMA転送

DMA転送のサンプルです。
文字列 "Hello World!" を UART2 TX レジスタへ1バイトずつDMA転送します。
転送のトリガーは TMR5 の割り込み発生です。
また、メッセージデータを半分まで転送したら LED2をONにし、全メッセージを転送終えたら、LED2をOFFします。 これはDMAチャンネル1の割り込みで処理します。
全てのメッセージを転送(ブロック転送)終えたら、再度転送を再開します。


const BYTE bMsg_DMA[] = {
    "Hello World!\r\n" 
};


void vDMA_Test_SettingAndStart (

)
{
    //DMA Channel 1 settings
    DCH1CON = 0x0000; // DMA Channel 1 disabled
    DMA_SourceAddressSet(DMA_CHANNEL_1, (uint32_t)&bMsg_DMA);
    DMA_SourceSizeSet(DMA_CHANNEL_1, sizeof(bMsg_DMA));
    DMA_DestinationAddressSet(DMA_CHANNEL_1,(uint32_t)&U2TXREG );
    DMA_DestinationSizeSet(DMA_CHANNEL_1,1 );
    DCH1ECON = (_TIMER_5_IRQ << _DCH1ECON_CHSIRQ_POSITION ) | ( 1 << _DCH1ECON_SIRQEN_POSITION); // Trigger on TMR5 interrupt
   
    // CHSDIF All source data transfer  finished.
    // CHSHIF 1/2 of source data transfer finished.
    DCH1INT =  ( 1 << _DCH1INT_CHSDIE_POSITION) | ( 1 << _DCH1INT_CHSHIE_POSITION);  // DMA interrupt setting
   
    // CHEN:1=Enable channel
    // CHAEN:1=Keep channel auto enable after block transfer completes
    DCH1CON =  ( 1 << _DCH1CON_CHEN_POSITION) | ( 1 << _DCH1CON_CHAEN_POSITION);  // DMA START with Repeat
}


void vDMA_Test_InterruptCheck (

)
{
    if (DCH1INTbits.CHSDIF == 1)    // All source data transfer  finished.
    {
        LED2_SetLow();
        DCH1INTbits.CHSDIF = 0;
    }
    if (DCH1INTbits.CHSHIF == 1)     // 1/2 of source data transfer finished.
    {
        LED2_SetHigh();
        DCH1INTbits.CHSHIF = 0;
    }
   
}


 MCC settings  

DMA Channel 1 setting

TMR5 setting

Interrupt Setting



実行結果


参考情報
セクション31. DMA コントローラ
PIC32のDMA機能を使ったLEDディスプレイ表示実験


0 件のコメント:

コメントを投稿

KT0913 FMラジオの作成(8) 出来上がったPCB基板にミスあり。

  FusionPCB から基板がとどきました。20240121. 1月11日に発注したので10日で出来上がって届きました。 早速組み立てましたがが、イヤホンジャックのフットプリントが裏返っており、痛恨のミス。。。 しかしながら、他にも問題が無いか一通り組み立ててチェックしました...