ARM Cortex ‐M 開発環境
CooCox ‐ STM32 編 ‐
2012.04.21 東日本支部 高橋
内容
• 最近 ン事情
• ネ 動向
• STM32
• STM32 開発環境 (GNU)
• CooCox
• 開発環境
• CoIDE ( 統合開発環境 )
• CoIDE ‐ 作成 ッ 設定
• CoIDE – printf (Semihosting)
• CoIDE – GPIO LED 点灯
• CoOS (RTOS)
• Atomic Write
最近 ン事情
32bit化
ARM 陣営 vs Renesas
ARM Cortex‐M
Renesas RX
ネ 動向
R62T
良さそう 64pin LQFP
3.3V/5V
STM32
最近 や書籍 い い 出回っ た
採用事例 増え た様子
STM32VL Discovery
STM32L Discovery
STBee Mini
STM32 開発環境 (GNU)
制限
ン
Code Sourcery G++
Lite版 制限あ ン 自前
Sourcery CodeBench
Lite版IDE
制限 ン LaunchPad 入手 制限
ち っ 前 現在
CooCox
ARM Cortex‐M 特化 た開発環境 提供 Free
い CPU ン : Atmel, Energy Micro, Holtek, NXP, Nuvoton, ST, TI
発展途上 商用 比べ 劣 こ あ 秀逸 用途 十分
ここ 年 更新 STM32 状況 良 った
CoIDE 統合開発環境
CoOS Real Time OS
CoLinkEx ッ 用 (SWD/JTAG)
CoSmart ン割当&
生成
CoX 共通
開発環境
STM32 VL Discovery
USB
Target
自作
ST‐Link/V2 Debug Adapter (兼Writer)
ン ば
ST‐Link(SWD) 使え Target 接続
CoLinkEx with LPC1114 (CoLinkEx 自作可能)
CoIDE ( 統合開発環境 )
CoIDE ン (GCC ARM Embedded) ン
CoIDE ”Select Toolchain Path” ン 指定
環境:
STM32 VL Discovery
USB
ST‐Link STM32F100RBT6B 24MHz 128KB/8KB SWD (Serial Wire Debug) 接続
V1.4.1 使用
CoIDE ‐ 作成 (1/3)
Repository Manufacturers, Chips 選択 New Project
CoIDE ‐ 作成 (2/3)
Peripherals CMSIS Boot 選択
CoIDE ‐ 作成 (3/3)
CMSIS startup, ISR(Interrupt Service Routine) 等 定義さ い ST Micro 出 い Firmware Library 入っ い 同
CooCox 使わ い
Document ” .../Libraries/CMSIS/Documentation/CMSIS_Core.htm” startup CooCox独自 (.s .c 書 い )
CoIDE – ッ 設定
CoIDE CPU 選択 た時 CPU ン ョン 指定 い
こ 連動 形 CMSIS内 ッ 設定 決
CMSIS (boot) ッ 設定 行わ い
STM32 VL Discovery 設定変更 不要 (HSE 8MHz, SYSCLK 24MHz) ン ョン ‐DSTM32F10X_MD_VL 指定さ
system_stm32f10x.c SYSCLK_FREQ_24MHz 選択さ PLL設定 行わ
CMSIS 直接修 い ン ョン 制御 た方 良い
CooCox 簡単 出 入 う こ 時修 消え う
CoIDE – printf (Semihosting) (1/4)
printf.c 書 換え
1) #include “semihosting.h” 2) PrintChar() Semihosting出力 3) puts() 対応
Peripherals Retarget printf, Semihosting 選択
main.c printf 込
CoIDE – printf (Semihosting) (2/4)
Debug Configuration ST‐Link 指定 Semihosting Enable 指定
CoIDE – printf (Semihosting) (3/4)
Debug開始
CoIDE – printf (Semihosting) (4/4)
printf(“Hello…¥n”);
Retarget printf PrintChar()
文字出力 puts()
修 gcc printf puts 置換
事 あ
Semihosting SH_SendChar()
Debug
Adapter CoIDE
USB
Traget CPU
Debug Adapter
無 ば文字 捨
SWD
(Serial Wire Debug)
CoIDE – GPIO LED 点灯 (1/7)
Peripherals GPIO 選択
CoIDE – GPIO LED 点灯 (2/7)
GPIO example 選択 add 追加
CoIDE – GPIO LED 点灯 (3/7)
example 書 換え
PC6,9 点滅さ い
STM32VL Discovery PC8,9 LED 割
当 い 番号 書 換え
RCC (Reset and Clock Control) GPIO Clock 供給
GPIO ン 出力 設定
CoIDE – GPIO LED 点灯 (4/7)
問題点: 時間待ち 単 最適化 消え う
解決策: SysTick ン 使う 分解能 1ms
‐Os ( 優先) 勧 約半分 速度 倍
CoIDE – GPIO LED 点灯 (5/7)
SysTick.c, SysTick.h 導入
こ 常
最適化(‐Os) 効率重視
SysTick_Handler system側 weak属性 定義さ い
ここ 再定義 さ
1ms 毎 び出さ
SystemCoreClock system側 定義さ い (単位Hz) SysTick_Config() 1ms分 ッ 数 指定
待ち時間(ms単位) 指定
SysTick_Handler() ン ン 指定時間 達 た 終了
CoIDE – GPIO LED 点灯 (6/7)
SysTick_Init(), SysTick_DelayMs() び出
SysTick 初期化 main 頭 一度 び出 ば良い ここ 明 都合上 GPIO_Blink() 頭 び出 い
SysTick_DelayMs() 置 換えた
CoIDE – GPIO LED 点灯 (7/7)
GPIOB LED 16個付 た PB3,4 使え い Default JTAG 割当 い AFIO Remap
LQFP64 場合 51本使え …
GPIOA
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PA8 PA9 PA10 PA11 PA12
PA13: SWDIO PA14: SWCLK
PA15: JTDI (Remap可能)
GPIOB
PB0 PB1 PB2
PB3: JTDO (Remap可能) PB4: NJTRST (Remap可能) PB5
PB6 PB7 PB8 PB9 PB10 PB11 PB12 PB13 PB14 PB15
GPIOC
PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12
PC13: 制限有(※1) PC14: 制限有(※1,2) PC15: 制限有(※1,2)
GPIOD
PD0: OSC_IN (X‐tal) PD1: OSC_OUT (X‐tal) PD2
※1 Sink , 3mA, 2MHz
※2 32.768kHz X‐tal 接続
CoOS (RTOS)
様々 I/O 扱う う っ Real Time OS 必要 っ
処理 複数 分割 優先度 設定
ュ ン 定期的 RTOS 行う
ン ュ ン SysTick割 込 利用
I/O割 込 優先度 高い処理 行う場合 OS経由 指示 出 事
ュ ン 起こさ
CoOS OsConfig.h
CFG_CPU_FREQ 24MHz 修
CFG_SYSTICK_FREQ 100Hz (1000Hz 可)
Atomic Write (1/3)
書 込 競合
ン 通常処理 割 込 書 込 行う 同様
GPIOx 8bit 8bit
Device A Device B Task A
又
通常処理
Task B 又 割 込
競合
全体 書
全体 書
Atomic Write (2/3)
STM32 GPIO BSRR 使う 簡単 Atomic Write
通常 GPIO Read ‐ Modify ‐ Write 場合 割 込 禁
BSRR Reset Set 値 一度 書 込
ン 令 行わ
割 込 邪魔さ い
Atomic あ
書籍 良 見 事例
Read – Modify ‐ Write Read後 割 込 発生
状態 変化 う 割
込 変更 た状態 反映さ い い値 Writeさ う
こ 抑 前後 割
込 禁
Atomic Write (3/3)
GPIO 出力用 ODR BSRR ODR 特定 ッ
Atomic 変更
べ 書 出 BSRR経由
事 排 制御
不要