2011年7月18日月曜日

aitendoのSTM32F103R基板を作ってみました(MapleIDE移植編)

irukaさんのページを参考にしてaitendoのSTM32F103R基板でもMapleIDEが動くようにしてみました。

pinModeがarduinoから拡張されてるのが新鮮です。
この基板のタクトスイッチはGNDに直接つながってるだけなので、INPUT_PULLUPを使いました。

Uploaderとしてavrdudeを使うにはauto_resetの設定に関係なくCOMxxにアクセスできないとavrdude.exeに処理が移らないようです。

後でファイルをアップしますが、今日は眠いので修正点の一覧だけで...

boards.txtに追加
##############################################################
Aitendo103R.name=Aitendo STM32F103R Mini to Flash
Aitendo103R.upload.file_type=bin
Aitendo103R.upload.maximum_size=108000
Aitendo103R.upload.ram.maximum_size=17000
Aitendo103R.upload.flash.maximum_size=108000
#Aitendo103R.upload.usbID=0483:DF11
Aitendo103R.upload.usbID=1EAF:0003
Aitendo103R.upload.altID=2
Aitendo103R.upload.uploader=avrdude
#Aitendo103R.upload.auto_reset=true
Aitendo103R.upload.protocol=ARMBOOT_STBEE
Aitendo103R.upload.speed=115200
#Aitendo103R.build.board=maple
Aitendo103R.build.board=Aitendo103R
Aitendo103R.build.mcu=STM32F103RB
Aitendo103R.build.family=cortex-m3
Aitendo103R.build.f_cpu=72000000L
Aitendo103R.build.core=maple
Aitendo103R.build.vect=VECT_TAB_FLASH
Aitendo103R.build.linker=maple/flashAitendo103R.ld
#Aitendo103R.build.linker=maple/flash.ld
Aitendo103R.build.using=armcompiler
Aitendo103R.build.density=STM32_MEDIUM_DENSITY
Aitendo103R.build.error_led_port=GPIOB
Aitendo103R.build.error_led_pin=8

libmaple.hは開始アドレスを指定

#ifdef BOARD_Aitendo103R
#define USER_ADDR_ROM 0x08002000
#else
#define USER_ADDR_ROM 0x08005000
#endif

boards.hはピンなサインを追加
#elif defined(BOARD_STM32VLD)
#include "maple_STM32VLD.h"
#elif defined(BOARD_Aitendo103R)
#include "maple_Aitendo103R.h"
#else

usb_config.h

#elif defined(BOARD_STM32VLD)
    #define VCOM_ID_PRODUCT      0x0004
    #define USB_DISC_DEV         GPIOB
    #define USB_DISC_PIN         9

#elif defined(BOARD_Aitendo103R)
    #define VCOM_ID_PRODUCT      0x0004
    #define USB_DISC_DEV         GPIOC
    #define USB_DISC_PIN         12
#else

maple_Aitendo103R.hを追加
PAxx, PBxx等のピン名でもアクセスできるようにしてみました。
/******************************************************************************
 * The MIT License
 *
 * Copyright (c) 2011 LeafLabs, LLC.
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *****************************************************************************/
/**
 * @file   maple_mini.h
 * @author Marti Bolivar <mbolivar@leaflabs.com>
 * @brief  Private include file for Maple Mini in boards.h
 *
 * See maple.h for more information on these definitions.
 */
