Nucleo
Page last updated
12 Aug 2014, by
yasuyuki onodera.
1 reply
STM32 Nucleoのバグ情報です。
mbedのライブラリrevision 84で解決されています。
- wait関数が動作しない。
- I2Cのrepeated startが機能しない。
- システムクロックが16MHz。(84MHzに改善)
- 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:
F401REで、下記のプログラムを実行していると72分で動作が停止します。
※スイッチ1個、サーボ1個、LED2個の管理です。
mbed LPC1114へ移植してみたところ正常に動作します。
nucleoで動作が停止する理由はどこにあるのでしょうか。
- include "mbed.h"
- include "Servo.h"
- define MPI 3.14159265358
- 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);
- define INTERVAL_TIME 0.01
Ticker interval_timer;
- define LED_EYE_INTERVAL 5
bool Update_led_eye = true;
int led_eye_interval_counter = LED_EYE_INTERVAL;
- define SERVO_INTERVAL 5
bool Update_servo = true;
int servo_interval_counter = SERVO_INTERVAL;
- 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.
F401REで、下記のプログラムを実行していると72分で動作が停止します。 ※スイッチ1個、サーボ1個、LED2個の管理です。 mbed LPC1114へ移植してみたところ正常に動作します。 nucleoで動作が停止する理由はどこにあるのでしょうか。
PwmOut led_eye(*); PwmOut led_eye(PB_3); DigitalIn sw_check2(PB_10); DigitalOut led_mouse(PA_9); Servo karakasa(PB_4);
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; }
} }