余白 Copyright © 2018-2020 てきーらサンドム


■■■ SAMマイコンの道標(SAMC2x) ■■■


機能比較(64pin)(SAMC2x, D21) 2020/7/15 更新
 64pinのC20,C21,D20,D21 (ROM64〜256KB品)について機能、特性を示します。デフォルトのバリエーション品種(Device Variant)であるA品を示します。D21はバリエーションB/C/D/Lでデータ用フラッシュ領域(RWWセクション)が追加されています。
 
項目 共通 C20 C21 D20 D21
メモリ(ROM/RAM/データ用FLASH) 256KB/32KB/→
128KB/16KB/→
64KB/8KB/→
8KB
4KB
2KB
8KB
4KB
2KB
-
-
-
-
4KB (D21JxxD)
2KB (D21JxxB/C/L)
動作電圧 3.3V可 2.7〜5.5V 2.7〜5.5V 1.62〜3.63V 1.62〜3.63V
最大CPUクロック 48MHz
コア消費電流(48MHz,CoreMark, 85℃) 6.6mA max. 6.6mA max. 6.37mA max. 7.00mA max.
5.8mA max.(xxB/C/D/L)
特有のシリアルIO機能 CAN FD x 2 USB, I2S
タイマ本数(制御用途向き内数) 8(3) 8(3) 8(0) 8(3)
シリアル本数(UART/SPI/I2C) 4?(端子比較参照) 6 6 6
A/Dチャネル数(12bit/16bit) 12 / 0 20 / 3 20 / 0 20 / 0
D/Aチャネル数(10bit) 1 1 1
アナログコンパレータ本数 4 (2は誤記) 4 2 2
タッチコントローラ 256点(16本x16本)
RTC 有り
外部割込み本数(マスカブル/NMI) 16 / 1
カスタムロジック機能(LUT数) 4 4

 
端子比較(64pin)(SAMC2x) 2019/4/15 修正
 C20とC21の端子配置を以下に示します(以前掲載のD20,D21との比較は不備のため一旦削除)。
 C20/C21データシートB版ではC20はシリアル6本分のピン割り当て可能だった(32pinパッケージのみ4本しか使えないという注意書きもあった)のですが、C版で割り当てが削除されていました。ただし割り当て欄に意味ありげな"-"が記載されているので、非公式的には使えるかもしれません。

端子機能略号
 E.m   EXTINT[m] 外部割込み
 An.m  ADCn/AIN[m] AD用アナログ入力
 Sn.m  SERCOMn/PAD[m] シリアルI/F(IC不可)
 Sn+m  SERCOMn/PAD[m] IC可能シリアルI/F
 Tn.m  TCCn/WO[m]    制御用途向きタイマ
 Un.m  TCn/WO[m]     基本タイマ
 C.m   AC/CMP[m]     アナログコンパレータ出力
 Ci.m  AC/AIN[m]      アナログコンパレータ入力
 G.m   GCLK_IO[m]     汎用クロック入出力
 *印   High Sink端子(吸込電流増強端子)
区分 ピン番号 端子名 電源系 端子機能  ()内はC21のみ
電源 56 VDDIN VDDIN コア用電源入力
55 VDDCORE コア用電源出力。コンデンサ接続。
21, 34, 48 VDDIO VDDIO デジタルIO用電源。VDDINと同電位以下にすること。
22, 33, 47, 54 GND グランド[デジタルIO用およびコア電源用]
8 VDDANA VDDANA アナログ用電源。VDDINと同電位にすること。
7 GNDANA グランド[アナログ用]
 デバッガ
接続用
52 RESETN VDDIN (推定) リセット入力[アクティブ"L"]
57 PA30 VDDIN SWCLK/E.10/S1.2/T1.0/G.0
58 PA31 VDDIN SWDIO/E.11/S1.3/T1.1
クロック
発振可
1 PA00 VDDANA XIN32/E.0/S1.0/T2.0/C.2
2 PA01 VDDANA XOUT32/E.1/S1.1/T2.1/C.3
31 PA14 VDDIO XIN/E.14/S2.2/U4.0/T0.4/G.0/(S4.2)
32 PA15 VDDIO XOUT/E.15/S2.3/U4.1/T0.5/G.1/(S4.3)
アナログ
電源系
ポート
3 PA02 VDDANA E.2/A0.0/Ci.4/(VOUT)
4 PA03 VDDANA E.3/A0.1/Ci.5/VREFA
5 PB04 VDDANA E.4/(A1.6)
6 PB05 VDDANA E.5/Ci.6/(A1.7)
9 PB06 VDDANA E.6/Ci.7/(A1.8/INN.2)
10 PB07 VDDANA E.7/(A1.9/INP.2)
11 PB08 VDDANA E.8/A0.2/U0.0/(A1.4/INN.1/S4.0)
12 PB09 VDDANA E.9/A0.3/U0.1/(A1.5/INP.1/S4.1)
13 PA04 VDDANA E.4/A0.4/Ci.0/S0.0/T0.0/(VREFB)
14 PA05 VDDANA E.5/A0.5/Ci.1/S0.1/T0.1
15 PA06 VDDANA E.6/A0.6/Ci.2/S0.2/T1.0/(INN.0)
16 PA07 VDDANA E.7/A0.7/Ci.3/S0.3/T1.1/(INP.0)
61 PB00 VDDANA E.0/U3.0/(A1.0/S5.2)
62 PB01 VDDANA E.1/U3.1/(A1.1/S5.3)
63 PB02 VDDANA E.2/U2.0/(A1.2/S5.0)
64 PB03 VDDANA E.3/U2.1/(A1.3/S5.1)
VDDIN系
ポート
49 PB22 VDDIN(VDDIO) E.6/U3.0/G.0/(S5.2/CAN0.TX)
50 PB23 VDDIN(VDDIO) E.7/U3.1/G.1/(S5.3/CAN0.RX)
51 PA27 VDDIN E.15/G.0
53 PA28 VDDIN E.8/G.0[D5x,E5xは電源ピン]
59 PB30 VDDIN E.14/T0.0/T1.2/C.2/(S5+0)
60 PB31 VDDIN E.15/T0.1/T1.3/C.3/(S5+1)
VDDIO系
ポート
17 PA08 VDDIO NMI/A0.8/S0+0/S2+0/T0.0/T1.2/(A1.10)
18 PA09 VDDIO E.9/A0.9/S0+1/S2+1/T0.1/T1.3/(A1.11)
19 PA10* VDDIO E.10/A0.10/S0.2/S2.2/T1.0/T0.2/G.4
20 PA11* VDDIO E.11/A0.11/S0.3/S2.3/T1.1/T0.3/G.5
23 PB10* VDDIO E.10/U1.0/T0.4/G.4/(S4.2/CAN1.TX)
24 PB11* VDDIO E.11/U1.1/T0.5/G.5/(S4.3/CAN1.RX)
25 PB12 VDDIO E.12/U0.0/T0.6/G.6/(S4+0)
26 PB13 VDDIO E.13/U0.1/T0.7/G.7/(S4+1)
27 PB14 VDDIO E.14/U1.0/G.0/(S4.2/CAN1.TX)
28 PB15 VDDIO E.15/U1.1/G.1/(S4.3/CAN1.RX)
29 PA12 VDDIO E.12/S2+0/T2.0/T0.6/C.0/(S4+0)
30 PA13 VDDIO E.13/S2+1/T2.1/T0.7/C.1/(S4+1)
35 PA16 VDDIO E.0/S1+0/S3+0/T2.0/T0.6/G.2
36 PA17 VDDIO E.1/S1+1/S3+1/T2.1/T0.7/G.3
37 PA18 VDDIO E.2/S1.2/S3.2/U4.0/T0.2/C.0
38 PA19 VDDIO E.3/S1.3/S3.3/U4.1/T0.3/C.1
39 PB16 VDDIO E.0/U2.0/T0.4/G.2/(S5+0)
40 PB17 VDDIO E.1/U2.1/T0.5/G.3/(S5+1)
41 PA20 VDDIO E.4/S3.2/U3.0/T0.6/G.4/(S5.2)
42 PA21 VDDIO E.5/S3.3/U3.1/T0.7/G.5/(S5.3)
43 PA22 VDDIO E.6/S3+0/U0.0/T0.4/G.6/(S5+0)
44 PA23 VDDIO E.7/S3+1/U0.1/T0.5/G.7/(S5+1)
45 PA24 VDDIO E.12/S3.2/U1.0/T1.2/C.2/(S5.2/CAN0.TX)
46 PA25 VDDIO E.13/S3.3/U1.1/T1.3/C.3/(S5.3/CAN0.RX)
 