#include "gpio.h"
#include "timer.h"
#include "wirish_types.h"
#ifndef _BOARD_MAPLE_MINI_H_
#define _BOARD_MAPLE_MINI_H_
#define CYCLES_PER_MICROSECOND    72
#define SYSTICK_RELOAD_VAL     71999 /* takes a cycle to reload */
#define BOARD_BUTTON_PIN          35
#define BOARD_LED_PIN             34
#define BOARD_NR_USARTS           3
#define BOARD_USART1_TX_PIN       26
#define BOARD_USART1_RX_PIN       25
#define BOARD_USART2_TX_PIN       9
#define BOARD_USART2_RX_PIN       8
#define BOARD_USART3_TX_PIN       1
#define BOARD_USART3_RX_PIN       0
#define BOARD_NR_SPI              2
#define BOARD_SPI1_NSS_PIN        7
#define BOARD_SPI1_MOSI_PIN       4
#define BOARD_SPI1_MISO_PIN       5
#define BOARD_SPI1_SCK_PIN        6
#define BOARD_SPI2_NSS_PIN        31
#define BOARD_SPI2_MOSI_PIN       28
#define BOARD_SPI2_MISO_PIN       29
#define BOARD_SPI2_SCK_PIN        30
#define BOARD_NR_GPIO_PINS        51
#define BOARD_NR_PWM_PINS         12
#define BOARD_NR_ADC_PINS          16
#define BOARD_NR_USED_PINS         8
#define BOARD_JTMS_SWDIO_PIN      22
#define BOARD_JTCK_SWCLK_PIN      21
#define BOARD_JTDI_PIN            20
#define BOARD_JTDO_PIN            19
#define BOARD_NJTRST_PIN          18
enum {
 PA0 = 11, PA1 = 10, PA2 = 9, PA3 = 8, PA4 = 7, PA5 = 6, PA6 = 5, PA7 = 4,
 PA8 = 27, PA9 = 26, PA10 = 25, PA11 = 24, PA12 = 23, PA13 = 22, PA14 = 21, PA15 = 20,
 PB0 = 3, PB1 = 33, PB2 = 2, PB3 = 19, PB4 = 18, PB5 = 17, PB6 = 16, PB7 = 15,
 PB8 = 32, PB9 = 34, PB10 = 1, PB11 = 0, PB12 = 31, PB13 = 30, PB14 = 29, PB15 = 28,
 PC0 = 35, PC1 = 36, PC2 = 37, PC3 = 38, PC4 = 39, PC5 = 40, PC6 = 41, PC7 = 42,
 PC8 = 43, PC9 = 44, PC10 = 45, PC11 = 46, PC12 = 47, PC13 = 14, PC14 = 13, PC15 = 12,
 PD0 = 48, PD1 = 49, PD2 = 50,
};
#endif
maple_Aitendo103R.cpp
全ピンアクセスできるようにPIN_MAPを拡張
boardPWMPinsはこれから修正します。

/******************************************************************************
 * The MIT License
 *
 * Copyright (c) 2011 LeafLabs, LLC.
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *****************************************************************************/
/**
 * @file   maple_mini.cpp
 * @author Marti Bolivar <mbolivar@leaflabs.com>
 * @brief  Maple Mini PIN_MAP and boardInit().
 */
#include "maple_Aitendo103R.h"
#include "gpio.h"
#include "wirish_debug.h"
#ifdef BOARD_Aitendo103R
/* Since we want the Serial Wire/JTAG pins as GPIOs, disable both SW
 * and JTAG debug support */
