Top > STM32F >LEDちかちか

LEDちかちか

恒例のLEDちかちか。準備したファイルを以下に示します。 青文字は、基となるファイルを修正して使っているか、 新規に作成したファイルであることを示します。

fileinformation
main.c メインプログラム
startup_stm32f10x_md.S スタートアップルーチン
core_cm3.h
core_cm3.c
Cortex-M3コアの設定及び、周辺レジスタの設定関数
system_stm32f10x.h
system_stm32f10x.c
STM32F10xシリーズのデバイス設定関数
stm32f10x.h STM32F10xのレジスタ定義とか
stm32f10x_flash.ld リンカスクリプト
makefile Makefile

プロジェクトファイルの大半は、STマイクロが提供しているライブラリ STM32F10x Standard Peripherals Libraryを修正して使っています。 以下に修正元となったファイル一覧と、その内容について示します。

dirfileinformation
CM3\CoreSupport core_cm3.h
core_cm3.c
Cortex-M3コアの設定及び、周辺レジスタの設定関数
CM3\DeviceSupport\STM32F10x stm32f10x.hSTM32F10xのレジスタ定義とか
system_stm32f10x.h
system_stm32f10x.c
STM32F10xシリーズのデバイス設定関数
CM3\DeviceSupport\STM32F10x\startup\gcc_ride7 startup_stm32f10x_cl.s
startup_stm32f10x_hd.s
startup_stm32f10x_ld.s
startup_stm32f10x_ld_vl.s
startup_stm32f10x_md.s
startup_stm32f10x_md_vl.s
各デバイス用スタートアップルーチン

メインプログラム

以下、メインプログラムです。 GPIOも使用するためにはクロックを供給してあげる必要があります。 ちなみに、スタートアップルーチン内で、SystemInit()関数[system_stm32f10x.c]が呼ばれます。 SystemInit()関数内では、クロック設定等が行われます。 デフォルト設定では、8MHzの発振子を使っている場合、CPUクロックが72MHzに設定されます。

レジスタバンク使用前(ソースコード)
#include "stm32f10x.h"

// 適当なディレイ関数
void delay(volatile unsigned long count);

// エントリーポイント
int main()
{
	// GPIOAにクロック供給
	RCC->APB2ENR = RCC_APB2ENR_IOPAEN;

	// GPIOA-P1をPushPull出力10MHzに設定
	GPIOA->CRL = 0x00000001;

	while (1) {
		GPIOA->ODR ^= 0x00000001;
		delay(50000);
	}
}

// 適当なディレイ
void delay(volatile unsigned long count)
{
	for ( ; count>0; count-- );
}

書き込み

makeしてプログラムをコンパイルします。 出来上がったmain.elfがターゲットに書き込むバイナリです。 今回使用したサンプルプログラム一式を置いておきます。

$ make
 :
 :
/usr/local/arm-2010q1/bin/arm-none-eabi-size -Ax build/main.elf
build/main.elf  :
section            size         addr
.isr_vector       0x10c    0x8000000
.text             0x284    0x800010c
.data              0x14   0x20000000
._usrstack        0x100   0x20000014
.ARM.attributes    0x2d          0x0
.comment           0x81          0x0
Total             0x552
 :
 :
$ cd build
$ openocd -f ../stm32-myjtagkey.cfg

OpenOCD起動後、telnet経由でターゲットに書き込みを行います。

> halt
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x21000000 pc: 0x080001b0 msp: 0x20004ff0
> flash write_image erase main.elf
auto erase enabled
Padding image section 0 with 0 bytes
not enough working area available(requested 16384, free 16336)
wrote 1024 bytes from file main.elf in 0.410000s (2.439 kb/s)
> reset
JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
JTAG tap: stm32.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)