Arduino UNO R4の割り込み処理、まだ、使いこなせません。
ライブラリというか、備え付けの関数を使ってということではなく
もっと複雑な(ちゃうちゃう、シンプルに)処理をしたいぞと
なるとRA4M1マイコンのレジスタを直接操作してとなります。
UNO R3のATmega328Pは分かりやすく
あれこれできました
そのあたりがまだまだ勉強不足。
・備え付けの関数の例
attachInterrupt(なんたら);
#include "FspTimer.h"であれこれ
割り込みの設定状態を調べるため、とりあえず、こんなスケッチを。
割り込みのイベントリンクを設定する「IELSR」というレジスタ
が32個あって、割り込み元を設定するということなんです。
それをシリアル出力してみました。
// イベントリンクコントローラの設定を見る
#include "Wire.h" // ヘッダファイル ★あれこれ記述してみる
const char *const elc_event_msg[]={ // ELC_EVENT名
"-", // 0 Link disabled
"ICU_IRQ0", // 1 External pin interrupt 0
"ICU_IRQ1", // 2 External pin interrupt 1
"ICU_IRQ2", // 3 External pin interrupt 2
"ICU_IRQ3", // 4 External pin interrupt 3
"ICU_IRQ4", // 5 External pin interrupt 4
"ICU_IRQ5", // 6 External pin interrupt 5
"ICU_IRQ6", // 7 External pin interrupt 6
"ICU_IRQ7", // 8 External pin interrupt 7
"ICU_IRQ8", // 9 External pin interrupt 8
"ICU_IRQ9", // 10 External pin interrupt 9
"ICU_IRQ10", // 11 External pin interrupt 10
"ICU_IRQ11", // 12 External pin interrupt 11
"ICU_IRQ12", // 13 External pin interrupt 12
"ICU_IRQ13", // 14 External pin interrupt 13
"ICU_IRQ14", // 15 External pin interrupt 14
"ICU_IRQ15", // 16 External pin interrupt 15
"DMAC0_INT", // 17 DMAC transfer end 0
"DMAC1_INT", // 18 DMAC transfer end 1
"DMAC2_INT", // 19 DMAC transfer end 2
"DMAC3_INT", // 20 DMAC transfer end 3
"DTC_COMPLETE", // 21 DTC last transfer
"DTC_END", // 22 DTC transfer end
"ICU_SNOOZE_CANCEL", // 23 Canceling from Snooze mode
"FCU_FRDYI", // 24 Flash ready interrupt
"LVD_LVD1", // 25 Voltage monitor 1 interrupt
"LVD_LVD2", // 26 Voltage monitor 2 interrupt
"LVD_VBATT", // 27 VBATT low voltage detect
"CGC_MOSC_STOP", // 28 Main Clock oscillation stop
"LPM_SNOOZE_REQUEST", // 29 Snooze entry
"AGT0_INT", // 30 AGT interrupt
"AGT0_COMPARE_A", // 31 Compare match A
"AGT0_COMPARE_B", // 32 Compare match B
"AGT1_INT", // 33 AGT interrupt
"AGT1_COMPARE_A", // 34 Compare match A
"AGT1_COMPARE_B", // 35 Compare match B
"IWDT_UNDERFLOW", // 36 IWDT underflow
"WDT_UNDERFLOW", // 37 WDT underflow
"RTC_ALARM", // 38 Alarm interrupt
"RTC_PERIOD", // 39 Periodic interrupt
"RTC_CARRY", // 40 Carry interrupt
"ADC0_SCAN_END", // 41 A/D scan end interrupt
"ADC0_SCAN_END_B", // 42 A/D scan end interrupt for group B
"ADC0_WINDOW_A", // 43 Window A Compare match
"ADC0_WINDOW_B", // 44 Window B Compare match
"ADC0_COMPARE_MATCH", // 45 Compare match
"ADC0_COMPARE_MISMATCH", // 46 Compare mismatch
"ACMPLP0_INT", // 47 Analog Comparator Channel 0 interrupt
"ACMPLP1_INT", // 48 Analog Comparator Channel 1 interrupt
"USBFS_FIFO_0", // 49 DMA transfer request 0
"USBFS_FIFO_1", // 50 DMA transfer request 1
"USBFS_INT", // 51 USBFS interrupt
"USBFS_RESUME", // 52 USBFS resume interrupt
"IIC0_RXI", // 53 Receive data full
"IIC0_TXI", // 54 Transmit data empty
"IIC0_TEI", // 55 Transmit end
"IIC0_ERI", // 56 Transfer error
"IIC0_WUI", // 57 Slave address match
"IIC1_RXI", // 58 Receive data full
"IIC1_TXI", // 59 Transmit data empty
"IIC1_TEI", // 60 Transmit end
"IIC1_ERI", // 61 Transfer error
"SSI0_TXI", // 62 Transmit data empty
"SSI0_RXI", // 63 Receive data full
"SSI0_INT", // 65 Error interrupt
"CTSU_WRITE", // 66 Write request interrupt
"CTSU_READ", // 67 Measurement data transfer request interrupt
"CTSU_END", // 68 Measurement end interrupt
"KEY_INT", // 69 Key interrupt
"DOC_INT", // 70 Data operation circuit interrupt
"CAC_FREQUENCY_ERROR", // 71 Frequency error interrupt
"CAC_MEASUREMENT_END", // 72 Measurement end interrupt
"CAC_OVERFLOW", // 73 Overflow interrupt
"CAN0_ERROR", // 74 Error interrupt
"CAN0_FIFO_RX", // 75 Receive FIFO interrupt
"CAN0_FIFO_TX", // 76 Transmit FIFO interrupt
"CAN0_MAILBOX_RX", // 77 Reception complete interrupt
"CAN0_MAILBOX_TX", // 78 Transmission complete interrupt
"IOPORT_EVENT_1", // 79 Port 1 event
"IOPORT_EVENT_2", // 80 Port 2 event
"IOPORT_EVENT_3", // 81 Port 3 event
"IOPORT_EVENT_4", // 82 Port 4 event
"ELC_SOFTWARE_EVENT_0", // 83 Software event 0
"ELC_SOFTWARE_EVENT_1", // 84 Software event 1
"POEG0_EVENT", // 85 Port Output disable interrupt A
"POEG1_EVENT", // 86 Port Output disable interrupt B
"GPT0_CAPTURE_COMPARE_A", // 87 Compare match A
"GPT0_CAPTURE_COMPARE_B", // 88 Compare match B
"GPT0_COMPARE_C", // 89 Compare match C
"GPT0_COMPARE_D", // 90 Compare match D
"GPT0_COMPARE_E", // 91 Compare match E
"GPT0_COMPARE_F", // 92 Compare match F
"GPT0_COUNTER_OVERFLOW", // 93 Overflow
"GPT0_COUNTER_UNDERFLOW", // 94 Underflow
"GPT1_CAPTURE_COMPARE_A", // 95 Compare match A
"GPT1_CAPTURE_COMPARE_B", // 96 Compare match B
"GPT1_COMPARE_C", // 97 Compare match C
"GPT1_COMPARE_D", // 98 Compare match D
"GPT1_COMPARE_E", // 99 Compare match E
"GPT1_COMPARE_F", // 100 Compare match F
"GPT1_COUNTER_OVERFLOW", // 101 Overflow
"GPT1_COUNTER_UNDERFLOW", // 102 Underflow
"GPT2_CAPTURE_COMPARE_A", // 103 Compare match A
"GPT2_CAPTURE_COMPARE_B", // 104 Compare match B
"GPT2_COMPARE_C", // 105 Compare match C
"GPT2_COMPARE_D", // 106 Compare match D
"GPT2_COMPARE_E", // 107 Compare match E
"GPT2_COMPARE_F", // 108 Compare match F
"GPT2_COUNTER_OVERFLOW", // 109 Overflow
"GPT2_COUNTER_UNDERFLOW", // 110 Underflow
"GPT3_CAPTURE_COMPARE_A", // 111 Compare match A
"GPT3_CAPTURE_COMPARE_B", // 112 Compare match B
"GPT3_COMPARE_C", // 113 Compare match C
"GPT3_COMPARE_D", // 114 Compare match D
"GPT3_COMPARE_E", // 115 Compare match E
"GPT3_COMPARE_F", // 116 Compare match F
"GPT3_COUNTER_OVERFLOW", // 117 Overflow
"GPT3_COUNTER_UNDERFLOW", // 118 Underflow
"GPT4_CAPTURE_COMPARE_A", // 119 Compare match A
"GPT4_CAPTURE_COMPARE_B", // 120 Compare match B
"GPT4_COMPARE_C", // 121 Compare match C
"GPT4_COMPARE_D", // 122 Compare match D
"GPT4_COMPARE_E", // 123 Compare match E
"GPT4_COMPARE_F", // 124 Compare match F
"GPT4_COUNTER_OVERFLOW", // 125 Overflow
"GPT4_COUNTER_UNDERFLOW", // 126 Underflow
"GPT5_CAPTURE_COMPARE_A", // 127 Compare match A
"GPT5_CAPTURE_COMPARE_B", // 128 Compare match B
"GPT5_COMPARE_C", // 129 Compare match C
"GPT5_COMPARE_D", // 130 Compare match D
"GPT5_COMPARE_E", // 131 Compare match E
"GPT5_COMPARE_F", // 132 Compare match F
"GPT5_COUNTER_OVERFLOW", // 133 Overflow
"GPT5_COUNTER_UNDERFLOW", // 134 Underflow
"GPT6_CAPTURE_COMPARE_A", // 135 Compare match A
"GPT6_CAPTURE_COMPARE_B", // 136 Compare match B
"GPT6_COMPARE_C", // 137 Compare match C
"GPT6_COMPARE_D", // 138 Compare match D
"GPT6_COMPARE_E", // 139 Compare match E
"GPT6_COMPARE_F", // 140 Compare match F
"GPT6_COUNTER_OVERFLOW", // 141 Overflow
"GPT6_COUNTER_UNDERFLOW", // 142 Underflow
"GPT7_CAPTURE_COMPARE_A", // 143 Compare match A
"GPT7_CAPTURE_COMPARE_B", // 144 Compare match B
"GPT7_COMPARE_C", // 145 Compare match C
"GPT7_COMPARE_D", // 146 Compare match D
"GPT7_COMPARE_E", // 147 Compare match E
"GPT7_COMPARE_F", // 148 Compare match F
"GPT7_COUNTER_OVERFLOW", // 149 Overflow
"GPT7_COUNTER_UNDERFLOW", // 150 Underflow
"OPS_UVW_EDGE", // 151 UVW edge event
"SCI0_RXI", // 152 Receive data full
"SCI0_TXI", // 153 Transmit data empty
"SCI0_TEI", // 154 Transmit end
"SCI0_ERI", // 155 Receive error
"SCI0_AM ", // 156 Address match event
"SCI0_RXI_OR_ERI", // 157 Receive data full/Receive
"SCI1_RXI", // 158 Received data full
"SCI1_TXI", // 159 Transmit data empty
"SCI1_TEI", // 160 Transmit end
"SCI1_ERI", // 161 Receive error
"SCI1_AM", // 162 Address match event
"SCI2_RXI", // 163 Received data full
"SCI2_TXI", // 164 Transmit data empty
"SCI2_TEI", // 165 Transmit end
"SCI2_ERI", // 166 Receive error
"SCI2_AM", // 167 Address match event
"SCI9_RXI", // 168 Received data full
"SCI9_TXI", // 169 Transmit data empty
"SCI9_TEI", // 170 Transmit end
"SCI9_ERI", // 171 Receive error
"SCI9_AM", // 172 Address match event
"SPI0_RXI", // 173 Receive buffer full
"SPI0_TXI", // 174 Transmit buffer empty
"SPI0_IDLE", // 175 Idle
"SPI0_ERI", // 176 Error
"SPI0_TEI", // 177 Transmission complete event
"SPI1_RXI", // 178 Receive buffer full
"SPI1_TXI", // 179 Transmit buffer empty
"SPI1_IDLE", // 180 Idle
"SPI1_ERI", // 181 Error
"SPI1_TEI", // 182 Transmission complete event
"SCE_PROC_BUSY", // 183
"SCE_ROMOK", // 184
"SCE_LONG_PLG", // 185
"SCE_TEST_BUSY", // 186
"SCE_WRRDY_0", // 187
"SCE_WRRDY_4", // 188
"SCE_RDRDY_0", // 189
"SCE_INTEGRATE_WRRDY", // 190
"SCE_INTEGRATE_RDRDY", // 191
};
/***** SETUP *****/
void setup(){
pinMode(13, OUTPUT); // D13:P111 LEDポート出力に
Serial.begin(9600); // 9600BPSで出力
while (!Serial); // USB接続チェック
Serial.println("ELC_EVENT01"); // タイトル
// 追加割り込み処理 ★あれこれ記述してみる
Serial1.begin(9600); // シリアル1 9600BPSで
tone(8, 10000, 0); // D8へ10kHz出力
Wire.begin(); // I2C
}
/***** LOOP *****/
void loop(){
int i;
volatile uint32_t d, *p;
char str_bff[80]; // 文字出力用バッファ
p = (volatile uint32_t *)0x40006300u; // IELSR先頭
for(i = 0; i < 32; i++){ // 32個
d = *p; // IELSRの内容
sprintf(str_bff, "%2d %08LX %02X %s",
i, // 番号 0~31
p, // IELSRアドレス
d & 0xFF, // ICUリンク番号
elc_event_msg[d & 0xFF]); // リンク説明
Serial.println(str_bff);
p++;
}
Serial.println("Stop");
while(1){
R_PORT1->PODR_b.PODR11 = !(R_PORT1->PODR_b.PODR11); // D13トグル
}
}
こんな出力が得られます。
ELC_EVENT01
0 40006300 33 USBFS_INT USB関連
1 40006304 34 USBFS_RESUME
2 40006308 31 USBFS_FIFO_0
3 4000630C 32 USBFS_FIFO_1
4 40006310 1E AGT0_INT delayやmillis用1msタイマ
5 40006314 A4 SCI2_TEI serial1関連
6 40006318 A5 SCI2_ERI
7 4000631C A3 SCI2_TXI
8 40006320 A6 SCI2_AM
9 40006324 7D GPT4_COUNTER_UNDERFLOW tone()
10 40006328 3B IIC1_TXI I2C関連
11 4000632C 3A IIC1_RXI
12 40006330 3C IIC1_TEI
13 40006334 3D IIC1_ERI
14 40006338 00 -
15 4000633C 00 -
16 40006340 00 -
17 40006344 00 -
18 40006348 00 -
19 4000634C 00 -
20 40006350 00 -
21 40006354 00 -
22 40006358 00 -
23 4000635C 00 -
24 40006360 00 -
25 40006364 00 -
26 40006368 00 -
27 4000636C 00 -
28 40006370 00 -
29 40006374 00 -
30 40006378 00 -
31 4000637C 00 -
Stop
最初の4つがSerial.begin()でのUSB通信関連。
そしてAGTを使った1ms割り込み。delayやmillisを処理します。
そしてsetupの中に入れたSerial1.begin() の割り込みが4つ。
番号9がtone()。
GPT4のアンダーフロー割り込みが有効になっているのだと推測
できます。
最後が「Wire.begin()」によるI2C関連が4つ。
まだまだ勉強不足です。
※割り込みが足りなくなるかも・・・
IELSRは0~31の32個。
割り込みベクトルに直接飛ぶんじゃない(ようだ)。
割り込みの数、足りなくなる?
仕事で使ったcortex M4 STM32F407となんか違う。
※追記
・Arduino UNO R4のシリアル通信ポートを増やす
この記事に、Serialとserila1以外にシリアルポートを2つ増やす
方法が記述されていたんで、前述のスケッチに追記してみ
ました。
最初のヘッダーファイルのところにこの2行。
UART Aux0(A4, A5);
UART Aux8(11, 12)
そしてsetup()にこの2行。
HeySeri1.begin(115200); //A4, A5ポートを使った追加のシリアル通信
HeySeri2.begin(115200); //11, 12ポートを使った追加のシリアル通信
結果、イベントリンクが8つ増えて、空き残が10個に。
ELC_EVENT01
0 40006300 33 USBFS_INT
1 40006304 34 USBFS_RESUME
2 40006308 31 USBFS_FIFO_0
3 4000630C 32 USBFS_FIFO_1
4 40006310 1E AGT0_INT
5 40006314 A4 SCI2_TEI
6 40006318 A5 SCI2_ERI
7 4000631C A3 SCI2_TXI
8 40006320 A6 SCI2_AM
9 40006324 7D GPT4_COUNTER_UNDERFLOW
10 40006328 3B IIC1_TXI
11 4000632C 3A IIC1_RXI
12 40006330 3C IIC1_TEI
13 40006334 3D IIC1_ERI
14 40006338 99 SCI0_TEI
15 4000633C 9A SCI0_ERI
16 40006340 98 SCI0_TXI
17 40006344 9B SCI0_AM
18 40006348 A9 SCI9_TEI
19 4000634C AA SCI9_ERI
20 40006350 A8 SCI9_TXI
21 40006354 AB SCI9_AM
22 40006358 00 -
23 4000635C 00 -
24 40006360 00 -
25 40006364 00 -
26 40006368 00 -
27 4000636C 00 -
28 40006370 00 -
29 40006374 00 -
30 40006378 00 -
31 4000637C 00 -
Stop
「ACIn_AM」って何だろ?
アドレス一致イベント:調歩同期式モードにおいて
比較データと受信データの1フレームが一致したとき
だと
最近のコメント