Nucleo

STM32 Nucleoのバグ情報です。

mbedのライブラリrevision 84で解決されています。

  1. wait関数が動作しない。
  2. I2Cのrepeated startが機能しない。
  3. システムクロックが16MHz。(84MHzに改善)
  4. Nucleo-F401REにPD8はありません。ミスプリントです。

改善していない方はmbedのライブラリをUpdateしましょう。

STM32 Nucleoのファームウェア更新方法です。

使用を開始する前にNucleoのファームウェアを更新しておきます。

  • さまざまなバグが修正されています。

http://mbed.org/teams/ST/wiki/Nucleo-Firmware

ArduinoピンとしてのD0,D1はデフォルトで使用できません。

  • STLinkの通信として使用されているためです。
  • 裏面の表面実装抵抗を修正する必要があります。
  • SB62,SB63をショート
  • SB13,SB14をオープン
  • 弊害としてそのままでは書き込みできなくなります。
  • CN4からCN7にSWDピンを接続する必要があります。
  • SWDCLK CN7(15ピン)=CN4(2ピン)
  • SWDIO CN7(13ピン)=CN4(4ピン)

http://mbed.org/teams/ST/wiki/Use-of-D0D1-Arduino-pins

STM32 Nucleoの内蔵クロック

  • STM32 Nucleoの内蔵クロックは±1%の誤差があります。
  • 気温変化が大きいと±5%くらいの誤差になります。
  • クロック精度が必要な場合、外部に水晶発振子を取り付けます。
  • RTC用にもセカンダリの水晶発振子(32.768KHz)を取り付けます。


1 comment on Nucleo:

06 Jun 2015

F401REで、下記のプログラムを実行していると72分で動作が停止します。 ※スイッチ1個、サーボ1個、LED2個の管理です。 mbed LPC1114へ移植してみたところ正常に動作します。 nucleoで動作が停止する理由はどこにあるのでしょうか。

  1. include "mbed.h"
  2. include "Servo.h"
  1. define MPI 3.14159265358
  1. define LED_PWM_FREQ 1000

PwmOut led_eye(*); PwmOut led_eye(PB_3); DigitalIn sw_check2(PB_10); DigitalOut led_mouse(PA_9); Servo karakasa(PB_4);

  1. define INTERVAL_TIME 0.01 Ticker interval_timer;
  1. define LED_EYE_INTERVAL 5 bool Update_led_eye = true; int led_eye_interval_counter = LED_EYE_INTERVAL;
  1. define SERVO_INTERVAL 5 bool Update_servo = true; int servo_interval_counter = SERVO_INTERVAL;
  1. define KARAKASA_INTERVAL 100 bool Karakasa_event = true; int karakasa_interval_counter = KARAKASA_INTERVAL;

void interval_timer_interrupt(void) { led eye interval counter led_eye_interval_counter; if(led_eye_interval_counter == 0) { led_eye_interval_counter = LED_EYE_INTERVAL; Update_led_eye = true; }

servo interval counter servo_interval_counter; if(servo_interval_counter == 0) { servo_interval_counter = SERVO_INTERVAL; Update_servo = true; }

karakasa_kozo interval counter karakasa_interval_counter; if(karakasa_interval_counter == 0) { karakasa_interval_counter = KARAKASA_INTERVAL; Karakasa_event = true; } }

int main() { sw_check2.mode(PullUp); int t = 0; float led_power , servo_angle = 0.0 , servo_x = -1.0;

led_eye.period_us(LED_PWM_FREQ);

interval_timer.attach(&interval_timer_interrupt,INTERVAL_TIME);

while(1) { LED EYE event section

if(Update_led_eye) { Update_led_eye = false; if(t < 99) { t++; } else { t = 0; }

led_power = (sinf(2.0 * MPI * (float)t / 99.0) + 1) / 2;

led_eye = led_power;

} Servo event section if(!sw_check2) { led_mouse = 1; if(Update_servo) interval timer event? { if(Karakasa_event) interval timer event? { servo_angle = 1.0 - powf(servo_x , 2.0); servo_x += 0.04;

if(servo_x > 1.0) { servo_x = -1.0; Karakasa_event = false; } }

karakasa = servo_angle; Update_servo = false; } } else { karakasa = 0.0; led_mouse = 0; }

} }

Please log in to post comments.