文字列 "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 件のコメント:
コメントを投稿