void boardInit(void) {
    disableDebugPorts();
}
extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = {
    /* Top header */
 // .*?/\*\s+D(\d+)/(P[A-G]\d+).*?\*/
 // \2 = \1,
    {GPIOB,   NULL, NULL, 11, 0, ADCx}, /* D0/PB11 */
    {GPIOB,   NULL, NULL, 10, 0, ADCx}, /* D1/PB10 */
    {GPIOB,   NULL, NULL,  2, 0, ADCx}, /* D2/PB2 */
    {GPIOB, TIMER3, ADC1,  0, 3,    8}, /* D3/PB0 */
    {GPIOA, TIMER3, ADC1,  7, 2,    7}, /* D4/PA7 */
    {GPIOA, TIMER3, ADC1,  6, 1,    6}, /* D5/PA6 */
    {GPIOA,   NULL, ADC1,  5, 0,    5}, /* D6/PA5 */
    {GPIOA,   NULL, ADC1,  4, 0,    4}, /* D7/PA4 */
    {GPIOA, TIMER2, ADC1,  3, 4,    3}, /* D8/PA3 */
    {GPIOA, TIMER2, ADC1,  2, 3,    2}, /* D9/PA2 */
    {GPIOA, TIMER2, ADC1,  1, 2,    1}, /* D10/PA1 */
    {GPIOA, TIMER2, ADC1,  0, 1,    0}, /* D11/PA0 */
    {GPIOC,   NULL, NULL, 15, 0, ADCx}, /* D12/PC15(OSC32_OUT) */
    {GPIOC,   NULL, NULL, 14, 0, ADCx}, /* D13/PC14(OSC32_IN) */
    {GPIOC,   NULL, NULL, 13, 0, ADCx}, /* D14/PC13 */
    /* Bottom header */
    {GPIOB, TIMER4, NULL,  7, 2, ADCx}, /* D15/PB7 */
    {GPIOB, TIMER4, NULL,  6, 1, ADCx}, /* D16/PB6 */
    {GPIOB,   NULL, NULL,  5, 0, ADCx}, /* D17/PB5 */
    {GPIOB,   NULL, NULL,  4, 0, ADCx}, /* D18/PB4 */
    {GPIOB,   NULL, NULL,  3, 0, ADCx}, /* D19/PB3 */
    {GPIOA,   NULL, NULL, 15, 0, ADCx}, /* D20/PA15 */
    {GPIOA,   NULL, NULL, 14, 0, ADCx}, /* D21/PA14 */
    {GPIOA,   NULL, NULL, 13, 0, ADCx}, /* D22/PA13 */
    {GPIOA,   NULL, NULL, 12, 0, ADCx}, /* D23/PA12(USB_DP) */
    {GPIOA, TIMER1, NULL, 11, 4, ADCx}, /* D24/PA11(USB DM) */
    {GPIOA, TIMER1, NULL, 10, 3, ADCx}, /* D25/PA10 */
    {GPIOA, TIMER1, NULL,  9, 2, ADCx}, /* D26/PA9 */
    {GPIOA, TIMER1, NULL,  8, 1, ADCx}, /* D27/PA8 */
    {GPIOB,   NULL, NULL, 15, 0, ADCx}, /* D28/PB15 */
    {GPIOB,   NULL, NULL, 14, 0, ADCx}, /* D29/PB14 */
    {GPIOB,   NULL, NULL, 13, 0, ADCx}, /* D30/PB13 */
    {GPIOB,   NULL, NULL, 12, 0, ADCx}, /* D31/PB12 */
    {GPIOB, TIMER4, NULL,  8, 3, ADCx}, /* D32/PB8(LED2) */
    {GPIOB, TIMER3, ADC1,  1, 4,    9}, /* D33/PB1 */
    {GPIOB, TIMER4, NULL,  9, 4, ADCx}, /* D34/PB9(LED1) */
   
    {GPIOC,   NULL, ADC1,  0, 0,   10}, /* D35/PC0(S2) */
    {GPIOC,   NULL, ADC1,  1, 0,   11}, /* D36/PC1(S3) */
    {GPIOC,   NULL, ADC1,  2, 0,   12}, /* D37/PC2 */
    {GPIOC,   NULL, ADC1,  3, 0,   13}, /* D38/PC3 */
    {GPIOC,   NULL, ADC1,  4, 0,   14}, /* D39/PC4 */
    {GPIOC,   NULL, ADC1,  5, 0,   15}, /* D40/PC5 */
    {GPIOC,   NULL, NULL,  6, 0, ADCx}, /* D41/PC6 */
    {GPIOC,   NULL, NULL,  7, 0, ADCx}, /* D42/PC7 */
    {GPIOC,   NULL, NULL,  8, 0, ADCx}, /* D43/PC8 */
    {GPIOC,   NULL, NULL,  9, 0, ADCx}, /* D44/PC9 */
    {GPIOC,   NULL, NULL, 10, 0, ADCx}, /* D45/PC10 */
    {GPIOC,   NULL, NULL, 11, 0, ADCx}, /* D46/PC11 */
    {GPIOC,   NULL, NULL, 12, 0, ADCx}, /* D47/PC12 */
   
    {GPIOD,   NULL, NULL,  0, 0, ADCx}, /* D48/PD0(OSC_IN) */
    {GPIOD,   NULL, NULL,  1, 0, ADCx}, /* D49/PD1(OSC_OUT) */
    {GPIOD,   NULL, NULL,  2, 0, ADCx}, /* D50/PD2 */
};
extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = {
    3, 4, 5, 8, 9, 10, 11, 15, 16, 25, 26, 27
};
extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = {
    3, 4, 5, 6, 7, 8, 9, 10, 11,
    33,
    35, 36, 37, 38, 39, 40,
};
#define USB_DP 23
#define USB_DM 24
extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = {
    BOARD_LED_PIN, BOARD_BUTTON_PIN, USB_DP, USB_DM,
    48, 49, //OSC
    12, 13, //OSC32
};
#endif

