1 はじめに
このテストプログラムはシリアルの送受信で用途はMODBUSで使用することを前提に作成する。最終的にCH32V003J4M6で使用でき、シリアル通信は非同期の受信は割り込み処理、送信はDMAを使いプログラムする。
1.1 各MCUのUSART端子
各MCUのUSART端子一覧表
*5 BOOT1
CH32V003は Default alternate function
307VCT6は8個のUSARTが用意されている。
MounRiver Studio Ⅱで使用されている
printfで使用しているデータ送信は CH32V203 では USART1 で TX が PA9 に出力される。
| CH32V | 003 | 203 | 307 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 型番 | J4M6 | F4P6 | K8T6 | C8T6 | VCT6 | ||||||
| Package | SOP8 | TSSOP20 | LQFP32 | LQFP48 | LQFP100 | ||||||
| 装置 | 役目 | PinNo | PortNo | PinNo | PortNo | PinNo | PortNo | PinNo | PortNo | PinNo | PortNo |
| USART1 | TX | 8 | PD5 | 19 | PD5 | 19 | PA9 | 30 | PA9 | 68 | PA9 |
| RX | 1 | PD6 | 20 | PD6 | 20 | PA10 | 31 | PA10 | 69 | PA10 | |
| CK | 8? | PD4? | 18 | PD4 | 18 | PA8 | 29 | PA8 | 67 | PA8 | |
| CTS | -- | --- | 17 | PD3 | 21 | PA11 | 32 | PA11 | 70 | PA11 | |
| RTS | 6 | PC2 | 9 | PC2 | 22 | PA12 | 33 | PA12 | 71 | PA12 | |
| USART2 | TX | -- | -- | -- | --- | 8 | PA2 | 12 | PA2 | 25 | PA2 |
| RX | -- | -- | -- | --- | 9 | PA3 | 13 | PA3 | 26 | PA3 | |
| CK | -- | -- | -- | --- | 10 | PA4 | 14 | PA4 | 29 | PA4 | |
| CTS | -- | -- | -- | --- | 6 | PA0 | 10 | PA0 | 23 | PA0 | |
| RTS | -- | -- | -- | --- | 7 | PA0 | 11 | PA1 | 24 | PA1 | |
| USART3 | TX | -- | -- | -- | --- | -- | --- | 21 | PB10 | 47 | PB10 |
| RX | -- | -- | -- | --- | -- | --- | 22 | PB11 | 48 | PB11 | |
| CK | -- | -- | -- | --- | -- | --- | 25 | PB12 | 51 | PB12 | |
| CTS | -- | -- | -- | --- | -- | --- | 26 | PB13 | 52 | PB13 | |
| RTS | -- | -- | -- | --- | -- | --- | 27 | PB14 | 53 | PB14 | |
| USART4 | TX | -- | -- | -- | --- | 14? | PB0? | 18 | PB0 | 78 | PC10 |
| RX | -- | -- | -- | --- | 15? | PB1? | 20 | PB1 | 79 | PC11 | |
| CK | -- | -- | -- | --- | -- | --- | 20 | PB2*5 | -- | --- | |
| CTS | -- | -- | -- | --- | 26? | PB3? | 39 | PB3 | -- | --- | |
| RTS | -- | -- | -- | --- | 27? | PB4? | 40 | PB4 | -- | --- | |
307VCT6は8個のUSARTが用意されている。
MounRiver Studio Ⅱで使用されている
printfで使用しているデータ送信は CH32V203 では USART1 で TX が PA9 に出力される。
1.2 テスト条件
1.2.1 MCUと動作周波数
試験プログラムのMCUはCH32V003F4P6を使用する。
周波数は内蔵クロック 48MHz で動作させる。 設定はsystem_ch32v00x.cの以下部分のコメントアウトを外している。
周波数は内蔵クロック 48MHz で動作させる。 設定はsystem_ch32v00x.cの以下部分のコメントアウトを外している。
//#define SYSCLK_FREQ_8MHz_HSI 8000000
//#define SYSCLK_FREQ_24MHZ_HSI HSI_VALUE
#define SYSCLK_FREQ_48MHZ_HSI 48000000
//#define SYSCLK_FREQ_8MHz_HSE 8000000
//#define SYSCLK_FREQ_24MHz_HSE HSE_VALUE
//#define SYSCLK_FREQ_48MHz_HSE 48000000
//#define SYSCLK_FREQ_24MHZ_HSI HSI_VALUE
#define SYSCLK_FREQ_48MHZ_HSI 48000000
//#define SYSCLK_FREQ_8MHz_HSE 8000000
//#define SYSCLK_FREQ_24MHz_HSE HSE_VALUE
//#define SYSCLK_FREQ_48MHz_HSE 48000000
1.2.2 テスト回路
テスト用の回路は右図の様に
・オシロ1番(黄色) :
WCH-LinkEのTxに接続
スレーブのRxに接続
スレーブのRxに接続
・オシロ2番(水色,線は緑) :
WCH-LinkEのRxに接続
スレーブの Tx に接続。
スレーブの Tx に接続。
・オシロ3番(赤色) :
PA2に接続
スレーブ内(CH32V003F4P6のUSARTの Rx から信号を受け、 Tx へデータを転送完了まで)の処理中 Hi 電圧をPA2端子出力している。
スレーブ内(CH32V003F4P6のUSARTの Rx から信号を受け、 Tx へデータを転送完了まで)の処理中 Hi 電圧をPA2端子出力している。
・オシロ4番(青色) :
PC4に接続。
スレーブ(CH32V003F4P6)内でUSARTプログラムの他に動作しているプログラムを模擬(Delay_Us(xxx);//①で模擬)し処理中 Hi 電圧をPC4端子に出力している。
スレーブ(CH32V003F4P6)内でUSARTプログラムの他に動作しているプログラムを模擬(Delay_Us(xxx);//①で模擬)し処理中 Hi 電圧をPC4端子に出力している。
1.2.3 WCH-LinkEについて
WCH-LinkEはスレーブ(CH32V003F4P6)のプログラムを書き込み用とUSARTの送受信用インターフェースです。
プログラムの書き込み用としてはCH32V203では4本接続でしたが、003F4P6は3本の接続。
※1 PD1に接続されており、開発ボードのLED1(電圧ありで点灯)もここに接続されている。
プログラムの書き込み用としてはCH32V203では4本接続でしたが、003F4P6は3本の接続。
| LinkE 端子 | 003F4P6 端子 | 備 考 | |
|---|---|---|---|
| おもて | Rx | Tx | シリアル通信の送受信用 |
| Tx | Rx | ||
| うら | SWDIO/TMS | SWD※1 | プログラム書き込み用 |
| GND | G | ||
| 3V3 | V | ||
2 USARTを使う
2.1 プログラム
2.1.1 プログラム概要
マスター(PC)から3Byteの連続した信号を送信する。
スレーブ(CH32V003)で受け取った信号をスレーブからマスターへ送信します。
スレーブにはUSARTのプログラム以外に①その他処理プログラム(模擬)を走らせている。
今回のプログラムは割り込みやDMA転送を使用しないプログラムです。
どんな不具合がでるかを確認する。
スレーブ(CH32V003)で受け取った信号をスレーブからマスターへ送信します。
スレーブにはUSARTのプログラム以外に①その他処理プログラム(模擬)を走らせている。
今回のプログラムは割り込みやDMA転送を使用しないプログラムです。
どんな不具合がでるかを確認する。
2.1.2 プログラム内容
2.2 フラグ
2.2.1 フラグ判定関数
mainプログラムの中に記載しているUSARTの受信データ有りなどを判定している部分
while ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) ) {
}
の構文が目新しいので説明を残す。
この USART_GetFlagStatus は汎用同期非同期送受信機ペリフェラルの現在の状態フラグを確認するためのライブラリ関数だ。
while ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) ) {
}
の構文が目新しいので説明を残す。
この USART_GetFlagStatus は汎用同期非同期送受信機ペリフェラルの現在の状態フラグを確認するためのライブラリ関数だ。
2.2.2 ステータスフラグ
フラグについては ch32v20x_usart.h(USART_Flags) に10種類が記載(右のメニューに『MounRiver Studioでプログラミング!』の中にも掲載)されている。
下表に内容を記載する。
下表に内容を記載する。
通信フラグ
| フラグ名 | 内容 |
|---|---|
| USART_FLAG_CTS | CTSフラグ(Clear to Send flag)。ハードウェアフロー制御が有効な場合、CTS信号線の状態変化に応じてセットされます。これは、相手側デバイスがデータ受信の準備ができたことを示します。 |
| USART_FLAG_LBD | ブレーク検出(Line break detection)。受信ラインでブレーク信号(スタートビットを含め、フレーム長を超えるLOWレベル)が検出されたときにセットされます。 |
| USART_FLAG_TXE | 送信データレジスタ空(Transmit data register empty) 。次の送信データ(1バイト)をデータレジスタに書き込める状態になるとセット(1)されます。通常、このフラグがセットされているときに次のバイトを送信レジスタに入れることで、継続的な送信が可能です。 |
| USART_FLAG_TC | 送信完了(Transmission complete)。送信シフトレジスタと送信データレジスタの両方が空になるとセットされます。つまり、現在のフレーム全体の送信が物理的に完了したことを示します。TXEは次のバイトをロードできるタイミング、TCはすべての送信が完了したタイミングと覚えてください。 |
| USART_FLAG_RXNE | 受信データレジスタ満タン(Receive data register not empty)。新しい受信データがデータレジスタに格納されたときにセットされます。このフラグがセットされたら、データレジスタからデータを読み出す必要があります。 |
| USART_FLAG_IDLE | アイドルライン検出(Idle line detected)。受信ラインが一定時間アイドル(ハイレベル)状態になったときにセットされます。マルチプロセッサ通信などで、新しいメッセージの開始を検出するのに使われます。 |
エラーフラグ
| フラグ名 | 内容 |
|---|---|
| USART_FLAG_ORE | オーバーランエラー(Overrun error)。新しいデータを受信したときに、前回の受信データをデータレジスタから読み出していなかった場合にセットされます。つまり、受信バッファが満タンの状態で次のデータが来てしまい、データが失われました。 |
| USART_FLAG_NE | ノイズエラー(Noise error)。受信データでノイズが検出されたときにセットされます。 |
| USART_FLAG_FE | フレーミングエラー(Framing error)。受信データのストップビットが期待される論理レベル(通常はハイ)ではなかった場合にセットされます。これは、ボーレートの不一致やノイズが原因で発生することがあります。 |
| USART_FLAG_PE | パリティエラー(Parity error)。パリティ制御が有効な場合、受信したデータのパリティビットが、設定されたパリティタイプ(偶数/奇数)と一致しなかったときにセットされます |
2.2.3 使い方
2.3 動作確認(その他処理時間=5(us))
マスターから送信する信号
3byteの連続した信号は AsciiCode で 1 2 3 です。 ( 16進データでは0x31,0x32,0x33です。)USART以外のその他の処理プログラム時間
mainプログラム中にUSART以外の処理プログラムを模擬するため Delay_Us( )を2箇所いれている。プログラム休憩期間は 5(us) PC4(オシロでは青線)信号は Lo
プログラム処理期間『 ①その他処理プログラム模擬』の値が 5(us) PC4信号は Hi
ここでは、支障がなく動作している。
オシロ波形で RS232-RX 信号(水色)で最初に変化する場所で下線の赤線部分で途切れてHiになっているのが判ると思うがそこが、マスターから信号を受信してスレーブからマスターへ送信しまする処理時間を示します。なおこの部分を時間的に拡大したのが右図です。 |
![]() 時間的に拡大すると赤線部分のHiになっている時間は1.08(us)だったことが判りました。 関係するプログラムを書き出すと下記のプログラム部になります。 GPIO_WriteBit (GPIOA, GPIO_Pin_2, Bit_SET); RxData = USART_ReceiveData(USART1); USART_SendData(USART1,RxData); GPIO_WriteBit (GPIOA, GPIO_Pin_2, Bit_RESET); |
2.4 動作確認(その他処理時間=200(us))
マスターから送信する信号
3byteの連続した信号は 先程と同じく AsciiCode で 1 2 3 です。 ( 16進データでは0x31,0x32,0x33です。)USART以外のその他の処理プログラム時間
mainプログラム中にUSART以外の処理プログラムを模擬するため Delay_Us( )を2箇所いれている。プログラム休憩期間は 5(us) PC4(オシロでは青信号)は Lo
プログラム処理期間『 ①その他処理プログラム模擬』の値が 200(us) PC4信号は Hi
こうなるとマスターから送信された2個めの信号が、スレーブ内でその他処理プログラムにより受信できなくなっていることが判る。
この様な事が発生しないように次の項目で実施する割り込みを使用する。
|
時間に関する場所を main 部から書き出した。 Delay_Us(5);//休憩時間5(us)のプログラム模擬 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)){ GPIO_WriteBit (GPIOA, GPIO_Pin_2, Bit_SET); RxData = USART_ReceiveData(USART1); USART_SendData(USART1,RxData); GPIO_WriteBit (GPIOA, GPIO_Pin_2, Bit_RESET); } GPIO_WriteBit (GPIOC, GPIO_Pin_4, Bit_SET); Delay_Us(200);//①その他処理プログラム模擬 |
3 割り込みを使う
3.1 プログラム
3.1.1 プログラム概要
『2.1 プログラム』との違いは
受信について割り込み処理をする。
・UART1_INIT() 内『USART1 受信割り込みの有効化』『NVIC設定』を追加
・main() 内 『//②』USARTの受信と送信部分を次の関数で実施するため コメントアウト
void USART1_IRQHandler(void)の割り込み関数でUSARTの受信と送信をするため追加
詳細は下記プログラム参照
受信について割り込み処理をする。
・UART1_INIT() 内『USART1 受信割り込みの有効化』『NVIC設定』を追加
・main() 内 『//②』USARTの受信と送信部分を次の関数で実施するため コメントアウト
void USART1_IRQHandler(void)の割り込み関数でUSARTの受信と送信をするため追加
詳細は下記プログラム参照
3.1.2 プログラム内容
3.2 割り込み
3.2.1 割り込みフラグ判定関数
プログラム中で
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
の関数により USART1 の受信割り込みを有効化し USART1 で受信すると下記関数へプログラムがジャンプします。
void USART1_IRQHandler(void){
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
の関数により USART1 の受信割り込みを有効化し USART1 で受信すると下記関数へプログラムがジャンプします。
void USART1_IRQHandler(void){
この関数内でどんな割り込み処理をするかは割り込みのステータスを確認して処理する。
下記はUART1の受信完了による割り込みステータスであることを確認して、処理する。
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
処理プログラムを記載: 今回は受信したものを送信する。
}
}
下記はUART1の受信完了による割り込みステータスであることを確認して、処理する。
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
処理プログラムを記載: 今回は受信したものを送信する。
}
}
3.2.2 ステータスフラグ
今回の『USART_IT_RXNE』に該当するような割り込みステータスフラグについては ch32v20x_usart.h(USART_Interrupt_definition) に13種類が記載(右のメニューに『MounRiver Studioでプログラミング!』の中にも掲載)されている。
下表に内容を記載する。
下表に内容を記載する。
通信割り込み
| 割り込み名 | 内容 |
|---|---|
| USART_IT_TXE | 送信データレジスタが空であることを示します。次の送信データを書き込む準備ができたときにセットされ、新しいデータをレジスタに書き込むと自動的にクリアされます。 |
| USART_IT_TC | 送信シフトレジスタ内の最後のデータフレームが完全に送信されたことを示します。送信が完了したときにセットされ、通常はソフトウェアでフラグをクリアするか、次の送信を開始する際に処理されます。 |
| USART_IT_RXNE | 受信データレジスタにデータが格納されており、読み出し可能であることを示します。データレジスタからデータを読み出すと自動的にクリアされます。 |
| USART_IT_IDLE | 受信ラインが一定期間アイドル(無通信)状態になったことを示します。これはフレームの終わりや通信の終了を検出するのに役立ちます。フラグはソフトウェアでクリアする必要があります。 |
| USART_IT_LBD | プロトコルで使用されるブレーク信号(長いLOW期間)が検出されたことを示します。 |
| USART_IT_CTS | ハードウェアフロー制御が有効な場合、CTS信号の状態変化を示します。 |
エラー割り込み
| 割り込み名 | 内容 |
|---|---|
| USART_IT_ERR |
これは、特定の単一の割り込みフラグではなく、通常はエラー割り込み全般を指す割り込みです。フレームエラー (FE)、ノイズエラー (NE)、パリティエラー (PE) 、オーバーランエラー (ORE)など。 |
| USART_IT_FE | 受信フレームの停止ビットが予期された状態(HIGH)でなかったことを示します。フレーミングエラーが発生したことを示します。 |
| USART_IT_NE | 受信ラインにノイズが検出されたことを示します。 |
| USART_IT_PE | 受信したデータのパリティビットに誤りがあったことを示します。 |
| USART_IT_ORE | これはオーバーランエラーを示す汎用的な割り込みフラグです。受信データレジスタが空になる前に次のデータを受信しようとしたときに発生します。これは、システムが受信データを処理する速度よりも速くデータが送信されてきたことを意味します。 |
| USART_IT_ORE_RX | このフラグは、RXNEIE (受信データレジスタNOTエンプティ割り込み許可) ビットがセットされている場合に発生するオーバーランエラー割り込みを表します。つまり、通常のデータ受信割り込みが有効な状況下でのオーバーランエラーを指します |
| USART_IT_ORE_ER | このフラグは、EIE (エラー割り込み許可) ビットがセットされている場合に発生するオーバーランエラー割り込みを表します。これは、エラー検出機能が有効な状況下でのオーバーランエラーを指します。 |
3.2.3 NVIC
プログラムの初期化で出てくる NVIC とは
3.3 受信割り込み動作確認
その他処理時間は不具合を起こした200(us)で確認
割り込み受信を採用することにより
受信信号を取りこぼす(前は0x32を取りこぼしていた)事がなくなり
『2.4 動作確認(その他処理時間=200(us))』の支障が無くなった。
割り込み受信を採用することにより
受信信号を取りこぼす(前は0x32を取りこぼしていた)事がなくなり
『2.4 動作確認(その他処理時間=200(us))』の支障が無くなった。
|
3.4 送信の割り込み処理と処理時間
3.4.1 プログラム概要
プログラムは受信割り込み同様、受信したものを送信し続いて
受信同様連続して複数のByteを送信する。
この場合取りこぼしが発生するため、送信も割り込み処理して動作確認をする。
なお送信する複数のByteは 0x32,0x33,0x34 とする。
受信同様連続して複数のByteを送信する。
この場合取りこぼしが発生するため、送信も割り込み処理して動作確認をする。
なお送信する複数のByteは 0x32,0x33,0x34 とする。
3.4.2 プログラム変更内容
なお追加変更したプログラムは下記のとおり
3.4.3 結果
・割り込みを採用したことにより受信同様、送信抜けが無い。
オシロ波形について、左図を時間的に拡大(100us/div➡2us/div)したのが右下。
拡大箇所は左図の送信コード0x31先頭部の波形色 赤 の Hi 部分。