端子一覧(SAMC2x, 32-64pin) 2020/7/15 追加
 SAMC2xE(32pin), SAMC2xG(48pin), SAMC2xJ(64pin)の端子配置を以下に示します。タッチ関係とカスタムロジック関係の機能は省略しています。
 
端子機能略号
 E.m   EXTINT[m]     外部割込み
 An.m  ADCn/AIN[m]    AD用アナログ入力
 Sn.m  SERCOMn/PAD[m] シリアルI/F(IC不可)
 Sn+m  SERCOMn/PAD[m] IC可能シリアルI/F
 Tn.m  TCCn/WO[m]    制御用途向きタイマ
 Un.m  TCn/WO[m]     基本タイマ
 Co.m  AC/CMP[m]     アナログコンパレータ出力
 Ci.m  AC/AIN[m]      アナログコンパレータ入力
 G.m   GCLK_IO[m]     汎用クロック入出力
 *印   High Sink端子(吸込電流増強端子)
 色はC21のみ
32pin 48pin 64pin 端子名 IO電源系 A:EIC B:A0 B:A1 B:Ci B:他 C:S D:S E:U/T F:T G:CAN H:Co/G その他
1 1 1 PA00 VDDANA E.0 S1.0 T2.0 Co.2 XIN32
2 2 2 PA01 VDDANA E.1 S1.1 T2.1 Co.3 XOUT32
3 3 3 PA02 VDDANA E.2 A0.0 Ci.4 VOUT
4 4 4 PA03 VDDANA E.3 A0.1/vrefA Ci.5
5 PB04 VDDANA E.4 A1.6
6 PB05 VDDANA E.5 A1.7 Ci.6
5 7 GNDANA
6 8 VDDANA
9 PB06 VDDANA E.6 A1.8 Ci.7 INN.2
10 PB07 VDDANA E.7 A1.9 INP.2
7 11 PB08 VDDANA E.8 A0.2 A1.4 INN.1 S4.0 U0.0
8 12 PB09 VDDANA E.9 A0.3 A1.5 INP.1 S4.1 U0.1
5 9 13 PA04 VDDANA E.4 A0.4 Ci.0 SDAvrefB S0.0 T0.0
6 10 14 PA05 VDDANA E.5 A0.5 Ci.1 S0.1 T0.1
7 11 15 PA06 VDDANA E.6 A0.6 Ci.2 INN.0 S0.2 T1.0
8 12 16 PA07 VDDANA E.7 A0.7 Ci.3 INP.0 S0.3 T1.1
9 VDDANA
10 GND
11 13 17 PA08 VDDIO NMI A0.8 A1.10 S0+0 S2+0 T0.0 T1.2
12 14 18 PA09 VDDIO E.9 A0.9 A1.11 S0+1 S2+1 T0.1 T1.3
13 15 19 PA10* VDDIO E.10 A0.10 S0.2 S2.2 T1.0 T0.2 G.4
14 16 20 PA11* VDDIO E.11 A0.11 S0.3 S2.3 T1.1 T0.3 G.5
17 21 VDDIO
18 22 GND
19 23 PB10* VDDIO E.10 S4.2 U1.0 T0.4 CAN1/TX G.4
20 24 PB11* VDDIO E.11 S4.3 U1.1 T0.5 CAN1/RX G.5
25 PB12 VDDIO E.12 S4+0 U0.0 T0.6 G.6
26 PB13 VDDIO E.13 S4+1 U0.1 T0.7 G.7
27 PB14 VDDIO E.14 S4.2 U1.0 CAN1/TX G.0
28 PB15 VDDIO E.15 S4.3 U1.1 CAN1/RX G.1
21 29 PA12 VDDIO E.12 S2+0 S4+0 T2.0 T0.6 Co.0
22 30 PA13 VDDIO E.13 S2+1 S4+1 T2.1 T0.7 Co.1
15 23 31 PA14 VDDIO E.14 S2.2 S4.2 U4.0 T0.4 G.0 XIN
16 24 32 PA15 VDDIO E.15 S2.3 S4.3 U4.1 T0.5 G.1 XOUT
33 GND
34 VDDIO
17 25 35 PA16 VDDIO E.0 S1+0 S3+0 T2.0 T0.6 G.2
18 26 36 PA17 VDDIO E.1 S1+1 S3+1 T2.1 T0.7 G.3
19 27 37 PA18 VDDIO E.2 S1.2 S3.2 U4.0 T0.2 Co.0
20 28 38 PA19 VDDIO E.3 S1.3 S3.3 U4.1 T0.3 Co.1
39 PB16 VDDIO E.0 S5+0 U2.0 T0.4 G.2
40 PB17 VDDIO E.1 S5+1 U2.1 T0.5 G.3
29 41 PA20 VDDIO E.4 S5.2 S3.2 U3.0 T0.6 G.4
30 42 PA21 VDDIO E.5 S5.3 S3.3 U3.1 T0.7 G.5
21 31 43 PA22 VDDIO E.6 S3+0 S5+0 U0.0 T0.4 G.6
22 32 44 PA23 VDDIO E.7 S3+1 S5+1 U0.1 T0.5 G.7
23 33 45 PA24 VDDIO E.12 S3.2 S5.2 U1.0 T1.2 CAN0/TX Co.2
24 34 46 PA25 VDDIO E.13 S3.3 S5.3 U1.1 T1.3 CAN0/RX Co.3
35 47 GND
36 48 VDDIO
37 49 PB22 C20:VDDIN
C21:VDDIO
E.6 S5.2 U3.0 CAN0/TX G.0
38 50 PB23 C20:VDDIN
C21:VDDIO
E.7 S5.3 U3.1 CAN0/RX G.1
25 39 51 PA27 VDDIN E.15 G.0
26 40 52 RESETN VDDIN RESETN
27 41 53 PA28 VDDIN E.8 G.0
28 42 54 GND
29 43 55 VDDCORE
30 44 56 VDDIN
31 45 57 PA30 VDDIN E.10 S1.2 T1.0 G.0 SWCLK
32 46 58 PA31 VDDIN E.11 S1.3 T1.1 SWDIO
59 PB30 VDDIN E.14 S5+0 T0.0 T1.2 Co.2
60 PB31 VDDIN E.15 S5+1 T0.1 T1.3 Co.3
61 PB00 VDDANA E.0 A1.0 S5.2 U3.0
62 PB01 VDDANA E.1 A1.1 S5.3 U3.1
47 63 PB02 VDDANA E.2 A1.2 S5.0 U2.0
48 64 PB03 VDDANA E.3 A1.3 S5.1 U2.1
  
端子一覧(SAMC2x, 100pin) 2020/1/6 追加
 SAMC20N/C21Nの端子配置を以下に示します。タッチ関係とカスタムロジック関係の機能は省略しています。
 
端子機能略号
 E.m   EXTINT[m]     外部割込み
 An.m  ADCn/AIN[m]    AD用アナログ入力
 Sn.m  SERCOMn/PAD[m] シリアルI/F(IC不可)
 Sn+m  SERCOMn/PAD[m] IC可能シリアルI/F
 Tn.m  TCCn/WO[m]    制御用途向きタイマ
 Un.m  TCn/WO[m]     基本タイマ
 Co.m  AC/CMP[m]     アナログコンパレータ出力
 Ci.m  AC/AIN[m]      アナログコンパレータ入力
 G.m   GCLK_IO[m]     汎用クロック入出力
 *印   High Sink端子(吸込電流増強端子)
 色はC21Nのみ