aitendoのSTM32F103R基板を作ってみました(armon移植編)

液晶工房(aitendo)777円基板のSTM32F103Rでirukaさんのarmonを動くようにしてみました。

  • Boot1で起動アドレス($8000000と$8002000)の切り替え
  • LED D1, D2の点灯
というシンプルな修正です。
BASEBOARD = AITENDO103Rでmakeします。

修正分(init.c, monit.c, aitendo103r-0000.hex, aitendo103r-2000.hex)のファイルはここから落してください。

リセットボタンではUSBが初期化されない既知の不具合があります。
MapleIDEを動かすのが目的なので、この問題は後回しです。
USBケーブルの抜き差しでしのいでます。

init.cとmonit.cの差分情報です。

--- monit.c Tue Jan 20 07:05:12 1970
+++ monit.c Tue Jan 20 07:05:12 1970
@@ -325,6 +325,10 @@
 #define FLASH_END_ADR 0x08020000 // 128k
 #endif

+#ifdef AITENDO103R
+#define FLASH_END_ADR 0x08020000 // 128k
+#endif
+
 #ifdef STBEE_MINI
 #define FLASH_END_ADR 0x08020000 // 128k
 #endif
--- init.c Tue Jan 20 07:05:12 1970
+++ init.c Tue Jan 20 07:05:12 1970
@@ -5,6 +5,7 @@
 #BASEBOARD = CQ_STARM
 #BASEBOARD = STBEE
 #BASEBOARD = STBEE_MINI
+#BASEBOARD = AITENDO103R
  */
 #include "stm32f10x.h"
 #include "platform_config.h"
@@ -51,6 +52,17 @@

 #endif

+#ifdef AITENDO103R
+#define LED_PORT  GPIOB
+#define LED_PIN   GPIO_Pin_9
+
+#define HWTYPE 2
+#define ROMSIZE (128/32) // 32kBの倍数.
+#define RAMSIZE (20/4)  //  4kBの倍数.
+#define SIGNATURESTRING "AITENDO103R"
+
+#endif
+

 #ifdef STBEE_MINI
 #define LED_PORT  GPIOA
@@ -283,6 +295,65 @@
 }
 #endif

