恒例のLEDちかちか。準備したファイルを以下に示します。 青文字は、基となるファイルを修正して使っているか、 新規に作成したファイルであることを示します。
file | information |
---|---|
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を修正して使っています。 以下に修正元となったファイル一覧と、その内容について示します。
dir | file | information |
---|---|---|
CM3\CoreSupport | core_cm3.h core_cm3.c | Cortex-M3コアの設定及び、周辺レジスタの設定関数 |
CM3\DeviceSupport\STM32F10x | stm32f10x.h | STM32F10xのレジスタ定義とか |
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)