STM32サンプルプログラム

MapleIDE用のサンプルスケッチ集です。

LED点滅

基板上のLEDを点滅させるスケッチです。
int ledPin1 =  40;    // LED connected to PC8 (LED4 blue)
int ledPin2 =  41;    // LED connected to PC9 (LED3 green)
void setup(){           
  pinMode(ledPin1, OUTPUT);       
  pinMode(ledPin2, OUTPUT);       
}
void loop(){         
  digitalWrite(ledPin1, HIGH);   // set the LED on
  digitalWrite(ledPin2, HIGH);   // set the LED on
  delay(100);                  // wait for a second
  digitalWrite(ledPin1, LOW);    // set the LED off
  digitalWrite(ledPin2, LOW);    // set the LED off
  delay(100);                  // wait for a second
}

UARTループバック

UART3に送られてきたデータをそのまま返信するスケッチです。
void setup()[
  Serial3.begin(9600);
}
void loop(){
  if(Serial3.available()){
    Serial3.write(Serial3.read());
  }
}

タイマー

タイマーを使って5秒毎にLEDを点滅させるスケッチです。
タイマーをスタートした瞬間に割り込みを入れたい場合
timer1.setCompare(TIMER_CH1, 1);
タイマーをスタートして1回分の周期後に割り込みを入れたい場合
timer1.setCompare(TIMER_CH1, timer1.getOverflow());
タイマーをスタートして1回分の周期の半分後に割り込みを入れたい場合
timer1.setCompare(TIMER_CH1, timer1.getOverflow() * 0.5);
動作を変更させたい場合は上記の部分をコメントアウトして利用してください。
#define LED_RATE 5000000//5秒間隔
HardwareTimer timer1(1);
void setup() {
    pinMode(BOARD_LED_PIN, OUTPUT);//青LEDのつながっているピンを出力モードに
    timer1.pause();//タイマーを停止
    timer1.setPeriod(LED_RATE);//周期を5秒に設定
    //タイマー1のチャンネル1をコンパレータモードに設定
    timer1.setChannel1Mode(TIMER_OUTPUT_COMPARE);

    //タイマーをresumeした瞬間に1回目の割り込みが入る。
    timer1.setCompare(TIMER_CH1, 1);

    //タイマーをresumeして5秒に1回目の割り込みが入る。
    //timer1.setCompare(TIMER_CH1, timer1.getOverflow());

    //タイマーをresumeして2.5秒に1回目の割り込みが入る。
    //timer1.setCompare(TIMER_CH1, timer1.getOverflow() * 0.5);
    timer1.attachCompare1Interrupt(handler_led);
    timer1.refresh();//タイマーをクリア
    timer1.resume();//タイマーをスタート
}
void loop() {
}
void handler_led(void) {//
    toggleLED();//基板上の青LEDを点滅
}

PWM

8番ピン(PA8)を1Hzで点滅させるスケッチです。
タイマー1の周期を変更しているので、タイマー1を使う他のプログラムと組み合わせて使う場合は注意してください。
HardwareTimer timer1(1);
void setup(){
  timer1.setPeriod(1000 * 1000);//1Hzに設定
  pinMode(8,PWM);//8番ピンをPWMに設定
  analogWrite(8,timer1.getOverflow() * 0.5);//50%
}
void loop(){
}
また、PWM出力させるピンを変更する場合以下の表を参考にしてください。
PWMピンとタイマーの関係
TIMER1 8(PA8) 9(PA9) 10(PA10)
TIMER2 0(PA0) 1(PA1) 2(PA2) 3(PA3)
TIMER3 6(PA6) 7(PA7) 16(PB0) 17(PB1)
TIMER4 22(PB6) 23(PB7) 24(PB8) 25(PB9)

エンコーダのカウント(割込み処理)

