STM32F0Discovery,CooCox導入

20150303,20140530 coskx
T.SATOH

1.はじめに
STM32F0DiscoveryをCooCoxの環境でプログラミングする方法を解説する。

2.STM32F0Discoveryについて
STM32F0Discovery は ARM Cortex-M0 を使った評価ボードである。
http://akizukidenshi.com/catalog/g/gM-06255/

主な仕様は次の通り
32-bit ARM CortexM0系MPU,STM32F051R8T6-LQFP64搭載
64KBflashMemory/8KB RAM
ST-LINK/V2でのプログラム書き込み,デバッグ可能
USBケーブルより供給の5V電源で動作(USBケーブルを切り離した場合は別途5Vまたは3V電源で動作可能)
ユーザ用の2つのLEDが利用可能(PC8青,PC9緑)
ユーザ用プッシュボタン利用可能(PA0)
12bitDAC1出力1ch
12bitADC1入力16ch
PWM出力MAX17ch
エンコーダ入力MAX3個分
USART2ch
国内では,秋月電子などで1000円ほどで販売されている。
ARMとはARM社が設計したマイクロコントローラの構造の名前であり,
製造会社がその構造を元にマイクロコントローラを製造して販売している。

STM32F051R8T6はSTMicroelectronics社が製造しているマイクロコントローラの名前である。
STM32F0DiscoveryはSTMicroelectronics社が製造している評価ボードの名前である。
 stm32f0discovery

STM32F0Discovery

購入してそのまま,USBケーブル(スタンダードA-ミニB)でPCに接続すると,USBケーブルから供給される電力で,デモプログラムが動作する。
USERボタン(青)を押すと青LEDをが点灯,その後緑のLEDの点滅速度が変化するデモである。

ユーザマニュアル DM00050135.pdf(UM1525) stm32f0discoveryのピン割り当て
リファレンスマニュアル DM00031936.pdf(RM0091) MCU_
STM32F051R8T6のリファレンスマニュアル
 
STM32F0Discoveryボードの情報
サンプルプロジェクト・ペリフェラルライブラリ stm32f0discovery_fw.zip



3.開発環境にCooCox CoIDEを導入する

STMはいくつかの開発環境を推奨しているようだが,無料で使うには制限があるようなので
開発環境としてCooCoxを導入する。
CooCoxは開発用の環境だが,コンパイラ・リンカは持っていないので,コンパイラ・リンカは別途用意する必要がある。

説明は次の2箇所を参考にしている。
(1)チカラの技術
(2)Qiita - プログラマの技術情報共有サービス

3.1 コンパイラ・リンカなどの開発プログラム類(ツールチェイン)のダウンロードとインストール
20150303現在MentorGraphicsはArmサポートを中止している
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
フォームに入力するとE-Mailが届き,ダウンロードできるようになる。。
arm-2013.11-24-arm-none-eabi.exeをダウンロードした。
実行すると
C:\Users\XXXXX\MentorGraphics\Sourcery_CodeBench_Lite_for_ARM_EABI
ここにインストールされた。

20150303現在配布中
launchpad.netがArmコンパイル用toolchainを配布している。。
windows版のインストールexe形式が使える。
https://launchpad.net/gcc-arm-embedded
gcc-arm-none-eabi-4_9-2014q4-20141203-win32.exe
がダウンロードされるので,これを実行しインストール
C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4
ここにインストールされた。
3.2 ST-LINKユーティリティのインストール
http://www.st-japan.co.jp/web/jp/catalog/tools/PF251168
Related Tools and Softwareから
STSW-LINK004 STM32 ST-LINK utility
をダウンロードし,インストールした。
C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\
ここにインストールされた。
3.3 CoIDEのインストール 20150303時点
http://www.coocox.org/
Software Tools から「Soft ware Tools」にて
CooCox XoIDE のところで
Read moreに進み,「Previous Version CoIDE-1.7.8」に進む。
 RegisterしてからSign Inする。
CoIDE-1.7.8.exe がダウンロードされるので,インストールする。
C:\CooCox\CoIDE
ここにインストールされた。

注意 20150303現在
Software Tools から「Soft ware Tools」にて CooCox XoIDE のところでそのままDownLoadすると
CoIDE-V2Beta-20150213.exe
がDownloadされてしまうが,これはまだ不安定で,異常終了がたびたび起こるので今は使わない。

3.4 CoIDEを立ち上げてツールパスを設定
「Project」→「Select Toolchain Path」
「C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin
」を設定
これでCooCoxとコンパイラツールチェインが合体される。

