Hobby Lab 趣味のモノ作り実験のサイトです。
部品 プロセッサー他 CH32V test_USART
  1 はじめに
 1.1 各MCUのUSART端子
 1.2 テスト条件
1.2.1 MCUと動作周波数
1.2.2 テスト回路
1.2.3 WCH-LinkEについて
  2 USARTを使う
 2.1 プログラム
2.1.1 プログラム概要
2.1.2 プログラム内容
 2.2 フラグ
2.2.1 フラグ判定関数
2.2.2 ステータスフラグ
2.2.3 使い方
 2.3 動作確認(他処理=5(us))
 2.4 動作確認(他処理=200(us))
  3 割込みを使う
 3.1 プログラム
3.1.1 プログラム概要
3.1.2 プログラム内容
 3.2 割り込み
3.2.1 割り込みフラグ判定関数
3.2.2 ステータスフラグ
3.2.3 NVIC
 3.3 受信割り込み動作確認
 3.4 送信の割込み処理と処理時間
3.4.1 プログラム概要
3.4.2 プログラム変更内容
3.4.3 結果
  4 DMAを使う
 4.1 DMAの利点
 4.2 プログラム
4.2.1 プログラム概要
4.2.2 プログラム内容
 4.3 DMA転送
4.3.1 USARTとDMAマッピング
4.3.2 DMAステータス
 4.4 動作確認

Sf:Pt プロトコル関係
SfPt:MODBUS

Pr:Prプロセッサ関係
PrP:プロセッサ
動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較
raspberrypi関係
 RaspberryPiハード
CH32V関係
 -CH32V開始
 -203K8T6(32Pin)開始
 -203C8T6(48P)開始
 -003J4M6(8Pin)開始
 -003F4P6(20Pin)開始
 -Moun River StudioⅡ
 プログラミング!
  203_GPIO関係
  203_TIME関係
  203_TIME Encoder
  203_I2C関係
  203_1-Wire関係
  003_DS18B20テスター
  USART(UART)関係
  DS18B20をModBus制御
 -マニュアル
 203データシート
 203取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:その他  RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター
Pr:Wire 電線関係
Pr:Resistance 抵抗
Pr:Capacitor コンデンサ
Pr:Coil コイル
Pr:PassiveElmt 受動素子
Pr:Diode ダイオード関係
Pr:OPAMP オペアンプ関係
PrO:送受信機  Si4735
PrO:オペアンプ  LM324
 LM358
Pr:Tr トランジスタ関係
2SC1815
 リレードライバー設計
 アンプ設計
 発振器
TLP152
 TLP152テスト
TLP2361
 TLP2361テスト
TLP5754
 TLP5754テスト
Pr:Source 電源関係  ツェナーダイオード
 TL431
 LM317
PrS:Downモジュール
 EGS002_IR2110S
 SKU011012
 ACDC02
 XH_M299
 LM2596
 Mini360_MP23070N
 DROK
 WH140
PrS:UPモジュール
 MT3608
PrS:充電モジュール
 TP4056
Pr:Sensor_AD_時計等
PrS:電圧、電流
ADS1115 16bit4CH I2C A/D
 Hardware
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226 I2C 直流電圧電流
 Hardware
 Arduino
 RaspberryPi_Python
WCS 電流ホール素子
 Hardware
PrS:温度、気圧、湿度、照度
BNE280 I2C 気圧,湿度,気温
 Hardware
 Arduino
 RaspberryPi_Python
BH1750 I2C 照度
 Hardware
 Arduino
 RaspberryPi_Python
DS18B20 1-Wire 温度計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:時間、日時
DS3231 I2C 時計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:表示器
MAR3953 320X480 3.95"
 概要と線や点を描く
 フォントを描く
SSD1306 I2C 0.96"OLED
 Hardware
 Arduino
 RaspberryPi_Python
Pr:Old Processor他

1 はじめに

 このテストプログラムはシリアルの送受信で用途はMODBUSで使用することを前提に作成する。
 最終的にCH32V003J4M6で使用でき、シリアル通信は非同期の受信は割り込み処理、送信はDMAを使いプログラムする。

1.1 各MCUのUSART端子

各MCUのUSART端子一覧表
CH32V003203307
型番J4M6F4P6K8T6C8T6VCT6
PackageSOP8TSSOP20LQFP32LQFP48LQFP100
装置役目PinNoPortNoPinNoPortNoPinNoPortNoPinNoPortNoPinNoPortNo
USART1 TX 8PD5 19PD5 19PA9 30PA9 68PA9
RX 1PD6 20PD6 20PA1031PA1069PA10
CK 8?PD4?18PD4 18PA8 29PA8 67PA8
CTS----- 17PD3 21PA1132PA1170PA11
RTS 6PC2 9PC2 22PA1233PA1271PA12
USART2 TX --------- 8PA212PA225PA2
RX --------- 9PA313PA326PA3
CK ---------10PA414PA429PA4
CTS--------- 6PA010PA023PA0
RTS--------- 7PA011PA124PA1
USART3 TX --------------21PB1047PB10
RX --------------22PB1148PB11
CK --------------25PB1251PB12
CTS--------------26PB1352PB13
RTS--------------27PB1453PB14
USART4 TX ---------14?PB0?18PB078PC10
RX ---------15?PB1?20PB179PC11
CK --------------20PB2*5-----
CTS---------26?PB3?39PB3-----
RTS---------27?PB4?40PB4-----
*5 BOOT1 CH32V003は Default alternate function
307VCT6は8個のUSARTが用意されている。