BOTSで買った設定用の光学式エンコーダを割込み処理で動かしています。
割込み処理の場合、どのピンでも処理できますが処理時間が大きいのでモータの軸に直結している高速エンコーダには向きません。
また、今回使ったエンコーダは5V動作なので5Vトレラント入力対応にピンに接続しています。ピンの配置を変える場合は注意してください。
こちらのサイトを参考に実装しています。
http://elm-chan.org/docs/tec/te04.html
volatile long encoderPosition;
volatile int encoderMoved;
void setup() {
    pinMode(PC(4), INPUT);
    pinMode(PC(5), INPUT);
    attachInterrupt(PC(4),sampleEncoder,CHANGE);
    attachInterrupt(PC(5),sampleEncoder,CHANGE);
    Serial3.begin(9600);
}
void loop() {
  if(encoderMoved){
    encoderMoved = 0;
    Serial3.print("encoderPosition=");
    Serial3.println(encoderPosition);
  }
}
void sampleEncoder(void)
{
    static const int dir[] 
      = { 0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0 };
    static int i;
    i = (i << 2) +(digitalRead(PC(4)) << 1) + digitalRead(PC(5));
    encoderPosition +=  dir[i & 15];
    encoderMoved=1;
}

呉高専(ロボット製作クラブ)コントローラ受信サンプル

ライブラリ
KureControllerVer0.01.zip
サンプル
KureControllerVer0.01-サンプル.zip
#include <KureController.h>
KureController controller;
#ifndef _LIBMAPLE_H_
#define _LIBMAPLE_H_
#define Serial1 Serial
#endif
unsigned long loopfps,recvfps;
void printffps();
void setup() {
  Serial1.begin(57600);
}
void loop() {
  if (Serial1.available()) {
    controller.processing(Serial1.read());
  }
  loopfps++;
}
void receive(int unsettledCnt){
  //Serial1.println("receive");
  printffps();
  if(controller.getButton(PS_LEFT)){
    //Serial1.println("LEFT-ON");
  }
  else{
    //Serial1.println("LEFT-OFF");
  }
}
void failure(int unsettledCnt){
  Serial1.println("failure");

}
void receiveLoop(){
}
void failureLoop(){
}
void printffps(){
  static unsigned long time,timebak;
  static unsigned long loopfps_,recvfps_;
  recvfps++;
  time = millis()/1000;
  if(timebak != time){
    loopfps_ = loopfps;
    recvfps_ = recvfps;
    timebak = time;
    recvfps = 0;
    loopfps = 0;
  }
  Serial1.print("recvfps");
  Serial1.println(recvfps_);
  Serial1.print("loopfps");
  Serial1.println(loopfps_);
}

基本関数

  • void setup()
一番初めに実行される関数です。この中に初期化の処理を記述します。
  • void loop()
setup関数の実行が終わったら、この関数が繰り返し呼ばれます。
メイン処理はここに書きます。
  • void pinMode(ピン番号、設定モード)
ピンの入出力、モードの設定を行います。
ピン番号はこのページの上部の図を参考にしてください。
設定できるモードは以下の通りです。
OUTPUT
 通常の出力モードです。
OUTPUT_OPEN_DRAIN
 オープンドレインの出力モードです。
INPUT
 通常の入力モードです。
INPUT_ANALOG
 アナログ入力(ADC)を使う場合の入力モードです。
INPUT_PULLUP
 プルアップを行う入力モードです。
INPUT_PULLDOWN
 プルダウンを行う入力モードです。
INPUT_FLOATING
 INPUTと同様です。
PWM
 PWM出力を行うモードです。PWMの出力ができるピンのみで使えます。
PWM_OPEN_DRAIN
 PWM出力をオープンドレインで行うモードです。PWMの出力ができるピンのみで使えます。
  • void digitalWrite(ピン番号,HIGH or LOW)
指定したピンをHIGHまたはLOWにする関数です。

HardwareTimerに関する関数

  • uint16 HardwareTimer::setPeriod(uint32 microseconds)
タイマーの周期を設定する関数です。内部でsetPrescaleFactor関数とsetOverflow関数
を呼び出しています。戻り値はanalogWrite関数で設定できる最大の値になります。
限界は24MHzのSTM32マイコンの場合178,951,508くらい。
  • uint16 HardwareTimer::getOverflow()
タイマーがオーバーフローする値を取得します。0-65535
  • uint16 HardwareTimer::setOverflow(uint16 val)
タイマーがオーバフローする値を設定します。0-65535
最終更新:2011年12月20日 17:32