Pin 端子名 IO電源系 A:E B:A0 B:A1 B:Ci B:他 C:S D:S E:U F:T G:CAN H:Co/G その他
1 PA00 VDDANA E.0 S1.0 U2.0 Co.2 XIN32
2 PA01 VDDANA E.1 S1.1 U2.1 Co.3 XOUT32
3 PC00 VDDANA E.8 A0.8
4 PC01 VDDANA E.9 A0.9
5 PC02 VDDANA E.10 A0.10
6 PC03 VDDIO E.11 A0.11 S7.0 T2.0
7 PA02 VDDANA E.2 A0.0 Ci.4 VOUT
8 PA03 VDDANA E.3 A0.1/vrefA
9 PB04 VDDANA E.4 A1.6 Ci.5
10 PB05 VDDANA E.5 A1.7 Ci.6
11 GND
12 VDDANA
13 PB06 VDDIO E.6 A1.8 Ci.7 INN.2 S7.1
14 PB07 VDDIO E.7 A1.9 INP.2 S7.3 S7.2
15 PB08 VDDIO E.8 A0.2 A1.4 INN.1 S7.2 S7.3 U4.0
16 PB09 VDDANA E.9 A0.3 A1.5 INP.1 S4.1 U4.1
17 PA04 VDDANA E.4 A0.4 Ci.0 SDAvrefB S0.0 U0.0
18 PA05 VDDANA E.5 A0.5 Ci.1 S0.1 U0.1
19 PA06 VDDANA E.6 A0.6 Ci.2 INN.0 S0.2 U1.0
20 PA07 VDDANA E.7 A0.7 Ci.3 INP.0 S0.3 U1.1
21 PC05 VDDANA E.13 S6.3 T2.1
22 PC06 VDDANA E.14 S6.0
23 PC07 VDDANA E.15 S6.1
24 GND
25 VDDIO
26 PA08 VDDIO NMI A1.10 S0+0 S2+0 U0.0 T0.0
27 PA09 VDDIO E.9 A1.11 S0+1 S2+1 U0.1 T0.1
28 PA10* VDDIO E.10 S0.2 S2.2 U1.0 T0.2 G.4
29 PA11* VDDIO E.11 S0.3 S2.3 U1.1 T0.3 G.5
30 PB10* VDDIO E.10 S4.2 U5.0 T0.4 G.4
31 PB11* VDDIO E.11 S4.3 U5.1 T0.5 G.5
32 PB12 VDDIO E.12 S4+0 U4.0 T0.6 CAN1/TX G.6
33 PB13 VDDIO E.13 S4+1 U4.1 T0.7 CAN1/RX G.7
34 PB14 VDDIO E.14 S4.2 U5.0 CAN1/TX G.0
35 PB15 VDDIO E.15 S4.3 U5.1 CAN1/RX G.1
36 VDDIO
37 GND
38 PC08 VDDIO E.0 S6.0 S7.0
39 PC09 VDDIO E.1 S6.1 S7.1
40 PC10 VDDIO E.2 S6.2 S7.2
41 PC11 VDDIO E.3 S6.3 S7.3
42 PC12 VDDIO E.4 S7.0
43 PC13 VDDIO E.5 S7.1
44 PC14 VDDIO E.6 S7.2
45 PC15 VDDIO E.7 S7.3
46 PA12 VDDIO E.12 S2.0 S4.0 U2.0 T0.6 Co.0
47 PA13 VDDIO E.13 S2.1 S4.1 U2.1 T0.7 Co.1
48 PA14 VDDIO E.14 S2.2 S4.2 U3.0 G.0 XIN
49 PA15 VDDIO E.15 S2.3 S4.3 U3.1 G.1 XOUT
50 GND
51 VDDIO
52 PA16 VDDIO E.0 S1+0 S3+0 U2.0 T1.0 G.2
53 PA17 VDDIO E.1 S1+1 S3+1 U2.1 T1.1 G.3
54 PA18 VDDIO E.2 S1.2 S3.2 U3.0 T1.2 Co.0
55 PA19 VDDIO E.3 S1.3 S3.3 U3.1 T1.3 Co.1
56 PC16 VDDIO E.8 S6.0
57 PC17 VDDIO E.9 S6.1
58 PC18 VDDIO E.10 S6.2
59 PC19 VDDIO E.11 S6.3
60 PC20 VDDIO E.12
61 PC21 VDDIO E.13
62 GND
63 VDDIO
64 PB16 VDDIO E.0 S5+0 U6.0 G.2
65 PB17 VDDIO E.1 S5+1 U6.1 G.3
66 PB18 VDDIO E.2 S5.2 S3.2 G.4
67 PB19 VDDIO E.3 S5.3 S3.3 G.5
68 PB20 VDDIO E.4 S3.0 S2.0 G.6
69 PB21 VDDIO E.5 S3.1 S2.1 G.7
70 PA20 VDDIO E.4 S5.2 S3.2 U7.0 T2.0 G.4
71 PA21 VDDIO E.5 S5.3 S3.3 U7.1 T2.1 G.5
72 PA22 VDDIO E.6 S3.0 S5.0 U4.0 T1.0 CAN0/TX G.6
73 PA23 VDDIO E.7 S3.1 S5.1 U4.1 T1.1 CAN0/RX G.7
74 PA24 VDDIO E.12 S3.2 S5.2 U5.0 T2.0 CAN0/TX Co.2
75 PA25 VDDIO E.13 S3.3 S5.3 U5.1 T2.1 CAN0/RX Co.3
76 GND
77 VDDIO
78 PB22 VDDIO E.6 S0.2 S5.2 U7.0 T1.2 G.0
79 PB23 VDDIO E.7 S0.3 S5.3 U7.1 T1.3 G.1
80 PB24 VDDIO E.8 S0.0 S4.0 Co.0
81 PB25 VDDIO E.9 S0.1 S4.1 Co.1
82 PC24 VDDIO E.0 S0.2 S4.2
83 PC25 VDDIO E.1 S0.3 S4.3
84 PC26 VDDIO E.2
85 PC27 VDDIO E.3 S1.0
86 PC28 VDDIO E.4 S1.1
87 PA27 VDDIN E.15 G.0
88 RESETN VDDIN RESETN
89 PA28 VDDIN E.8 G.0
90 GND
91 VDDCORE
92 VDDIN
93 PA30 VDDIN E.10 S1.2 U1.0 G.0 SWCLK
94 PA31 VDDIN E.11 S1.3 U1.1 SWDIO
95 PB30 VDDIN E.14 S1.0 S5.0 U0.0 Co.2
96 PB31 VDDIN E.15 S1.1 S5.1 U0.1 Co.3
97 PB00 VDDANA E.0 A1.0 S5.2 U7.0
98 PB01 VDDANA E.1 A1.1 S5.3 U7.1
99 PB02 VDDANA E.2 A1.2 S5.0 U6.0
100 PB03 VDDANA E.3 A1.3 S5.1 U6.1

 
発振回路(SAMC2x) 2019/12/23 PLLステータスを修正
 SAMCには、高速発振器3種類、低速発振器3種類を搭載しています。
名称 用途 出力周波数 精度 消費電流[μA] (typ.は25℃時, max.は85℃時)
OSC48M 内部高速発振 3〜48MHz ±1%(0〜40℃), ±1.5%(-20〜85℃) 87typ., 174max.
FDPLL96M 逓倍発振(入力32k〜2MHz) 12〜96MHz 入力に依存 536typ.(48MHz), 970max.(96MHz)
XOSC 外部水晶発振(高速) 0.4〜32MHz 外部発振子に依存 260max.(4MHz), 321max.(8MHz), 699max.(16MHz), 1181max.(32MHz)。いずれもAGC=ON時
OSC32K 内部低速発振 32.768kHz ±2%(Ta25℃,5V), -22%〜14%(-40〜85℃, 2.7〜5.5V) 0.864typ., 1.08max.
OSCULP32K 内部超低電力発振 32.768kHz ±5.5%(Ta25℃,5V), -30%〜19%(-40〜85℃, 2.7〜5.5V) データシートE版にも記載無し
XOSC32K 外部水晶発振(低速) 32.768kHz 外部発振子に依存 1.528typ., 1.720max.

■OSC48Mの出力周波数は以下になります。リセット時はこの発振器が12分周(= 4MHz動作)で動作を開始し、CPUへクロック供給します。
   出力周波数 = 48MHz / n      [ただし n = 1〜16 (OSC48MDIVレジスタ設定値 + 1)]

■SAMC21でCANを使う場合は、経時変化込みで±0.5%以下の精度が必要なので外部水晶発振を使用します。この場合CPUクロックが32MHz超なら外部発振+逓倍を使うしか有りません。消費電流から見ると16MHz以下ならXOSCで直接発振、32MHz超ならXOSC32K+FDPLL96Mが良いでしょう。CPUクロックが16MHz〜32MHzの間は微妙でXOSCと(XOSC32K+FDPLL96M)のどちらが消費電流が小さいかはデータシートからは不明です。

■FDPLL96Mの逓倍率は、1/16単位で指定できます。整数部をLDR、分数部をLDRFRACとすると、
   発振周波数 = 入力周波数 x (LDR + 1 + LDRFRAC/16)   [ただし発振範囲は、48〜96MHz], [XOSC入力時は分周設定で2MHz以下にする]
   出力周波数 = 発振周波数 / n                  [ただし n = 1, 2, 4 のいずれか]
となります。入力32.768kHzの場合、96MHz発振なら理論誤差0で逓倍できます(LDR = 2928, LDRFRAC = 11)。48MHz発振時は21ppmの理論誤差が出ます(LDR = 1463, LDRFRAC = 14)。

