読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

STM32F4 Discovery の開発環境 (2)

ARM STM32

まず始めに ARM 用の GCC ツールチェーンをインストールします。apt-get で一発です。

$ sudo apt-get install gcc-arm-linux-gnueabi
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

これでコードを書きはじめられるのですが、STM32F4 のレジスタアドレスをいちいちデータシートから調べてコードを書くのはつらいので、STM32CubeF4 を利用しました。サイズが大きいですが、実際に使うのは以下のファイルのみ。

STM32Cube_FW_F4_V1.7.0/Drivers/CMSIS/Include/

  • core_cm4.h
  • core_cmFunc.h
  • core_cmInstr.h
  • core_cmSimd.h

Cortex-M4 依存のコードが入ってます。

STM32Cube_FW_F4_V1.7.0/Drivers/CMSIS/Device/ST/STM32F4xx/

  • stm32f407xx.h
  • stm32f4xx.h
  • system_stm32f4xx.c
  • system_stm32f4xx.h

STM32F4 依存のコードが入ってます。各デバイスのレジスタ定義もこちらに書いてあります。

早速、stm32f4xx.h をインクルードしてコードを書いてみます。まずはお決まりの GPIO を使った LED 点灯。

#include "stm32f4xx.h"

typedef void (*exception_handler_t)();

void Reset_Handler();

const exception_handler_t vector_table[] = {
    (exception_handler_t)0x20020000,
    Reset_Handler,
};

void Reset_Handler()
{
    SystemInit();

    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;

    GPIOD->MODER = 0x55550000;
    GPIOD->ODR   = 0x0000F000;
    
    while (1)
        continue;
}

ベクタテーブルは MSP とリセットハンドラだけの手抜きのもの。SystemInit は先ほどダウンロードしたライブラリで定義されてますが、クロック設定や割り込みベクタの初期化をするものです。続いて、GPIO D が繋がっている AHB1 にクロックを供給して、GPIO の MODER で出力モードに設定し、最後に ODR に値をセットしています。ODR[15:12] は LED が接続されているチップ端子の PD12~PD15 番ピンに対応してますので、ODR[15:12] に設定した値がそのまま LED の点灯状態になるわけです。

f:id:tanakahx:20150822214403j:plain

とうわけで、4 つの LED が無事点灯しました。