LoginSignup
0
0

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

Posted at

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

私もMacを使っています。

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

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

image.png

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

image.png

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

$ 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

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 を修正します。

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"
$ make -f gcc/Makefile

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

書き込み

ここでは Arduino のツールを借用して書き込みます。書き込むだけの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 への変換はこちらからも

感謝!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0