■32k発振端子に注意
 SAMC2xのデータシート21.4項に「隣接端子によるジッターへの影響がある」ようなことが書かれています。SAME5xでは具体的にどの端子が対象になるか記載されていましたが、SAMC2xには記載がありません。とりあえず「隣」ということで、64pinならPB03, PA02を固定すれば良いと思います。ただしSAMC21ではPA02は唯一のVout端子のため、Vout使用時は固定できません。PA01は出力側なので影響は少ないと思いますが・・・

■キャリブレーション
 内部発振(OSC48M, OSC32K)を使用する場合は、プログラムでキャリブレーションが必要です。SAMC2xとSAMD2xではキャリブレーション・データが異なります。以下SAMC2xの場合です。
 (1)OSC48M
  SAMC2xでは5V用と3.3V用の調整データが用意されています。以下のように設定します(アドレスの意味は別項メモリ・アクセス参照)。
   @5V時: OSCCTRL->CAL48M.reg = ( *(long long*) 0x806020 >> 19) & 0x3FFFFF;
   A3.3V時: OSCCTRL->CAL48M.reg = ( *(long long*) 0x806020 >> 41) & 0x3FFFFF; あるいは( *(long*) 0x806024 >> 9) & 0x3FFFFF;
  ただし、「Rev D Siliconのみ可能」とデータシートに書かれています。手持ちのSAMC21で試したところ、0x806020に書かれているキャリブレーションデータは、5V用、3.3V用とも同じ値で、しかもOSCCTRL->CAL48M.regの初期値とも一致していました。たぶんRev Dではない ためでしょう。周波数誤差は5Vで−0.24%でした。

 (2)OSC32K
  SAMC2xでは以下のように設定します。
   OSC32KCTRL->OSC32K.bit.CALIB = ( *(long*) 0x806020 >> 12) & 0x7F;
  手持ちのチップで試したところ、キャリブレーション無しでは−3%の誤差だったのが、上記設定で+0.3%に改善しました。

■FDPLL96Mのステータスを読むには「先にクロック生成(GCLK)を設定する」→修正(2019/12/23)
 DPLLCTRLAレジスタの設定で、ONDEMAND(初期値1)を0にして、ENABLEすればPLLがすぐに動作します。ONDEMANDが1のままだと、どこか(GCLKとか)でこのクロックを使用しないとPLLが動作せず、したがってステータスが0のままになってしまいます。普通(他のマイコンでは)、PLLが安定した(ロックした)ことを確認してから使いますので、ONDEMANDの初期値が1というのはちょっと気持ち悪いです。もっとも世間ではロック確認しない人が多いのかもしれませんが…。

 
クロック生成 GCLK(SAMC2x) 2020/7/18 更新
 発振回路等→クロック生成器→各種周辺回路、および周辺回路アクセス用のバス・クロックの順でクロックを供給します(一部除く)。
 SAMCにはクロック生成器が9個あり、生成器0のみリセット後も動作します。他の生成器はリセットで停止します。
クロック・ソース選択 クロック生成器分周設定  クロック供給先(代表例)(詳細後述)
設定値 ソース名称 生成器番号 分周範囲 (補足2参照) リセット時  選択可能生成器 対象ブロック
0 XOSC 0 1/1〜1/n〜1/255,
1/2〜1/(2n+1)〜1/512
注意:速度を落としすぎると
デバッガが二度と反応しなく
なるかも?
OSC48M,
1/1, 動作
生成器0のみ CPU、バス等(MCLK:メインクロック・コントローラ)
1 クロック入力端子
(ポート)
1 1/1〜1/n〜1/65535,
1/2〜1/(2n+1)〜1/131072
 停止 生成器0〜8 周辺回路ch0:FDPLL96Mへのソースクロック
2 クロック生成器1
の出力
2 1/1〜1/n〜1/255,
1/2〜1/(2n+1)〜1/512
 停止    : (同上)   :
3 OSCULP32K 3  停止 生成器0〜8 周辺回路ch19:SERCOM0(シリアル・コミュニケーションI/F 0)
4 OSC32K 4  停止 生成器0〜8 周辺回路ch20:SERCOM1(シリアル・コミュニケーションI/F 1)
5 XOSC32K 5  停止    : (同上)   :
6 OSC48M 6  停止 生成器0〜8 周辺回路ch30:TC0, TC1(基本タイマ)
7 FDPLL96M 7  停止    : (同上)   :
8〜 予約 8  停止 無し(32k系発振回路直接) RTC, WDT(Watchdog Timer), EIC(External Interrupt Cont.)

注意1:CPUから周辺回路をアクセスするためのバスクロックの供給/停止の選択はMCLKにおいて行います(対象周辺回路ごと)。詳細後述。
注意2:CPUから周辺回路のレジスタをアクセスする場合に同期化処理が必要になる場合があります(詳細後述)
補足1:MCLK(メイン・クロック・コントローラ)内で、さらに1/1〜1/128分周が可能です。
補足2:分周範囲はGENCTRLn.DIVSELの設定により1/nか1/(2n+1)が選択可能ですが、1/(2n+1)の方はマニュアルに記載のない上限があります。上記上限はSAMC21で実測した結果です。生成器0を4MHz/512=7.8kHzに設定したらデバッガが反応しなくなりました(PICkit4, Snapとも)。

■パス・クロック供給(SAMC2x)
 CPUから周辺回路をアクセスするには、メインクロック・コントローラ(MCLK)のレジスタ設定が必要です。ただし一部の周辺回路はデフォルトでイネーブルになっています(下表*印)。
 なお下表のAxx.yyは実際には、MCLK->AxxMASK.bit.yyとコーディングします。 
bit 対象 bit 対象 bit 対象
AHB.HPB0_ *周辺バス・ブリッジA APBA.SUPC_ *電源供給制御 APBC.TC0_ 汎用タイマ0
AHB.HPB1_ *周辺バス・ブリッジB APBA.GCLK_ *クロック生成 APBC.TC1_ 汎用タイマ1
AHB.HPB2_ *周辺バス・ブリッジC APBA.WDT_ *ウォッチドッグ APBC.TC2_ 汎用タイマ2
AHB.DSU_ *デバイス・サービス・ユニット APBA.RTC_ *時計 APBC.TC3_ 汎用タイマ3
AHB.HMATRIXHS_ *バスマトリクス APBA.EIC_ *外部割込制御 APBC.TC4_ 汎用タイマ4
AHB.NVMCTRL_ *フラッシュ制御 APBA.FREQM_ *周波数計 APBC.ADC0_ AD変換0
AHB.HSRAM_ *RAM制御 APBA.TSENS_ 温度計 APBC.ADC1_ AD変換1
AHB.DMAC_ *DMAC APBB.PORT_ *ポート APBC.SDADC_ 高精度AD変換
AHB.CAN0_ CAN0 APBB.DSU_ *デバイス・サービス・ユニット APBC.AC_ コンパレータ
AHB.CAN1_ CAN1 APBB.NVMCTRL_ *フラッシュ制御 APBC.DAC_ DA変換
AHB.PAC_ *周辺アクセス保護 APBB.HMATRIXHS_ バスマトリクス APBC.PTC_ タッチ制御
AHB.???? *「ピカチュウ」って何? APBC.EVSYS_ イベント制御 APBC.CCL_ カスタム・ロジック
AHB.DIVAS_ *除算器 APBC.SERCOM0_ シリアル通信0 APBD.SERCOM6_ シリアル通信6
APBA.HPB3_ 周辺バス・ブリッジD(注意3) APBC.SERCOM1_ シリアル通信1 APBD.SERCOM7_ シリアル通信7
APBA.PAC_ *周辺アクセス保護 APBC.SERCOM2_ シリアル通信2 APBD.TC5_ 汎用タイマ5
APBA.PM_ *パワー管理 APBC.SERCOM3_ シリアル通信3 APBD.TC6_ 汎用タイマ6
APBA.MCLK_ *メインクロック制御 APBC.SERCOM4_ シリアル通信4 APBD.TC7_ 汎用タイマ7
APBA.RSTC_ *リセット制御 APBC.SERCOM5_ シリアル通信5
APBA.OSCCTRL_ *高速発振器制御 APBC.TCC0_ 制御向きタイマ0
APBA.OSC32KCTRL_ *低速発振器制御 APBC.TCC1_ 制御向きタイマ1
APBC.TCC2_ 制御向きタイマ2
(注意3)SAMC21E/G/JにはブリッジDが無いので*印をつけていませんが、SAMC21Nなら*かも(未確認)