★購入時に組み込まれているデモプログラムの取り出し
stm32f0diecovery購入時に,LEDを点滅させるでもプログラムが入っている。
USBケーブルで電源を供給すると動作するようになっている。
せっかくだから,このプログラムを抜き出し,別なプログラム開発の後で,もう一度転送し,デモプログラムを復活させることができるようにしておこう。

抜き出し
stm32f0diecoveryをUSBケーブルで接続します。
STM32 ST-LINK Utilityを起動し,「Target」メニューからConnectを実行すると,
stm32f0diecovery内の機械語部分をPC側に自動的に抜き出します。
これをhexファイルで保存すれば,抜き出し完了

再転送
stm32f0diecoveryをUSBケーブルで接続します。
STM32 ST-LINK Utilityを起動し,Fileメニューから先に保存したhexファイルを読み込みます。
TargetメニューからProgram & verifyを選んで,startすると書き込みます。
書き込みが終わると,デモプログラムが動作を開始します。



4.最初のプログラム(お決まりのLEDチカチカ)
stm32f0diecoveryの青のLED(LED4)を点滅させる最小限のプログラムを作る。



LED4はGPIOのPortCの第8ビットに接続されている。
 (ユーザマニュアル DM00050135.pdf(UM1525) 4.4 LEDs, Table 6, Figure 16 参照)
このビットに1を出力することによりLED4が点灯し,
0を出力することで消灯する。

GPIOのPortCの第8ビットに0/1を出力するには事前に2つの準備が必要である。
(1)PortCのクロックを有効にする(RCC_AHBENRのbit19を1)
  (リファレンスマニュアル DM00031936.pdf(RM0091) 6.3.2 7.4.6 参照)
(2) PortC_Bit8を出力に設定(GPIOC_MODERのbit16を1)
  (リファレンスマニュアル DM00031936.pdf(RM0091) 9.1 9.4.1 参照)
これで準備ができて あとはPortC_Bit8に0/1を出力する(GPIOC_ODRのbit8を0/1)
  (リファレンスマニュアル DM00031936.pdf(RM0091) 9.4.6 参照)
この手順はARMプロセッサのビット入出力として一般的なものである。

作業手順は次のとおりである。
(1)CoIDEを起動
(2)「Projectメニュー」から「New Project」を選択
  一応プロジェクト名「LED_demo_stm32f0discovery」をつける。
  「C:\CooCox\CoIDE\workspace\LED_demo_stm32f0discovery」
  実体はここに作成される。
(3)テンプレート作成手順に自動的に入るので「chip」か「board」を選ぶところで,
  「chip」を選択して緑色にする。
  ST → STM32F05X → STM32F051R8
  (ARM から選んではいけない。)
(4)Repository(収納庫の意味)が表示される。
  (「viewメニュー」-Repositoryで後から追加・削除は可能)
  最低限のコンポーネントを使うことにして,
  「CMSIS BOOT」と「M0 Cmsis Core」を選定する。
  選定するごとにCoIDE左側のProjectにファイルが増える。
(5)main.cを次のように作成
  
#include "stm32f0xx.h"

// LED4 (blue) is controlled by Port C Pin8 output

int main(void)
{
    volatile unsigned int x=0;
    RCC ->AHBENR |= (1<<19);   //Enable CLK for Port C
    GPIOC -> MODER |= (1<<16); //Enable Port C Pin8 as a digital output
    while(1) {
        GPIOC ->ODR |= (1<<8); //Turn GPIOC Pin 8 On
        for (x=0; x<1000000; x++);
        GPIOC ->ODR &= ~(1<<8); //Turn GPIOC Pin 8 Off
        for (x=0; x<1000000; x++);
    }
}

注意 int型変数xにおいて x |= (1<<3); は他のビットに影響を与えず第3ビットのみ1にする。
また,x &= ~(1<<3);
は他のビットに影響を与えず第3ビットのみ0にする。

(6)stm32f0diecoveryの準備
  stm32f0discoveryをUSBケーブル(A-miniB)で接続する。
  購入直後の場合はデモプログラムが動作しているが,デモプログラムは上書きされてなくなってしまうことになる。
(7)ビルド(build)&転送(Program Download)&デバッグ(debug)
  ビルドと転送はそれぞれProjectメニュー,Flashメニューにあるが,ビルドボタンと転送ボタンが便利である。
  
  ビルドボタンを押して,「BUILD SUCCESSFUL」が画面下のconsoleに表示されたらビルド終了
  転送ボタンを押して,転送ダイアログが消えたら,転送終了。
  