+#ifdef AITENDO103R
+/*******************************************************************************
+* Function Name  : GPIO_Configuration
+* Description    : Configures the different GPIO ports.
+* Input          : None
+* Output         : None
+* Return         : None
+*******************************************************************************/
+void GPIO_Configuration(int sp)
+{
+ GPIO_InitTypeDef GPIO_InitStructureA;
+ GPIO_InitTypeDef GPIO_InitStructureB;
+ GPIO_InitTypeDef GPIO_InitStructureC;
+ GPIO_InitTypeDef GPIO_InitStructureD;
+
+ // GPIO A,B,C,D にクロックを与える.
+ RCC_APB2PeriphClockCmd(
+     RCC_APB2Periph_GPIOA |
+     RCC_APB2Periph_GPIOB |
+     RCC_APB2Periph_GPIOC | /* == RCC_APB2Periph_GPIO_IOAIN      */
+     RCC_APB2Periph_GPIOD   /* == RCC_APB2Periph_GPIO_DISCONNECT */
+     , ENABLE);
+
+ // GPIO_B
+ GPIO_InitStructureB.GPIO_Pin   = 0;
+ GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructureB.GPIO_Mode  = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOB, &GPIO_InitStructureB);
+
+ // GPIO_B.9 = LED1, GPIO_B.8 = LED2
+ GPIO_InitStructureB.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_8;
+ GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructureB.GPIO_Mode  = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOB, &GPIO_InitStructureB);
+
+ GPIO_SetBits(GPIOB , GPIO_Pin_9); // LED消灯.
+ GPIO_ResetBits(GPIOB , GPIO_Pin_8); // LED点灯.
+
+ //
+ // 0x0800_2000 起動でビルドした場合はユーザーファームウェアへのJUMP処理を行わない.
+ //
+#if BOOTLOADER_MODE
+ GPIO_SetBits(GPIOB , GPIO_Pin_8); // LED消灯.
+ GPIO_ResetBits(GPIOB , GPIO_Pin_9); // LED点灯.
+ int boot_jumper_pin ;
+ boot_jumper_pin = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2);
+ if(check_cold(sp))
+ if(boot_jumper_pin) { //ジャンパーオープン.
+  int *resvec = (int *) 0x08002000; // reset vector
+  int adrs = resvec[1];
+  if((adrs & 0xfff00000) == 0x08000000) { // 0x0800_0000 ~ 0x080f_ffff までの間にjump.
+   call_func(adrs);
+  }
+ }
+#endif
+}
+#endif
+
+

 #ifdef STBEE
 /*******************************************************************************
@@ -476,6 +547,15 @@
  GPIO_InitStructureA.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructureA.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructureA);
+
+#ifdef AITENDO103R
+ GPIO_InitTypeDef GPIO_InitStructureC;
+ // GPIO_C.8 = LED
+ GPIO_InitStructureC.GPIO_Pin   = GPIO_Pin_8;
+ GPIO_InitStructureC.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructureC.GPIO_Mode  = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOC, &GPIO_InitStructureC);
+#endif

  GPIOA->ODR = 0;  // USB D+ D- をGNDにする.

2011年7月10日日曜日

aitendoのSTM32F103R基板を作ってみました

液晶工房777円基板のSTM32F103Rを作ってみました。
目標はMapleとして使える環境構築です。
 


MCUはSTM32f103RBを8MHz駆動です。
この基板は新発売なのにSTM32F2xxを考慮したVSSになってません。少しだけ残念です。

今回は注射器を使ってペーストハンダを盛りつけてみました。

 


MCU等の高級部品は手ハンダで、それ以外の抵抗やコンデンサをコテライザーのホットブローで取り付けました。

 リフロー炉と違いペーストハンダの未加熱部分が出るので、ジップロックにアルコールを入れて基板洗浄します。
歯ブラシでゴシゴシします。濁ってるのはフラックスと未加熱のボールはんだです。


接点のある部品を取り付けたら完成です。
J2(Boot0) 2-3Close
J4 1-3、2-5Close
J6 = Open
でシリアルからST社のFlash Loader Demonstratorを使ってirukaさんのarmonを書き込みました。

次回はMaple環境構築編

aitendoのUSBaspを作ってみました

液晶工房777円基板に入っていたUSBaspを作ってみました。

MCUはATMEGA8Lを12MHzで使い、3.3Vレギュレータは省略しました。

 パイオニアのMac互換機時代のガラス製マウスパッドです。


ツェナーダイオードは3端子のRD3.6Mを無理やり使ってます。

FirmwareはAVR-DoperをHIDモード専用で再コンパイルしてます。
hardware.h
34行目
#define ENABLE_HID_INTERFACE    1
39行目
#define ENABLE_CDC_INTERFACE    0