■クロック供給先一覧(SAMC2x)
 GCLK->PCHCTRL[周辺ch番号].bit.GEN に供給元の生成器番号を設定し、
 GCLK->PCHCTRL[周辺ch番号].bit.ENABLE を1にすれば供給します。
ch番号(定義名) 供給先 ch番号(定義名) 供給先 ch番号(定義名) 供給先
0 FDPLL96Mリファレンス入力 16 イベント・チャネル10 32 汎用タイマ4
1 FDPLL96M 32kHzクロック 17 イベント・チャネル11 33 AD変換0
2 外部割込制御 18 シリアル通信0〜3の低速用(*) 34 AD変換1
3 周波数計(測定用) 19 シリアル通信0(コア) 35 高精度AD変換
4 周波数計(参照用) 20 シリアル通信1(コア) 36 DA変換
5 温度計 21 シリアル通信2(コア) 37 タッチ制御
6 イベント・チャネル0 22 シリアル通信3(コア) 38 カスタム・ロジック
7 イベント・チャネル1 23 (注意4) 39
8 イベント・チャネル2 24 シリアル通信5の低速用(*) 40 コンパレータ
9 イベント・チャネル3 25 シリアル通信5(コア) 41 シリアル通信6(コア)
10 イベント・チャネル4 26 CAN0 42 シリアル通信7(コア)
11 イベント・チャネル5 27 CAN1 43 汎用タイマ5
12 イベント・チャネル6 28 制御向きタイマ0,1 44 汎用タイマ6
13 イベント・チャネル7 29 制御向きタイマ2 45 汎用タイマ7
14 イベント・チャネル8 30 汎用タイマ0,1
15 イベント・チャネル9 31 汎用タイマ2,3
(注意4)たぶん23は「シリアル通信4(コア)」であり、18の対象はSERCOM0〜4と思います(未確認)
*:シリアル通信の低速用は、I2Cの特定機能で使用(例えばSMBusタイミング)。

■レジスタ・アクセスの同期化処理
 周辺回路の一部のレジスタは、CPUバスからアクセスする場合に同期化処理が必要になります(CPUバスと周辺クロックの違いにより)。
 (1)書き込み時
   各周辺レジスタの中でレジスタのPropertyにWrite-Syncronizedと書かれているものは、
  同期待ち(Synchronization Busy)レジスタの対応フラグが1の間は「書き換え中」なのでアクセスしてはいけません。
   例えば、SERCOM USARTのCTRLBレジスタの中にRXEN(受信許可)、TXEN(送信許可)のビットがありますが、
  これをビット・アクセスで連続して書き換えるのはNGです。一般的には、ビットアクセスではなく、ワードアクセスでRXEN,TXENを同時に書き換えればよいのですが、
  何かの事情でどうしても1ビットづつ書き換えたい場合は、ビジーフラグが0になってから次のアクセスします。
     例(この例は例外だが、他のレジスタでは必要になる場合があるかも):
        SERCOM1->USART.CTRLB.bit.RXEN = 1;
        while (SERCOM1->USART.SYNCBUSY.bit.CTRLB);
        SERCOM1->USART.CTRLB.bit.TXEN = 1;

 (2)読み出し時
   レジスタのPropertyにRead-Synchronizedと書かれているものは、このレジスタの読み出しに先だって「読み出し要求(作法は周辺回路による)」を行って、
  同期待ち(Synchronization Busy)レジスタの対応フラグが0に戻ってから読み出しを行います。
     例(カウンタ値の読み出し):
        TC0->COUNT16.CTRLBSET.bit.CMD = 4;  //カウント値の読み出し要求.
        while (TC0->COUNT16.SYNCBUSY.bit.COUNT);
        (格納先) = TC0->COUNT16.COUNT.reg;
 
UART(SAMC2x ,D21、D51、E5x) 2020/10/25 更新
 SERCOM(シリアル・コミュニケーション・インタフェース)は、UART(全二重、1線式、RS-485自動制御), SPI(アドレス付きも可), I2Cとして使えます。
 さらにSAMC2xの場合はLIN(マスター、スレーブ)もサポートされています(SAMD21に対してCTRLCレジスタ追加)。
 以下、UARTの場合の機能を記載します。なお、端子SERCOMn/PAD[m]をSn.mと略記します。

■端子設定
(1)受信端子:Sn.0〜Sn.3のどの端子でも受信に設定できます。送信端子と同一端子を設定して半二重通信を行うことも可能と思います。
(2)送信端子、制御端子:下表の組み合わせになります。ただしSAMD51/SAME5xの場合、0x1の設定は無効です。
TXPO設定値 用途 Sn.0端子 Sn.1端子 Sn.2端子 Sn.3端子
0x0 ハードウエア・フロー制御無し 送信端子 −(同期モード時はクロック入出力)
0x1 ハードウエア・フロー制御無し 送信端子 −(同期モード時はクロック入出力)
0x2 ハードウエア・フロー制御有り 送信端子 RTS出力 CTS入力
0x3 RS-485 送信自動切り替え 送信端子 −(同期モード時はクロック入出力) TE出力

■その他便利な機能
 半二重通信に便利な衝突検出機能をサポートしています。送信が動作している時だけ受信側が自動的に衝突検出モードになり、受信データとしては扱いません。

■ボーレート設定
 生成方法としてArithmetic、Fractionalが選択できます(CTRLAレジスタSAMPRビットで選択)。ただし旧版ドキュメントの本文にはArithmeticしか説明がありませんでした。とりあえずArithmeticのみ記載します。
 Arithmetic計算式
   設定値BAUD = 65536 x (1 - 16 x 目標ボーレート / 供給クロック)
   実ボーレート = 供給クロック x トータルbit長 / INT( 供給クロック x トータルbit長 / 目標ボーレート)
            [トータルbit長にはスタートbit、ストップbit, パリティありならパリティbitを含みます]
            [1フレームが供給クロックの整数サイクル倍になる必要があるので上式となります]

 代表的なボーレートと設定値、誤差を下表に示します。誤差はトータルbit長が10〜12bit範囲の場合のワースト値です。他の周波数はSAMCボーレート設定(エクセル)で計算できます。
ボーレート 48MHz時 32MHz時 24MHz時 16MHz時 12MHz時 8MHz時
300 65,529 / 0.00% 65,526 / 0.00% 65,522 / 0.00% 65,516 / 0.00% 65,509 / 0.00% 65,496 / 0.00%
1,200 65,509 / 0.00% 65,496 / 0.00% 65,483 / 0.00% 65,457 / 0.00% 65,431 / 0.00% 65,378 / 0.00%
9,600 65,326 / 0.00% 65,221 / 0.00% 65,116 / 0.00% 64,906 / 0.00% 64,697 / 0.00% 64,277 / 0.01%
14,400 65,221 / 0.00% 65,064 / 0.00% 64,906 / 0.00% 64,592 / 0.00% 64,277 / 0.01% 63,648 / 0.01%
19,200 65,116 / 0.00% 64,906 / 0.00% 64,697 / 0.00% 64,277 / 0.01% 63,858 / 0.00% 63,019 / 0.02%
38,400 64,697 / 0.00% 64,277 / 0.01% 63,858 / 0.00% 63,019 / 0.02% 62,180 / 0.01% 60,502 / 0.03%
57,600 64,277 / 0.01% 63,648 / 0.01% 63,019 / 0.02% 61,761 / 0.03% 60,502 / 0.03% 57,986 / 0.06%
115,200 63,019 / 0.02% 61,761 / 0.03% 60,502 / 0.03% 57,986 / 0.06% 55,469 / 0.07% 50,436 / 0.12%
230,400 60,502 / 0.03% 57,986 / 0.06% 55,469 / 0.07% 50,436 / 0.12% 45,403 / 0.16% 35,337 / 0.25%
460,800 55,469 / 0.07% 50,436 / 0.12% 45,403 / 0.16% 35,337 / 0.25% 25,270 / 0.16% 5,138 / 0.51%
921,600 45,403 / 0.16% 35,337 / 0.25% 25,270 / 0.16% 5,138 / 0.51%