(8)デバッグ実行
  mainの入り口で(黄色の矢印)止まっているので,緑三角アイコンでRUN
  青のLEDがチカチカしたら,成功
  黄色ポースアイコンでSuspend(一時停止)
  赤四角アイコンでterminate(デバッグ終了)
  (デバッグ終了すると,デバッグなしで勝手に動作する)
  

LED_demo_stm32f0discovery.zip
5.ボタン(ユーザボタン)によって2つのLEDを制御
stm32f0diecoveryのユーザボタンで2つのLEDをONOFFする最小限のプログラムを作る。
青のユーザボタンを押したら青いLEDが点灯し,そうでない時は緑のLEDが点灯するようにする。

LED4(青)はGPIOのPortCの第8ビットに接続されている。
LED3(緑)はGPIOのPortCの第9ビットに接続されている。
ユーザボタンはGPIOのPortAの第0ビットに接続されている。
(ボタンOFFで0V,ボタンONで電源電圧が入力される。)

GPIOのPortAの第0ビットを入力として使うには事前に2つの準備が必要である。
(1)PortAのクロックを有効にする(RCC_AHBENRのbit17を1)
(2) PortA_Bit0を入力に設定(GPIOA_MODERのbit0,1を0)
GPIOのPortCの2つのビットは4で説明済みである。

作業手順は4と全く同じとなり,(ただし,プロジェクト名は別の名前)
main.cのみ次のようにすれば良い。

#include "stm32f0xx.h"

// User Button is checked as Port A Pin0 input
// LD4 (blue) is controlled by Port C Pin8 output
// LD3 (green) is controlled by Port C Pin9 output

int main(void)
{
    RCC ->AHBENR |= (1<<17);   //Enable CLK for Port A
    RCC ->AHBENR |= (1<<19);   //Enable CLK for Port C
    GPIOA -> MODER &= ~3;      //Enable Port A Pin0 as a digital input
    GPIOC -> MODER |= (1<<16); //Enable Port C Pin8 as a digital output
    GPIOC -> MODER |= (1<<18); //Enable Port C Pin9 as a digital output
    while(1) {
        if (((GPIOA ->IDR)&1) ==1 ) {  //if user's button pushed
            GPIOC ->ODR |= (1<<8); //Turn GPIOC Pin 8 On
            GPIOC ->ODR &= ~(1<<9); //Turn GPIOC Pin 9 Off
        } else {
            GPIOC ->ODR &= ~(1<<8); //Turn GPIOC Pin 8 Off
            GPIOC ->ODR |= (1<<9); //Turn GPIOC Pin 9 On
        }
    }
}


ButtonLED_demo_stm32f0discovery.zip
6.semihostingを用いたprintfの使用

coIDEでは,デバッグの時に右下にsemihostingというペインが開いている。
このペインにstm32f0diecoveryからprintfで表示してみよう。
デバッグの時に使えるかもしれない。

作業手順は次のとおりである。
(1)CoIDEを起動
(2)「Projectメニュー」から「New Project」を選択
  一応プロジェクト名「hello_with_semihost_stm32f0discovery」をつけた。
  「C:\CooCox\CoIDE\workspace\hello_with_semihost_stm32f0discovery」
  実体はここに作成される。
(3)テンプレート作成手順に自動的に入るので「chip」か「board」を選ぶところで,
  「chip」を選択して緑色にする。
  ST → STM32F05X → STM32F051R8
(4)Repository(収納庫の意味)が表示される。
  (「viewメニュー」-Repositoryで後から追加・削除は可能)
  「CMSIS BOOT」と「M0 Cmsis Core」「C Library」「Retarget」「semihosting」を選定する。
(5)Viewメニューから,Configuration - Debugger
  Semihosting Enableをチェック
(6)stdio/printf.cの関数PrintCharを関数SH_SendCharに渡すようにする。

#include <semihosting.h> ←を追加

void PrintChar(char c)
{
    /* Send a char like:
       while(Transfer not completed);
       Transmit a char;
    */
    SH_SendChar(c);
}

(7)Configuration - Link
  Debug in flashをチェック。
  Debug in RAMではメモリが不足してprintfが動かない。
(8)main.cを次のように作成

#include <stdio.h>

int main(void)
{
    volatile int x=0;
    while(1)
    {
        printf("Hello world!  %3d\r\n",x++);
        if (x==100) x=0;
    }
}

(9)コンパイルと転送は同時に行わなければならないため,
てんとう虫アイコンでコンパイル&転送する。
(10)mainの入り口で止まっているので,緑三角アイコンでRUN。
Semihostingペインに次のように表示される。