右図拡大箇所で波形色 赤 のHi時間と処理概要(左側から説明)
(処理時間には 赤 波形の内 Lo-Hi Hi-Lo の処理時間( XX ns)が含まれているが、上記処理時間に対し小さいので無視する。)
今回の処理時間は、①2.9 + ②3 × 3 = 11.9(us) が必要となる事が判った。
・ModBusの最大処理時間の想定
今回作成しようとしているModBusでは最大送信Byteは 133 (Byte)なので
2.9+133 × 3 ≒ 402(us)が必要となる。
オシロ波形について、左図を時間的に拡大(100us/div➡2us/div)したのが右下。
拡大箇所は左図の送信コード0x31先頭部の波形色 赤 の Hi 部分。

右図拡大箇所で波形色 赤 のHi時間と処理概要(左側から説明)
| 処理No | 処理概要 | 処理時間(us) |
|---|---|---|
| ① | ・信号受信および受信信号の送信 ・その他3Byteの送信信号設定 | 2.9 |
| ② | ・3Byteの内1Byteを送信 | 3.0 |
今回の処理時間は、①2.9 + ②3 × 3 = 11.9(us) が必要となる事が判った。
・ModBusの最大処理時間の想定
今回作成しようとしているModBusでは最大送信Byteは 133 (Byte)なので
2.9+133 × 3 ≒ 402(us)が必要となる。
4 DMAを使う
4.1 DMAの利点
CPUの負荷を大幅に軽減し、他の処理と並行して高速なデータ転送を実現できる点にあります。
具体的なメリットは以下の通りです。
具体的なメリットは以下の通りです。
1. CPU負荷の軽減
CPUがデータ転送に関わる必要がなくなるため、本来のタスク(演算処理や他の周辺機器の制御など)に集中できます。
ポーリングや割り込み処理の削減: DMAを使用しない場合、CPUは1バイトごと(またはバッファフルごと)にデータレジスタに書き込む必要があり、 その都度ポーリングしたり割り込み処理を実行したりする必要があります。
DMAコントローラがこれらの作業を肩代わりすることで、CPUのオーバーヘッドがなくなります。
ポーリングや割り込み処理の削減: DMAを使用しない場合、CPUは1バイトごと(またはバッファフルごと)にデータレジスタに書き込む必要があり、 その都度ポーリングしたり割り込み処理を実行したりする必要があります。
DMAコントローラがこれらの作業を肩代わりすることで、CPUのオーバーヘッドがなくなります。
2. データ転送スループットの向上
DMAはCPUよりも効率的にメモリと周辺機器間でデータを転送できるため、大量のデータを連続して送信する際の通信速度や効率が向上します。
3. リアルタイム性能の向上
CPUが通信処理にブロックされないため、システムの応答性が向上し、より確実なリアルタイム制御が可能になります。
特に、高速な制御ループ内で大量のデバッグデータなどを送信する場合に有効です。
特に、高速な制御ループ内で大量のデバッグデータなどを送信する場合に有効です。
4. 低消費電力化
データ転送のためにCPUを長時間動作させる必要がなくなるため、マイコン全体の消費電力を削減できる可能性があります。
まとめ
CH32Vのシリアル通信送信にDMAを導入することで、特に大量のデータを高速で、かつCPUに負担をかけずに送りたい場合に大きな効果を発揮します。
これにより、より複雑で要求の厳しいアプリケーションの実装が可能になります。
これにより、より複雑で要求の厳しいアプリケーションの実装が可能になります。
今回のテストでは処理時間を確認したい。
4.2 プログラム
4.2.1 プログラム概要
プログラムは送信割り込みと違うのが。
受信したものを配列の先頭に記録し、その他のByte( 0x32,0x33,0x34 )を付加する。
その配列4BtyeをDMAへ転送してTXにより送信する。
つまり処理は受信割り込みした部分で実施するためこの1回で完了する。
受信したものを配列の先頭に記録し、その他のByte( 0x32,0x33,0x34 )を付加する。
その配列4BtyeをDMAへ転送してTXにより送信する。
つまり処理は受信割り込みした部分で実施するためこの1回で完了する。
4.2.2 プログラム内容
4.3 DMA転送
4.3.1 USARTとDMAマッピング
DMAを使う場合、DMAxチャネルと周辺機器についてマッピングが有るので、使用するUARTxのTx,Rxが何に対応しているか確認して設定する必要がある。
今回はUSART1のTxで使用するため、DMA1 Channel4 となりプログラムの初期化で設定する。
今回はUSART1のTxで使用するため、DMA1 Channel4 となりプログラムの初期化で設定する。
| CH32V | 003 | 203 | 307 | |||
|---|---|---|---|---|---|---|
| 型番 | J4M6 | F4P6 | K8T6 | C8T6 | VCT6 | |
| USART1 | TX | DMA1 Channel4 | ||||
| RX | DMA1 Channel5 | |||||
| USART2 | TX | ---- | ---- | DMA1 Channel7 | ||
| RX | ---- | ---- | DMA1 Channel6 | |||
| USART3 | TX | ---- | ---- | ---- | DMA1 Channel2 | |
| RX | ---- | ---- | ---- | DMA1 Channel3 | ||
| USART4 | TX | ---- | ---- | ---- | DMA2 Channel5 | |
| RX | ---- | ---- | ---- | DMA2 Channel3 | ||
4.3.2 DMAステータスフラグ
今回ステータスの確認や割り込みでステータスの確認は使用していないが、各ステータスフラグを下表にしめす。
ステータスフラグ
| 割り込み名 | 内容 |
|---|---|
| DMA1_FLAG_GL4 |
DMA1のチャンネル4におけるグローバル・インタラプト(全割り込み)フラグ を指します。 具体的には以下の役割を持ちます: 機能: DMA1(第1DMAコントローラ)の チャンネル4 で発生した任意の割り込みイベント(転送完了、転送半分完了、転送エラーのいずれか)を統合したステータスフラグです。 用途: DMA_GetFlagStatus() 関数などの引数として使用し、チャンネル4の処理が何らかの形で完了または発生したかを確認するために使用されます。 フラグのクリア: DMA_ClearFlag() 関数を用いてこのフラグをクリアすると、対応するチャンネル4の「転送完了(TC)」「転送半分(HT)」「転送エラー(TE)」の各フラグも同時にリセットされるのが一般的です。 |
| DMA1_FLAG_TC4 |
DMA1のチャネル4における「転送完了フラグ(Transfer Complete Flag)」を指します。 具体的には以下の役割を持ちます: 状態の検知: DMA1のチャネル4によるデータの転送(メモリ間、またはメモリとペリフェラル間)がすべて正常に終了したことを示します。 フラグの確認: プログラム内で DMA_GetFlagStatus(DMA1_FLAG_TC4) などの関数を用いて、転送が完了したかどうかを確認するために使用されます。 フラグのクリア: 転送完了後に次の動作へ移る際、DMA_ClearFlag(DMA1_FLAG_TC4) を呼び出してこのフラグを明示的にリセットする必要があります。 |
| DMA1_FLAG_HT4 |
DMA1コントローラのチャネル4における「転送半分完了フラグ(Half Transfer Complete Flag)」を指します。 主な役割と動作は以下の通りです。 機能: 設定したデータ転送総数の半分(50%)が完了した際にセットされるステータスフラグです。 用途: 主に「ダブルバッファリング」のような処理で使用されます。例えば、バッファの前半が転送し終わった(HTフラグ発生)タイミングで、CPUが前半部分のデータを処理し始め、その間にDMAが後半部分の転送を継続するといった並列処理を可能にします。 フラグ名の中身: DMA1: DMAコントローラ1 FLAG: ステータスフラグ HT: Half Transfer(半分転送完了) 4: チャネル4 このフラグは自動的にはクリアされないため、確認後はソフトウェア(DMA_ClearFlag関数など)で明示的にクリアする必要があります。 |
| DMA1_FLAG_TE4 |
DMA1のチャンネル4で「転送エラー(Transfer Error)」が発生したことを示すフラグ です。 主な役割と意味は以下の通りです: 機能: DMA転送中に何らかのエラー(バスエラーなど)が発生した際にセットされます。 名称の由来: DMA1: 1番目のDMAコントローラ FLAG_TE: Transfer Error(転送エラー)フラグ 4: チャンネル4 用途: プログラム内で DMA_GetFlagStatus(DMA1_FLAG_TE4) などの関数を用いてこのフラグを監視し、エラーが発生した場合の例外処理(リセットや再試行など)を行うために使用します。 通常、正常に転送が完了した場合は DMA1_FLAG_TC4 (Transfer Complete) がセットされますが、予期せぬエラーが起きた場合にこの TE4 フラグが立ちます。 |
割り込みフラグ
| 割り込み名 | 内容 |
|---|---|
| DMA_IT_TC | 機能:設定されたすべてのデータ転送(指定されたデータ数)がDMAによって完了したときに、このフラグがセットされます。割り込みのトリガー: プログラマがDMA設定レジスタで「転送完了割り込み許可 (TCIE: Transfer Complete Interrupt Enable)」を有効にしている場合、このフラグがセットされるとCPUに割り込み要求が発生します。 目的: CPUは、DMA転送の進行状況をポーリング(定期的に確認)する必要がなくなり、DMA操作が完了した時点で割り込みによって通知を受け取ることができます。これにより、CPUは他のタスクを効率的に実行できます。 使用法: 割り込みサービスルーチン (ISR) 内でこのフラグを確認し、必要に応じてクリアする(通常は特定のレジスタに1を書き込む)ことで、次のDMA転送の準備や後処理を行います。 |
| DMA_IT_HT |
機能: DMA転送が開始され、転送カウントが初期設定値のちょうど半分に達すると、HTIF (Half-Transfer Interrupt Flag) がセットされます。DMA_IT_HT を有効(設定)にすると、この時点でCPUに割り込み要求が送信されます。 用途:バッファリング: 連続的なデータストリーミング(オーディオ処理や通信など)において、一方のバッファの半分が埋まった(または空いた)時点で割り込みを発生させ、その間に他方のバッファに対して次のデータの書き込み(または読み出し)を行うことで、データの連続性を維持するために使用されます。 二重バッファ(ダブルバッファリング): 転送を二つのセクションに分割し、CPUのオーバーヘッドを最小限に抑えつつ、効率的なデータ処理を可能にします。 進捗監視: 大容量のデータ転送の進捗状況を監視する手段の一つとして利用できます。 MounRiver Studio Ⅱの環境では、通常、WCHが提供するライブラリやサンプルコードの中で、この割り込みを有効または無効にするためのマクロまたは関数(例: DMA_Cmd(), DMA_ITConfig(), DMA_GetFlagStatus()など)として定義されています。 |
| DMA_IT_TE |
機能: DMA転送中に、バスエラー、アクセス違反、またはその他の構成エラーなどの問題が発生した場合に、このフラグがセットされます。 目的: 転送が正常に完了しなかったことをソフトウェアに通知し、エラーハンドリング(例えば、転送の再試行、エラーログの記録、システムのリセットなど)を可能にします。 MounRiver Studioでの利用: 開発者は通常、このフラグに関連する割り込みハンドラを設定し、予期せぬDMAエラーが発生した際にプログラムが適切に対応できるようにコーディングします。 つまり、DMA_IT_TEはDMA転送の失敗を検出するために重要な役割を担っています。 |
| DMA1_IT_GL4 |
DMA1のチャネル4における「グローバル(総合)割込みフラグ」 を指します。 具体的には、以下の3つのイベントのいずれかが発生したことを示します。 ・転送完了 (TC: Transfer Complete) ・ハーフ転送完了 (HT: Half Transfer) ・転送エラー (TE: Transfer Error) 主な動作と用途 役割: チャネル4で何らかのDMAイベントが発生した際、このフラグがセットされます。プログラム内で DMA_GetITStatus(DMA1_IT_GL4) 等を使用して、チャネルの状態を一括で確認する際に利用されます。 フラグのクリア: 割込みハンドラ(ISR)内でこのフラグをクリアする場合、DMA_ClearITPendingBit(DMA1_IT_GL4) を呼び出すことで、チャネル4に関連するすべての個別割込みフラグ(TC4, HT4, TE4)を同時にクリアできます。 |
| DMA1_IT_TC4 |
DMA1 のチャンネル 4 における「転送完了割り込みフラグ」 を指します。 具体的には以下の役割を持ちます: 機能: DMA1 チャンネル 4 のデータ転送がすべて正常に完了した(Transfer Complete)ことを示す識別子(マクロ)です。 用途: 主に DMA_GetITStatus 関数で割り込みの発生を確認したり、DMA_ClearITPendingBit 関数で割り込みフラグをクリアしたりする際に引数として使用されます。 動作の例: ・タイマー(TIM1_CH4 等)や SPI などの周辺機器と連動して DMA 転送を行っている場合、設定したデータ数の送信・受信が終わるとこのフラグが立ちます。 ・割り込みハンドラ(ISR)内でこのフラグをチェックすることで、転送終了後の処理(次のデータ準備やバッファの切り替えなど)を CPU で実行できます。 |
| DMA1_IT_HT4 |
DMA1のチャネル4で「ハーフ転送完了(Half Transfer)」割り込みを有効または判定するための識別子 です。 主な役割と仕組みは以下の通りです: 1. 役割:ハーフ転送の通知 このフラグまたはマクロは、設定された全データ量の 半分(50%) の転送が完了したタイミングで割り込みを発生させるために使用されます。 用途: 主に「ダブルバッファリング」のような処理で使われます。データの半分が転送された時点でその前半部分の処理を開始し、残りの半分が転送されている間に並行して作業を進めることで、データの途切れを防ぎます。 2. 名前の意味 ・DMA1: DMAコントローラ1番。 ・IT: Interrupt(割り込み)の略。 ・HT: Half Transfer(ハーフ転送完了)の略。 ・4: チャネル4を指します。 3. 具体的な動作 ・割り込みの有効化: DMA_ITConfig(DMA1_Channel4, DMA_IT_HT, ENABLE); のように設定することで、チャネル4のハーフ転送時にCPUへ通知を送ることができます。 ・状態の確認: 割り込みハンドラ内で DMA_GetITStatus(DMA1_IT_HT4) を使用して、実際にハーフ転送が完了したかどうかを判定し、処理(バッファの切り替えなど)を行います。 補足: 転送がすべて完了した場合は、DMA1_IT_TC4 (Transfer Complete) という別のフラグが使用されます。 |
4.4 動作確認
DMA転送を使用することに、処理時間は 11.9 (us) ➡ 4 (us) へ短縮した。
オシロ波形について、左図を時間的に拡大(100us/div➡2us/div)したのが右下。
拡大箇所は左図の送信コード0x31先頭部の波形色 赤 の Hi 部分。

オシロ波形について、左図を時間的に拡大(100us/div➡2us/div)したのが右下。
拡大箇所は左図の送信コード0x31先頭部の波形色 赤 の Hi 部分。

次回 ModBusスレーブの動作テストでは USARTの受信は割り込み処理、送信はDMA転送処理でプログラミングしていく。

オシロ波形で RS232-RX 信号(水色)で最初に変化する場所で下線の赤線部分で途切れてHiになっているのが判ると思うがそこが、マスターから信号を受信してスレーブからマスターへ送信しまする処理時間を示します。