■レジスタ設定例 2019/8/14 追加
 全般的な設定手順は後述「各周辺の設定手順概要」を参照してください。以下、UART固有部分の設定例を示します。
  ・SERCOM1->USART.BAUD.reg = 上述のボーレート設定値;
  ・SERCOM1->USART.CTRLA.bit.DORD = 1; //LSB firstに設定.
  ・SERCOM1->USART.CTRLA.bit.TXPO = 0x00 (通常) または 0x03 (RS485ドライバICの送信イネーブル信号を自動制御);
  ・SERCOM1->USART.CTRLA.bit.RXPO = 0x01;//受信ポート指定.
  ・SERCOM1->USART.CTRLA.bit.MODE = 0x01;//UARTモード指定.
  ・SERCOM1->USART.CTRLB.bit.COLDEN = 1; // コリジョン検出(半二重UARTもしくはRS485において、自動衝突検知を行う場合に指定).
  ・SERCOM1->USART.CTRLC.bit.GTIME = 1; // ガード時間(RS485の送信完了後に送信イネーブルを保持する時間を1ビット時間単位で指定).
  ・SERCOM1->USART.CTRLA.bit.ENABLE = 1; //動作開始.
  ・SERCOM1->USART.CTRLB.reg |= SERCOM_USART_CTRLB_RXEN;//受信開始. または
                        SERCOM_USART_CTRLB_RXEN | SERCOM_USART_CTRLB_TXEN;//送受信開始
     注:送信開始を単独で分ける場合は十分な時間を置くか、SERCOM1->USARTSYNCBUSY.bit.CTRLBが0になるのを待ちます。
 以降、送受信を割込みで処理する場合は、割込み許可します(SERCOMレジスタおよびNVICレジスタともに)。
  ・SERCOM1->USART.INTENSET.reg = UART_RX_INT; //受信割込みイネーブル.
  ・SERCOM1->USART.INTENSET.reg = UART_TX_INT; //送信割込みイネーブル.
 NVICの設定は「各周辺の設定手順概要」を参照してください。
 割込み処理ルーチン
   void SERCOM1_Handler(void) { //注:SAMD51/SAME5xはハンドラが送信バッファ空、受信完了など4つに細分化されています(SERCOMn_x_Handler  xは0,1,2,OTHERの4種類)。
      受信割込みフラグ、受信エラーフラグ、送信割込みフラグを判定して、それぞれ処理します。
   }
基本タイマ(SAMC2x, D21、D51、E5x) 2020/10/25 更新
 TC(Timer/Counter)は、1ユニットで8bitカウンタまたは16bitカウンタ、連続する2ユニットで32bitカウンタとして使用できます。
 SAMC2xとSAME5xはレジスタ内容がほぼ同じで、コンペアレジスタ(CC)のダブルバッファ用レジスタも装備しています。SAMD21はコンペアレジスタはシングルなので更新には注意が必要な場合があります。またSAMD21は波形生成設定用のレジスタが独立していないとか、リードリクエストをアドレス指定する必要があるなど、使用方法がSAMC2x/SAME5xと若干異なります。
 以下、16bitカウンタ時の代表的機能を記載します。なお、端子TCn/WO[m]をUn.mと略記します。
■ユニット構成
 16bitカウンタ1本、比較/捕捉レジスタ2本(CC0, CC1)を備えています。さらにSAMC2x/SAMD51/SAME5xは書き込みバッファ2本(CC0用,CC1用)も備えています。

■端子設定
用途 動作(カウンタはアップカウント時) Un.0端子 Un.1端子
方形波出力(MFRQモード) CC0に周期(クロック数/2-1)を指定。カウンタとCC0の一致で出力反転 方形波出力
PWM出力(MPWMモード) CC0に周期(クロック数-1)、CC1にデューティ(クロック数)を設定。CC0一致,CC1一致で出力反転 PWM出力
イベント時刻取得 フリーラン・カウント値をイベント検出時に捕捉
パルス幅測定(C2x:PWモード) 片エッジでカウント開始、他方のエッジでカウントを停止して値を捕捉
PWM測定(PWP/PPWモード) デューティをCC0、周期をCC1で捕捉(PWPモード)。CC0,CC1を逆にすることも可能(PPWモード)

■カウント方向
 アップでもダウンでも選択可能です。多くの場合アップカウントの方がファーム設計が楽になります。
 アップカウントで周期変更を行う場合、現在カウンタ値より小さい値を周期として即時反映するとオーバーランが生じます。SAMC2xではダブルバッファ・モードを指定して、次の周期から値が有効になるようにできます。SAMD21はダブルバッファができないため、ゼロクリアによる割込み後に周期変更するか、ダウンカウントに変更します。

■プリスケーラ
 1/1, 1/2, 1/4, 1/8, 1/16, 1/64, 1/256, 1/1024の8種類が選択可能です。

カウント値の読み取り不具合? 2020/10/25 追記
 SAMC21/SAME54ではCTRLBSETレジスタでカウント読み出しのコマンドをセットし、SYNCBUSYレジスタのCOUNTフラグがクリアされるのを監視するだけで良いと思っていました。実際に読み出し値を時系列的に確認したところ、誤リードする(読み出し値が不正になる)場合があるようです。とりあえず以下の方法なら誤リードが無いことを確認しました。
  @コマンド発効後、SYNCBUSY.CTRLBがクリアされるまで待つ。
  ACTRLBSETレジスタのコマンドがクリアされるまで待つ(動作完了で自動クリアのため)。
  BSYNCBUSY.COUNTがクリアされるまで待つ。
 カウンタのクロックが低速の場合は単純ループだとかなりかかるので別途読み取り用タイマで一定時間後に割込みしてチェックするのが良いかもしれません。
 
制御向きタイマ(SAMC2x, D21) 2020/7/18 更新
 基本タイマの機能を強化したタイマです。タイマ番号によりbit数や機能が異なります。SAMC2xにはTCC0〜2の3本、SAMD21にはTCC0〜3の4本あります。SAMCとSAMDではコンペア用バッファ・レジスタの名称が異なるなど微妙な違いがあります。
TCC番号 カウントbit数 制御端子数 故障検出によるドライバ保護 ディザ機能 デッドタイム挿入 パターン生成
0 24 8 有り 有り 有り 有り
1 24 4 有り 有り 有り
2 16 2 有り
3 24 8 有り 有り 有り 有り

 
フラッシュ(SAMC2x, D21) 2019/4/21 追加
 SAMC2x, D2xのフラッシュのウエイト数に対する最大動作速度[MHz]を下表に示します。
デバイス (電圧) wait0 wait1 wait2 wait3
SAMC2x (4.5V未満) 19 38 48 -
SAMC2x (4.5V以上) 20 38 48 -
SAMD2x (2.7V以下) 14 28 42 48
SAMD2x (2.7V以上) 24 48 - -

 耐久性は、書き込み回数 25,000回(min)、25,000回書き込み後の保持年数10年(min)、100回書き込み後の保持年数25年(min)です。
 書込/消去の速度は、ページ書込2.5ms(max)、行消去6ms(max)、チップ消去はSAMC2xが260ms(max)、SAMD2xが240ms(max)です。

 
データフラッシュ(SAMC2x, D21) 2020/7/18 更新
 SAMC2xおよびSAMD21(バリエーションB/C/D/L)にはデータ専用フラッシュ領域があります。
■アドレス0x40 0000〜。ページサイズ(書き込み単位)=64バイト、ロウサイズ(消去単位)=256バイトです。(サイズは機能比較に記載)
■NVMCTRL.CTRLA.CMDに設定するコマンドに、このエリア専用のコマンドが追加されています。0x1A:データフラッシュ領域の消去、0x1C:データフラッシュ領域のマニュアル書き込み。
■フラッシュ領域へライトしたデータはいったんページバッファに保存されます。保存されたデータは書き込みコマンドの発行でフラッシュに書き込まれます(マニュアルモード時)。
■注意:消去コマンド実行前に設定する対象アドレスですが、アドレス・レジスタ(NVMCTRL->ADDR)にはバイトアドレスではなくハーフワードアドレス(16bit単位アドレス)を設定する必要があります。ADDRを間接的に設定する場合はバイトアドレスで行えます。
 (直接法) NVMCTRL_ADDR = 対象アドレス >> 1;   →バイトアドレスを1ビットシフトする必要があります。
 (間接法) *(long*)(対象アドレス) = 0;          →バイトアドレスで指定します。
■書き込みや消去の完了は、NVMCTRL.INTFLAG.READYで判定します("1"で完了)。READYビットはINTFLAGレジスタ(割込み要求レジスタ)に割り当てられていますが、フラグクリアはできません。つまりREADYビットは最新状態を示すステータス・フラグの扱いとなっています。なおデータフラッシュの書き込み中/消去中でもプログラム領域の読み出しは可能なので、コマンド発行後にプログラムが停止(完了待ち)することはありません。
■電気特性は通常のフラッシュと変わりありません。
 
