Logo w
TIPS

ASFのclock.cでは内蔵32Kオシレータが動かないバグがあります

2016年3月8日

ASF 3.30 時点の内容です

conf_clocks.hの中で内蔵オシレータを有効にしようとしても

# define CONF_CLOCK_OSC32K_ENABLE true

ASFが生成するclock.cのコンパイルが通りません。おそらくSAM D10用のコードがメンテされていないものと思われます。

SYSCTRL->OSC32K.bit.CALIB = (*(uint32_t *)SYSCTRL_FUSES_OSC32K_ADDR >> SYSCTRL_FUSES_OSC32K_Pos);

これは内蔵32Kオシレータのキャリブレーション値をフューズから読み出してレジスタに格納するコードですが、フューズのアドレスとビット位置を表すマクロSYSCTRL_FUSES_OSC32K_ADDRと SYSCTRL_FUSES_OSC32K_Posが定義されてないためにエラーになります。さらには、そもそも上記の代入ロジックがSAM D10では間違っているため、マクロの値を定義するだけでは不十分です。

SAM D10のデータシートによれば SYSCTRL_FUSES_OSC32K_ADDR は 0x00806020 です。これはNVMCTRL_OTP4マクロで定義されているアドレスです。ここから見たビット位置44:38がOSCK32K CALなので、実際は0x00806020から4バイトを足したアドレスから値を読み出し、さらに6ビットシフトした値に、6ビットのマスクをかけてから、SYSCTRL->OSC32K.bit.CALIBに設定する必要があります。

SYSCTRL->OSC32K.bit.CALIB=(*((uint32_t *)(NVMCTRL_OTP4+4)) >> 6) & 0x3F;

SAM D10を48M(FLL)で動作させるためのクロック設定に関してはこちら:
How to configure DFLL48M oscillator as main clock in ASF project for SAMR21/SAMD21/SAMD20/SAMD10/SAMD11?

SAM D10のクロックに関してはこちらのフォーラムの記事も参考になります:
SAMD10 Xplained Mini, questions and experiences... (clocking, transitioning to pinmux...)

この記事に関連する商品