こちらのページをほぼなぞらせていただきました。
私もMacを使っています。
ひな形をダウンロードする
ATSAMD21G18A いちおう QFN48 をきちんと選択し,
Makefileを選んで [DOWNLOAD PACK] をクリックします。
中身はこんな感じでした。
$ 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 への変換はこちらからも
感謝!