CAN(SAMC21) 2020/2/4 追加
 SAMC21はCANが使用できます(32pinは1ch, 48pin以上は2ch)。以下、クラシックCAN(非CAN FD)でID長が11ビットの場合について説明します。
■CANの初期化手順例(ch毎)
 (1)RAM上に、下記領域を配置します。
    ・受信IDフィルタ領域(格納対象となるIDと格納先を指定したリスト)
    ・受信データ領域(必要に応じて受信FIFO0、受信FIFO1、特定受信バッファの3領域)
    ・送信データ領域(領域としては1つ。領域内をFIFOまたはキューのどちらかと特定送信バッファの組み合わせでも構成可能)
    ・送信履歴領域(省略可能)
   C言語的にはそれぞれの領域の要素構造体の配列として定義しておけばよいです(要素構造体の内容は後述)。
   受信IDフィルタ領域は初期値付き構造体配列にしておきます(フラッシュには配置できません)。
 (2)CANのレジスタ設定を行います(GCLK,バスクロック,ポート,等の設定は済んでいること→各周辺の設定手順概要)。
   @レジスタ設定を行うには、まず書き換え許可のためCCCR.INIT=1, CCCR.CCE=1にします。
    必ずCCCRをリードして、CCCR.INIT=1, CCCR.CCE=1を確認します。
   A必要に応じてCCCRレジスタの他のビットを設定します。
      DARビット:指定IDの受取り手が無い場合(NO ACK)や、他ノード送信と衝突した場合など、
             正常に送信できなくても再送しない(送信できたことにする)場合は1にします。
      TXPビット:連続送信する場合に送信間隔を2ビット分空ける場合は1にします。
             1を設定すると他ノード送信との衝突を回避しやすくなるようです(ch0とch1を繋いでテストした結果より)。
      MONビット:監視モードにする場合(ACK応答しない場合)は1にします。
   Bビットレートに応じてDBTPレジスタ、NBTPレジスタを設定します。
    クロックソース8MHz, ビットレート500kbpsの場合は、デフォルト値のままで動作します。
   CRAMに配置した各領域の先頭アドレスおよび配列要素数をレジスタに設定します(使用しない領域は省略します)。
      SIDFCレジスタ:受信IDフィルタ領域の先頭アドレス(下位16ビット)および配列要素数(最大128)を設定します。
      RXF0Cレジスタ:受信FIFO0の領域先頭アドレス(下位16ビット)およびパケット数(最大64)、などを設定します。
      RXF1Cレジスタ:受信FIFO1の領域先頭アドレス(下位16ビット)およびパケット数(最大64)、などを設定します。
      RXBCレジスタ:特定受信バッファ領域先頭アドレス(下位16ビット)を設定します。
      TXEFCジスタ:送信履歴領域先頭アドレス(下位16ビット)および履歴件数(最大32)、などを設定します。
      TXBCレジスタ:送信データ領域先頭アドレス(下位16ビット)およびFIFO/キューのパケット数、特定送信バッファの
               パケット数を設定します。パケット数の合計は32が限度です。
   D必要に応じて割込み関係やタイムスタンプ等のレジスタを設定します。
   ECCCR.INIT=0でCAN通信動作を開始します(受信IDフィルタは初期値設定済みであること)。
■各領域の要素
 (1)受信IDフィルタ領域(詳細はデータシート34.9.5参照)
   1要素がID(その2)、ID(その1)、受信データの格納先領域、IDの判別方法、からなる合計32ビットの構造体です。
   ・格納先が特定受信バッファの場合は、ID(その1)に受信対象ID、ID(その2)にバッファ要素番号(0-63)を
    指定します。実際に使う最大のバッファ要素番号が格納できるだけの領域が確保されている必要があります。
   ・格納先が受信FIFO0またはFIFO1の場合、IDの判別方法として以下の3種類を指定できます。
     @範囲指定:ID(その1)以上、ID(その2)以下
     A2値指定:ID(その1)またはID(その2)
     Bマスキング指定:ID(その2)でマスク値を指定、ID(その1)で比較IDを指定します。
   ・フィルタは要素番号の若い順に判定して、最初にID条件が合致した時点で指定動作になります。
 (2)受信データ領域(詳細はデータシート34.9.2参照)
   1要素に1パケットの情報が格納されます。
     最初の32ビット:ID等。ただし、11ビットIDの場合は上詰めでID[28:18]に格納されます。
     次の32ビット:データ長やタイムスタンプ等。
     以降はデータ8バイト(クラシックCANは8バイト固定)。
 (3)送信データ領域(詳細はデータシート34.9.3参照)
   受信の場合と大体同じような構成です。従って、11ビットIDは上詰めでID[28:18]に格納します。
 (4)送信履歴領域(詳細はデータシート34.9.4参照)
   1要素64ビットです。送信データ要素の先頭64ビットに時刻や事象種別が取り込まれています。
   事象種別は正常完了時はTXE(=0x1)、手動キャンセルやCCCR.DAR==1の場合はTXC(=0x2)となります。
■受信方法
 (1)受信FIFOn(n=0または1)
   @RXFnS.FnFLが受信済みパケット数を示すので、これが1以上ならデータの引き取りを行います。
   ARXFnS.FnGIが読み出すべき配列要素番号を示すので、これに基づいてパケットデータを読み出します。
   BRXFnS.FnGIの値をRXFnS.FnAIに格納するとRXFnS.FnGIが更新されます。
 (2)特定受信バッファ
   @受信データが格納されるとNDAT1(バッファ要素番号0-31に対応)、NDAT2(同32-63に対応)、
    の該当ビットが1になります。
   ANDAT1/NDAT2の該当ビットが1のままだと同じIDのパケットが到着しても更新されないので、
    更新が必要であれば該当ビットだけが1のデータをNDAT1あるいはNDAT2に書き込みます(1書き込みでクリア)
■送信方法
 (1)FIFOまたはキュー
   @TXFQS.TFFLが書き込み可能パケット数を示すので、1以上であれば書き込み可能です。
   ATXFQS.TFQPIが書き込むべき配列要素番号を示すので、これに基づいてパケットデータを書き込みます。
   BTXBAR = 1 << TXFQS.TFQPI; を実行するとパケットが追加され、TXFQS.TFQPIが更新されます。
 (2)特定送信バッファ
   @自分で紐づけたバッファ要素番号のところへパケットデータを書き込みます。
   ATXBAR = 1 << 当該要素番号; を実行すると送信要求が追加されます。
   B送信が成功するとTXBTOレジスタの該当ビットが1になります。
    CCCR.DAR==1の場合は、送信成功時はTXBTOレジスタの該当ビットが1になり、
    エラーがあった場合は、TXBCFレジスタの該当ビットが1になります。
■送信優先順位
 (1)FIFOまたはキューのみの場合
   FIFOは登録順に送信されます。キューは登録済みの中でIDが一番若いものが送信されます。
   キューに同一IDが2つ以上登録されていた場合は、要素番号の若い方が送信されます。
 (2)特定送信バッファのみの場合
   送信要求済みの中でIDが一番若いものが送信されます。同一IDがある場合は、要素番号の若い方が送信されます。
 (3)特定送信バッファ+FIFOまたはキューの場合
   特定送信バッファ内の送信すべきIDと、FIFOまたはキュー内の送信すべきIDが比較され、
   IDが若い方が送信されます。
 
ADC(SAMC2x, D21) 2021/7/16 更新
 SAMC2xとSAMD21とではアナログ入力範囲やVref入力範囲が異なります。
 SAMC2xは0〜VDDANA範囲のアナログ入力が出来ますが(リファレンスとしてVDDANA選択時)、SAMD21はVref端子にVDDANA-0.6Vを入力した場合が範囲最大(0〜VDDANA-0.6V)となります(Gain=1設定時)。
 SAMD21で0〜VDDANA範囲のアナログ入力をするには、INPUTCTRL.GAIN設定を0.5とし、リファレンスをVDDANA/2とします。
項目 SAMC2x SAMD21
リファレンス選択 1.024V
2.048V
4.096V
VDDANA/1.6
VDDANA/2
VDDANA
VrefA入力電圧
1.0V
VDDANA/1.48
VDDANA/2
VrefA入力電圧
VrefB入力電圧
Vref端子入力範囲 2〜VDDANA-0.6V 1.0〜VDDANA-0.6V
 
