PSoC™ Creator [Hands On DMA編]
PSoC™を初めて使用する組込ソフトウェア技術者向けにPSoC™ Creatorの基本的な機能の使用方法を説明します。
今回はサンプルコードを参考に、DMAを使用してUART-to-memoryのバッファデータ転送する手順をHands-On形式で説明します。
アプリケーション仕様
Hands On で使用する評価ボードは、
・評価ボード名称:CY8CKIT-149
・搭載デバイス:CY8C4147AZI-S475
になります。
このHands-OnではDMAを使用してUART-to-memoryのバッファデータ転送をします。
- 開始後、Tera Termに定型文が表示されます。
- Tera Termに10文字入力するとPSoC 4からエコーバックして入力した文字が返ってきます。
- RxDMAはバッファに10バイトを転送すると割り込みが発生し、TxDMAがイネーブルになります。
TxDMAはバッファからUARTへ10バイト転送するように設定されています。
DMAコンポーネントについて
このコンポーネントはメモリーレジスタ間やメモリーメモリ間などでデータの転送をCPUを介さずに行うことができます。DMAの転送はバイト、ハーフワード(2バイト)、ワード(4バイト)幅で設定できます。DMAチャネル(それ自体を含む)、別のDMAチャネル、周辺装置、またはCPUからの外部トリガを介して各トランザクションを開始します。 DMAは、データ転送タスクをCPUからオフロードするのに最適です。
PSoC™ Creatorワークフロー
プロジェクトの作成
PSoC™ Creatorを立ち上げプロジェクトを作成します。
プロジェクト作成の詳細はプロジェクト作成編を参照してください。
①PSoC™ Creatorを起動します。
②File>New>Projectを選択します。
③Target DeviceをPSoC 4>PSoC 4100S Plusを選択します。
④Nextを選択します。
⑤プロジェクトを生成するワークスペース、パスおよびプロジェクト名を指定します。
Workspace name : workspace
Location : C:¥PSoC
Project name : Design06
⑥ Finishを選択します。
コンポーネントの設定
コンポーネントの挿入
使用するコンポーネントを回路図に挿入していきます。
Component Catalogから下記の各コンポーネントを選択して回路図にドラッグ&ドロップします。
①Communications>UART(SCB mode)
②,③:System>DMA Channel
UART(UART_1)の設定
DMAにデータを転送するI/FとしてUARTを使用します。
UARTは送受信を行うよう設定します。
①ダブルクリックします。
②名称(Name)をUARTに変更します。
③UART Advancedのタブを開きます。
④RX OutputとTX Outputともに「✔」を入れます。
⑤④の作業をするとTrigger Levelの
設定を行うことが出来ます。
TX FIFO Level : 7
RX FIFO Level : 0
⑥OKを選択します。
RxDMA(DMA_1)の設定 1/3
UARTからのデータを受信してバッファに転送するDMAの設定です。
受信形式や受信バイト数などを設定していきます。
①ダブルクリックします。
②名称(Name)をRxDMAに変更します。
③Number of Descriptorsを2にする。
RxDMA(DMA_1)の設定 2/3
④Descriptor 0のタブを開きます。
⑤Data element sizeをByte設定
⑥Number of data elements to transferを10に設定
Number of data elements to transferを
変更することで格納する文字数を変更する
ことができます。
⑦Source and destination transfer widthを
Word to Byteに設定します。
Byteは8bit、Wordは32bitの設定です。
⑧Increment destination address by oneに「✔」
⑨Triger typeをLevel sensitive – wait 4 SYSCLK に変更
⑩Post completion actionsの
Chain to descriptor 1に「✔」
Generate interrupt requestに「✔」
RxDMA(DMA_1)の設定 3/3
Descriptor 1のタブを開きます。
設定はDescriptor 0と同じです。
設定が完了した後、OKを選択します。
TxDMA(DMA_2)の設定 1/2
バッファからUARTに転送するためのDMAの設定です。
送信形式や送信バイト数などを設定していきます。
①ダブルクリックします。
②名称(Name)をTxDMAに変更します。
③Number of Descriptorsは
1になっているのを確認してください。
TxDMA(DMA_2)の設定 2/2
④Descriptors 0のタブを開きます。
⑤Data element sizeをByteに設定
⑥ Number of data elements to transferを10に設定
Number of data elements to transferを
変更することで出力する文字数を変更する
ことができます。
⑦Source and destination transfer widthを
Byte to Wordに設定。
⑧Increment source address by oneに「✔」
⑨Triger typeをLevel sensitive – wait 4 SYSCLK に変更
⑩Post completion actionsのInvalidate descriptor 0に「✔」
⑪OKを選択します。
Wire Tool(配線)の設定
各コンポーネントを配線していきます。
左下図のようにWire Toolで結線してください。
①Wire Tool アイコンを選択し
結線モードに入ります。
②UART:rx_dma>>RxDMA:tr_in
UART:tx_dma>>TxDMA:tr_in
を結線します。
ピンの割り当て
設定した各コンポーネントにPinを割り当てていきます。
各Pin配置は「PSoC™評価ボード説明」の「ピン配置」の項をご参照ください。
①「Pins」をダブルクリックします。
②コンポーネントのPorts/Pinsを設定します。
UART : rx P7[0] (pin37)
UART : tx P7[1] (pin38)
アプリケーションの生成
ここまでの作業でPSoC™ Creatorがアプリケーションのスケルトンコード(空のmain関数、startup、必要なドライバなどのソースコード)を生成するために必要な情報がすべて入力されました。
メニューから
Build > Generate Application
を選択して、アプリケーションを生成します。
【ショートカット】
あるいは、コマンドアイコンからGenerate Application を選択してアプリケーションを生成することも可能です。
ソースコードの記述
①「main.c」をダブルクリックしてファイルを開く。
②ソースコードを作成します。最初に記述されていたテキストを全て消去してください。
下記のソースコードをコピーして貼り付けてください。
#include "project.h"
#define DESCR0 0
#define DESCR1 1
#define BUFFER_SIZE 10
/* UART data buffers */
uint8 uartBuffer0[BUFFER_SIZE];
uint8 uartBuffer1[BUFFER_SIZE];
int main(void)
{
/* Array of pointers to UART data buffers */
static void * const txBufferAddress[] = {uartBuffer0, uartBuffer1};
/* Indicates which buffer is being currently transmitted */
static uint8 txBufferIdx = 0u;
/* Configures the receive DMA to transfer from UART to RAM. */
RxDMA_SetSrcAddress(DESCR1, (void *)UART_RX_FIFO_RD_PTR);
RxDMA_SetDstAddress(DESCR1, (void *)uartBuffer1);
RxDMA_ValidateDescriptor(DESCR1);
/* Descriptor 0 is configured and validated */
RxDMA_Start((void *)UART_RX_FIFO_RD_PTR, (void *)uartBuffer0);
/* Configures the transmit DMA to transfer data from RAM to UART. */
TxDMA_Init();
TxDMA_SetDstAddress(DESCR0, (void *)UART_TX_FIFO_WR_PTR);
/* Enable interrupts */
CyGlobalIntEnable;
/* Start UART communication */
UART_Start();
/* Transmit header to the terminal */
UART_UartPutString("\r\n***************************************\r\n");
UART_UartPutString("UART to Memory Buffer using DMA code example project\n");
UART_UartPutString("Transmit 10 characters to see an echo in the terminal.\n");
for(;;)
{
/* Wait for complete transfer */
if(0u == (RxDMA_CHANNEL_MASK ^ CyDmaGetInterruptSourceMasked()))
{
/* Clears the rxDMA interrupt source */
CyDmaClearInterruptSource(RxDMA_CHANNEL_MASK);
/* Points transmit DMA to buffer which contains received data and enables transfer */
TxDMA_SetSrcAddress(DESCR0, txBufferAddress[txBufferIdx]);
TxDMA_ValidateDescriptor(DESCR0);
TxDMA_ChEnable();
/* Switch to other buffer. */
txBufferIdx ^= 1u;
}
}
}
/* [] END OF FILE */
※このアプリケーションは、CE224406 – PSoC 4 UART(Infineon 社Web)を参照しています。
プロジェクトの書き込み
①プロジェクトを書き込むため、評価ボードをPCへ接続します。
ソースコード記述後、Build、Programを行うことでプロジェクトが評価ボードに書き込まれます。
②「Build」をクリックしプロジェクトをビルドします。
無事ビルドが完了すると、Output領域に「Build Succeeded」がレポートされます。
③「Program」をクリックし、ターゲットボードに書き込みを行います。
Output領域に「Device ‘デバイス名’ was successfully programmed 」がレポートされれば書き込み完了です。
動作確認
PCのターミナルプログラムの設定 (TeraTerm)
プロジェクトの書き込み用にPCと接続したポートを、ターミナルとして使用します。
プロジェクトの書き込みが終了するとプログラムが開始されます。
開始後、Tera Termに定型文が表示されます。
Tera Termに10文字入力するとPSoC 4からエコーバックして入力した文字が返ってきます。
RxDMAはバッファに10バイトを転送すると割り込みが発生し、TxDMAがイネーブルになります。TxDMAはバッファからUARTへ10バイト転送するように設定されています。
担当エンジニアからの一言
今回はDMAを使用したアプリケーションの作成を説明しました。
DMAを使用することで、メモリから周辺機器(UARTなど)に高速にデータを転送することができます。
各DMAチャネルはコンポーネントを使用することでディスクリプタの設定が簡単にでき、またユーザは複数のディスクリプタを作成し、相互にチェーンすることが可能です。
次回は、I2Cを使用してLED点灯を制御するアプリケーションを作成します。
PSoC™ Creatorはこちらから