Seeed XIAO を Atmelライブラリでビルドして使う

こちらのページをほぼなぞらせていただきました。

- https://blueeyes.sakura.ne.jp/2018/10/26/1657/

私もMacを使っています。

# ひな形をダウンロードする

- https://start.atmel.com/

ATSAMD21G18A いちおう QFN48 をきちんと選択し，

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/38173900-76c7-ac58-6ef2-d780bf3d6cfc.png)


Makefileを選んで [DOWNLOAD PACK] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/ea8a97c1-d611-a200-4be3-0a9a4e50ab07.png)

中身はこんな感じでした。

```bash
$ ls 
AtmelStart.env_conf         atmel_start_config.atstart  gcc/
AtmelStart.gpdsc            atmel_start_pins.h          hal/
CMSIS/                      config/                     hpl/
armcc/                      driver_init.c               hri/
atmel_start.c               driver_init.h               main.c
atmel_start.h               examples/                   samd21a/
$ 
```

# ビルドする

`arm-none-eabi-gcc` が使えるようにします。手順は省略します。

「なんとなく活動記録。」さんは src ディレクトリを作って `main.c` を移動してますが，私は場所は移動せずそのまま。中身はそっくり頂いて，XIAO の青LED PA18 に変更しました。

```main.c
#include <atmel_start.h>

void sysclk_init(void) {
	// Now OSC8M is in 1MHz operation

	// Now ID0 ==> OSC8M ==> CPU
	GCLK->GENDIV.reg = GCLK_GENDIV_DIV(40) | GCLK_GENDIV_ID(1); // ID1 is divided by 40.
	GCLK->GENCTRL.reg = GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSC8M | GCLK_GENCTRL_ID(1); // ID1 ==> OSC8M
	GCLK->GENCTRL.reg = GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_DFLL48M | GCLK_GENCTRL_ID(2); // ID2 ==> DFLL48M
	// output for DFLL48M must be set in advance.

	GCLK->CLKCTRL.reg = GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK1 | GCLK_CLKCTRL_ID_DFLL48;

	SYSCTRL->DFLLMUL.bit.MUL = 1920; // x1920
	while (!SYSCTRL->PCLKSR.bit.DFLLRDY);
	SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE | SYSCTRL_DFLLCTRL_MODE; // DFLL48M enabled, closed loop mode.
	while (!SYSCTRL->PCLKSR.bit.DFLLRDY);

	GCLK->GENCTRL.reg = GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_DFLL48M | GCLK_GENCTRL_ID(0); // ID0(main) ==> DFLL48M
	NVMCTRL->CTRLB.bit.RWS = 1; // flash latency
}

// CPU clock is divided by 1
void ms_wait(uint16_t msec) {
	SysTick->LOAD = 48e6 / 1e3 - 1;
	SysTick->VAL = 0;
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
	for(uint16_t i=0; i<msec; i++) {
		while( !(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) );
	}
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

int main(void) {
	sysclk_init();
	PORT->Group[0].DIRSET.reg = (1 << 18);

	while (1) {
		PORT->Group[0].OUTTGL.reg = (1 << 18);
		ms_wait(1000);
	}
}
```

ここからが要注意でした。XIAOは uf2ブートローダーがあらかじめ書き込まれていますので，今回はそれを使います。

使うために，リンカスクリプトでサイズ指定を変更します。

（末尾に参考にしたURLあり）

`samd21a/gcc/gcc/samd21g18a_flash.ld`

```diff
38c38,39
<   rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000
---
>   /* rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000 */
>   rom      (rx)  : ORIGIN = 0x00000000+0x2000, LENGTH = 0x00040000-0x2000
```

いよいよビルド，なのですが，

ディレクトリ構造が想定と違うようで，make時にエラーが出ますので，`gcc/Makefile` を修正します。

```diff
95,109c95,108
< -I"../" \
< -I"../config" \
< -I"../examples" \
< -I"../hal/include" \
< -I"../hal/utils/include" \
< -I"../hpl/core" \
< -I"../hpl/dmac" \
< -I"../hpl/gclk" \
< -I"../hpl/pm" \
< -I"../hpl/port" \
< -I"../hpl/sysctrl" \
< -I"../hri" \
< -I"../" \
< -I"../CMSIS/Core/Include" \
< -I"../samd21a/include"
---
> -I"." \
> -I"config" \
> -I"examples" \
> -I"hal/include" \
> -I"hal/utils/include" \
> -I"hpl/core" \
> -I"hpl/dmac" \
> -I"hpl/gclk" \
> -I"hpl/pm" \
> -I"hpl/port" \
> -I"hpl/sysctrl" \
> -I"hri" \
> -I"CMSIS/Core/Include" \
> -I"samd21a/include"
158,159c157,158
< -T"../samd21a/gcc/gcc/samd21g18a_flash.ld" \
< -L"../samd21a/gcc/gcc"
---
> -T"samd21a/gcc/gcc/samd21g18a_flash.ld" \
> -L"samd21a/gcc/gcc"
```

```bash
$ make -f gcc/Makefile
```

`AtmelStart.bin` ができれば成功です。

# 書き込み

ここでは Arduino のツールを借用して書き込みます。書き込むだけのMakefileを作ってみました。

```Makefile
BOSSAC = ~/Library/Arduino15/packages/Seeeduino/tools/bossac/1.7.0-arduino3/bossac
PORT = /dev/cu.usbmodem14101

upload:
	${BOSSAC} -e -w -v -R -p ${PORT} AtmelStart.bin
```

リセット2回でUF2ブートローダを起動し，書き込みます。

# ひとりごと

webでライブラリが入ったひな形ができるのはいいですね！
まだ使いこなせてないですが，クロックやピン設定もできるのかも

STM32もそうなってくれるといいのだけど

# 参考

bin から uf2 への変換はこちらからも

https://github.com/Seeed-Studio/Seeed_Arduino_USBDISP/issues/7

感謝！

https://blueeyes.sakura.ne.jp/2018/10/26/1657/