メモリマップ(SAMC2x, D21) 2020/7/18 更新
■リトル・エンディアン
■I/Oポートも1クロック・アクセス
■メモリ・マップ(コア機能以外も含む。SAMC20/C21 E:32pin, G:48pin, J:64pin, N:100pin、SAMD21
アドレス範囲 区分 アドレス 用途 C20
EGJ
C21
EGJ
C20
N
C21
N
D21
EGJ
0〜  内蔵フラッシュ  0〜 ベクタ・テーブル(詳細次表)、プログラム・コード
0x0040 0000〜 不揮発データ(実体)
0x0080 4000〜 先頭2ワードはパワーオン時自動反映
0x0080 6020〜 SAMC2x:ADC,OSC32K,OSC48M調整データ
SAMD21:ADC,OSC32K,USB,DFLL48M調整データ
読取って設定のこと
0x0080 6030〜 TSENS調整データ
読取って設定のこと
0x0080 A00C,
0x0080 A040〜
シリアル番号(128bit)
0x2000 0000〜 内蔵RAM 0x2000 0000〜 内蔵RAM
0x4000 0000〜 周辺ブリッジA 0x4000 0000〜 SAMC2x:PAC, PM, MCLK, RSTC
SAMD21:PAC0, PM, SYSCTRL, GCLK
0x4000 1000〜 SAMC2x:OSCCTRL, OSC32KCTRL, SUPC, GCLK
SAMD21:WDT, RTC, EIC
0x4000 2000〜 WDT, RTC, EIC, FREQM
0x4000 3000〜 TSENS
0x4100 0000〜 周辺ブリッジB 0x4100 0000〜 SAMC2x:PORT, DSU, NVMCTRL, DMAC, MTB
SAMD21:PAC1, DSU, NVMCTRL, PORT, DMAC, USB, MTB
0x4200 0000〜 周辺ブリッジC 0x4200 0000〜 SAMC2x:EVSYS, SERCOM0〜SERCOM3
SAMD21:PAC2, EVSYS, SERCOM0〜SERCOM2
0x4200 1400〜 SAMC2x:SERCOM4, SERCOM5
SAMD21:SERCOM3, SERCOM4
0x4200 1C00〜 SAMC2x:CAN1, CAN2
SAMD21:SERCOM5, TCC0
0x4200 2400〜 SAMC2x:TCC0〜TCC2, TC0〜TC4, ADC0
SAMD21:TCC1〜TCC2, TC3〜TC7, ADC, AC
0x4200 4800〜 SAMC2x:ADC1, SDADC
SAMD21:DAC,PTC
0x4200 5000〜 SAMC2x:AC
SAMD21:I2S
0x4200 5400〜 SAMC2x:DAC
SAMD21:AC1
0x4200 5800〜 SAMC2x:PTC, CCL
SAMD21:reserved, TCC3
0x4300 0000〜 周辺ブリッジD 0x4300 0000〜 SERCOM6, SERCOM7, TC5〜TC7
0x4800 0000〜 追加演算器 0x4800 0000〜 除算器、平方根器
0xE000 0000〜 コア内機能 0xE000 0000〜 システム制御、システム・タイマ、多重割込み制御
(32bitアクセスのみ可能)

■ベクター・テーブル
テーブル先頭からの
オフセット(ワード単位)
内容
0 リセット時のスタック・ポインタのロード値
1 リセット
2 NMI
3 ハード不良検出
4-10 予約
11 SVCall
12-13 予約
14 PendSV
15 システム・タイマ
16 多重割込み(NVIC)0 以下詳細は「多重割込制御」参照
17 多重割込み1
47 多重割込み31
割込みには、15クロック程度かかるようです。ハードウエアでスタックへ自動退避されるのは戻りアドレス、ステータス・レジスタの他に6本(R0〜R3,R12,R14(リンクレジスタ))あります。

 
システム・タイマ SysTick(SAMC2x, D21, L1x, D5x, E5x) 2020/10/10 更新
 24bitインターバル・タイマをコア内に持っています。レジスタ・アクセスは32bitで行います。
アドレス 名称 内容 初期値 詳細
0xE000 E018 SYST_CVR カウント値 不定 カウントが許可されるとシステム・クロックでダウン・カウントし、0になったら割込みを発生し、次にリロード値を読み込みます。
カウンタへは何を書いても0となり、かつ下記のカウント0検出もクリアされますが、この場合割込みは発生しません。
0xE000 E014 SYST_RVR リロード値 不定
0xE000 E010 SYST_CSR カウント制御 たぶん
0x04
bit0:1でカウント許可
bit1:1で割込み許可(たぶん)
bit2:1でクロック・ソースがCPUクロックとなります(たぶん変更できない)。
bit16:ダウン・カウントで0になったら1が立ちます。SYST_CSRを読むと自動的にクリアされます(書き込みではクリアしません)。
0xE000 ED04 ICSR 割込み制御 0 bit26, bit25がシステム・タイマに関係します。
リード: if (ICSR & (1 << 26)) なら割込み発生中、elseなら発生していないです。
ライト: (1 << 26)を書込むと強制的に割込み発生、 (1 << 25)を書込むと割込みクリアします。
0xE000 ED20 SHPR3 割込み優先度 0 ■SAMC2x, D21, L1x
bit31-30がシステム・タイマの優先度です。00が高優先、11が低優先です。
書換える場合は、bit31-30だけ書き換えます(レジスタ定義情報でビットフィールド定義があるかは未調査)。
■SAMD5x, E5x
bit31-29がシステム・タイマの優先度です。000が高優先、111が低優先です。
書換える場合は、bit31-29だけ書き換えます(レジスタ定義情報でビットフィールド定義があるかは未調査)。

 
多重割込制御 NVIC(SAMC2x, D21) 2020/7/18 更新
■32要因の割込み入力があります。
■制御レジスタ(32bitアクセスのみ可)は合計12本あります。NVIC_ISER〜NVIC_ICPRはレジスタのbit0〜bit31が割込み要因0〜31に対応しています。
アドレス 名称 内容 初期値 詳細
0xE000 E100 NVIC_ISER 割込み許可 0 リード:割込み許可状態を読み取れます。
ライト:1を立てたbitに対応した割込みを許可します。0のbitは許可/禁止状態を変更しません。
0xE000 E180 NVIC_ICER 割込み禁止 0 ライト:1を立てたbitに対応した割込みを禁止します。0のbitは許可/禁止状態を変更しません。
0xE000 E200 NVIC_ISPR 割込み発生 0 リード:割込み発生状態を読み取れます。
ライト:1を立てたbitに対応した割込みを強制的に発生します。0のbitは影響しません。
0xE000 E280 NVIC_ICPR 割込みクリア 0 ライト:1を立てたbitに対応した割込みをクリアします。0のbitは影響しません。
0xE000 E400〜
(8ワード)
NVIC_IPR0〜
NVIC_IPR7
優先順序設定 0 割込み要因に対応して1バイト毎に割込みの優先順序を設定します(上位2bitのみ有効)。
アクセスは1ワード単位なので、bit7-6, bit15-14, bit23-22, bit31-30を設定することになります。
設定値00が高優先、11が低優先です。

■割込みソース対応
 SAMC2x、SAMD21の場合です。
番号 SAMC2x SAMD21 番号 SAMC2x SAMD21 番号 SAMC2x SAMD21 番号 SAMC2x SAMD21
0 PM, MCLK, OSCCTRL,
OSC32KCTRL, SUPC, PAC
PM 8 EVSYS EVSYS 16 CAN1 TCC1 24 TC4 AC
1 WDT SYSCTRL 9 SERCOM0,
SERCOM6
SERCOM0 17 TCC0 TCC2 25 ADC0 DAC
2 RTC WDT 10 SERCOM1,
SERCOM7
SERCOM1 18 TCC1 TC3 26 ADC1 PTC
3 EIC RTC 11 SERCOM2 SERCOM2 19 TCC2 TC4 27 AC I2S
4 FREQM EIC 12 SERCOM3 SERCOM3 20 TC0, TC5 TC5 28 DAC AC1
5 TSENS NVMCTRL 13 SERCOM4 SERCOM4 21 TC1, TC6 TC6 29 SDADC TCC3
6 NVMCTRL DMAC 14 SERCOM5 SERCOM5 22 TC2, TC7 TC7 30 PTC
7 DMAC USB 15 CAN0 TCC0 23 TC3 ADC 31 予約

■割込み優先制御 2019/3/22 追記
 ・同時に複数の割込み要求が発生した場合、割込み優先順序レジスタの設定値が小さい方を優先します。
  優先順序レジスタの設定値が同じ場合は、ベクタ番号の若い方を優先します。
 ・初期状態では、どの優先度の割込みも受付可能です。
 ・多重割込み(ある割込みを受付けている中で他の割込みを許可)の場合、新たな割込みの優先順序レジスタの設定値が現在の割込みの値より小さい場合に受付可能です。