MounRiver Studio Ⅱで使用されている
printfで使用しているデータ送信は CH32V203 では USART1 で TX が PA9 に出力される。

1.2 テスト条件

1.2.1 MCUと動作周波数

試験プログラムのMCUはCH32V003F4P6を使用する。
周波数は内蔵クロック 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

1.2.2 テスト回路

テスト用の回路は右図の様に

・オシロ1番(黄色) :

WCH-LinkEのTxに接続
スレーブのRxに接続

・オシロ2番(水色,線は緑) :

WCH-LinkEのRxに接続
スレーブの Tx に接続。

・オシロ3番(赤色) :

PA2に接続
スレーブ内(CH32V003F4P6のUSARTの Rx から信号を受け、 Tx へデータを転送完了まで)の処理中 Hi 電圧をPA2端子出力している。

・オシロ4番(青色) :

PC4に接続。
スレーブ(CH32V003F4P6)内でUSARTプログラムの他に動作しているプログラムを模擬(Delay_Us(xxx);//①で模擬)し処理中 Hi 電圧をPC4端子に出力している。

1.2.3 WCH-LinkEについて

WCH-LinkEはスレーブ(CH32V003F4P6)のプログラムを書き込み用とUSARTの送受信用インターフェースです。
プログラムの書き込み用としてはCH32V203では4本接続でしたが、003F4P6は3本の接続。
LinkE 端子003F4P6 端子備 考
おもてRxTxシリアル通信の送受信用
TxRx
うらSWDIO/TMSSWD※1プログラム書き込み用
GNDG
3V3V
※1 PD1に接続されており、開発ボードのLED1(電圧ありで点灯)もここに接続されている。




2 USARTを使う

2.1 プログラム

2.1.1 プログラム概要

マスター(PC)から3Byteの連続した信号を送信する。
スレーブ(CH32V003)で受け取った信号をスレーブからマスターへ送信します。
スレーブにはUSARTのプログラム以外に①その他処理プログラム(模擬)を走らせている。
今回のプログラムは割り込みやDMA転送を使用しないプログラムです。
どんな不具合がでるかを確認する。

2.1.2 プログラム内容


2.2 フラグ

2.2.1 フラグ判定関数

mainプログラムの中に記載しているUSARTの受信データ有りなどを判定している部分
 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の受信と送信をするため追加
詳細は下記プログラム参照

3.1.2 プログラム内容


3.2 割り込み

3.2.1 割り込みフラグ判定関数

プログラム中で
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
の関数により USART1 の受信割り込みを有効化し USART1 で受信すると下記関数へプログラムがジャンプします。

 void USART1_IRQHandler(void){
この関数内でどんな割り込み処理をするかは割り込みのステータスを確認して処理する。
下記は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))』の支障が無くなった。

3.4 送信の割り込み処理と処理時間

3.4.1 プログラム概要

プログラムは受信割り込み同様、受信したものを送信し続いて
受信同様連続して複数のByteを送信する。
この場合取りこぼしが発生するため、送信も割り込み処理して動作確認をする。
なお送信する複数のByteは 0x32,0x33,0x34 とする。

3.4.2 プログラム変更内容

なお追加変更したプログラムは下記のとおり

3.4.3 結果

・割り込みを採用したことにより受信同様、送信抜けが無い。

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

右図拡大箇所で波形色 赤 のHi時間と処理概要(左側から説明)
処理No処理概要処理時間(us)
・信号受信および受信信号の送信
・その他3Byteの送信信号設定
2.9
・3Byteの内1Byteを送信3.0
(処理時間には 赤 波形の内 Lo-Hi Hi-Lo の処理時間( XX ns)が含まれているが、上記処理時間に対し小さいので無視する。)
今回の処理時間は、①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のオーバーヘッドがなくなります。

2. データ転送スループットの向上

DMAはCPUよりも効率的にメモリと周辺機器間でデータを転送できるため、大量のデータを連続して送信する際の通信速度や効率が向上します。

3. リアルタイム性能の向上

CPUが通信処理にブロックされないため、システムの応答性が向上し、より確実なリアルタイム制御が可能になります。
特に、高速な制御ループ内で大量のデバッグデータなどを送信する場合に有効です。

4. 低消費電力化

データ転送のためにCPUを長時間動作させる必要がなくなるため、マイコン全体の消費電力を削減できる可能性があります。

まとめ

CH32Vのシリアル通信送信にDMAを導入することで、特に大量のデータを高速で、かつCPUに負担をかけずに送りたい場合に大きな効果を発揮します。
これにより、より複雑で要求の厳しいアプリケーションの実装が可能になります。

今回のテストでは処理時間を確認したい。


4.2 プログラム

4.2.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 となりプログラムの初期化で設定する。
CH32V003203307
型番J4M6F4P6 K8T6C8T6VCT6
USART1TXDMA1 Channel4
RXDMA1 Channel5
USART2TX--------DMA1 Channel7
RX--------DMA1 Channel6
USART3TX------------DMA1 Channel2
RX------------DMA1 Channel3
USART4TX------------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 部分。



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




































更新日 2026/01/10 15:05  管理者 平林 剛Hirabayashi Takeshi