Hello world!    0
Hello world!    1
Hello world!    2
Hello world!    3
Hello world!    4
Hello world!    5
Hello world!    6
Hello world!    7
Hello world!    8

黄色ポースアイコンでSuspend
赤四角アイコンでterminate

hello_with_semihost_stm32f0discovery.zip

★printfに関する補足
(1)
浮動小数点型の表示非対応
  CooCoxが提供しているprintfは浮動小数点型の表示には対応していないが,
  実行ファイルはその分小さく仕上がる。

(2)浮動小数点型表示のための変更
  1) printf.cをプロジェクトから削除し,
  2) syscalls.c内のint _write(int file, char *ptr, int len)を
int _write(int file, char *ptr, int len)
{
    ptr[len] = '\0';
    SH_SendString(ptr);
    return len;
}
  このように変更すると,標準関数のprintfが組み込まれ,浮動小数点型の表示が
  可能になるが,実行ファイルは非常に大きくなる。



7.フレームワークプロジェクトの利用

5,6のように0からプロジェクトを作ることは結構大変である。
フレームワークと呼ぶほど大げさではないが,機械工学科の学生が良い方法を教えてくれた。
予めすべてのヘッダーファイル,ソースファイルをプロジェクト内に登録しておくと,煩雑な選定作業が不要になる。
CooCoxのRepositoryのお世話にならず,全部まとめて登録するという方法である。
不要なヘッダをCソースが取り込んだとしても,実行コードには何も影響がない。
不要なソースファイルがプロジェクト内にあってもオブジェクトコードまでは作られるが,
実行コードには取り込まれないので,実行ファイルが肥大化することもない。

フレームワーク
プロジェクトと呼んでいるが,デモンストレーション用プロジェクト(一部変更)そのものである。

使い方は,CoIDEを起動し,フレームワーク
プロジェクトの.coprojファイルでプロジェクトを立ち上げると,
デモンストレーションのプログラムが出て来る。そのまま「てんとう虫」ボタンで実行できる。
自分用のプログラムにするには,不要な部分を削除し,必要なことを書き足せば良い。
この
フレームワークプロジェクトでは,
ペリフェラルドライバの全ヘッダファイルの取り込みはstm32f0xx_conf.hが一手に行っている。

ダウンロード
フレームワークプロジェクト(デモンストレーション用プロジェクト

このワークフレーム
プロジェクトに関する使用上の注意☆☆
ワークフレームプロジェクトを使っても,不要な部分の削除,必要な関数群の作成は
行わなければならない。

また,このワークフレームプロジェクトを用いると,新規作成のすべてのプロジェクト名がおなじになってしまい困る。
そこで,次の「フレームワークプロジェクト作成ツール」を使うと,この問題が解決する。

8. フレームワークプロジェクト作成ツール
フレームワークプロジェクト作成ツールstm32f0_makeprojectダウンロード

上記の手順ではすべてのプロジェクト名が同じになってしまうので,
新しいプロジェクト名でのフレームワークプロジェクト一発作成ツールを作った。

1)このアプリケーションの目的
STM32f0Discovery用の新たなプロジェクト名をつけたプロジェクト
フォルダ(CooCox用テンプレート)を生成する。
生成されたプロジェクトフォルダを適当な場所に置き,その中の
.coprojファイルを使って,CoIDE上にプロジェクトを開き,作業
を開始くことができる。
このテンプレートはフレームワークとも呼ばれており,ペリフェラ
ルのドライバやそのヘッダファイルをすべて取り込んだものになっ
ている。

2)操作方法
(1)stm32f0_makeproject.exe を起動し,
プロジェクトフォルダを作りたい親フォルダを上の段に書く。
(デフォルトはstm32f0_makeproject.exeと同じ場所)
新しいプロジェクト名を下の段に書く。
makeボタンを押す。
(2)CooCox Project → Open Project で
.coprojファイルを選択すると,作業開始できる。
main.cを変更することになるが,includeのところは残して,main()以下を書き換えるようにすれば良い。
他のファイルをプロジェクトに取り込んでも良い。

3)完成済みのプロジェクトフォルダから新たな名前のプロジェクトを作成する方法
ダウンロード・ファイル中のreadme.txt中に,方法が記載されている。

4)注意
上記「このワークフレームに関する使用上の注意☆☆」はそのまま適用される。


今の時点で問題に思うこと
リファレンスマニュアルは英語版しかないという不便さを除けば,必要な情報は入手できる。
しかし,サンプルプロジェクト・ペリフェラルライブラリ stm32f0discovery_fw.zipで使われている関数群についてのリファレンスマニュアルが見つからず,自分で読み解くしかない不自由さがある。