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
2011年7月18日月曜日
aitendoのSTM32F103R基板を作ってみました(armon移植編)
液晶工房(aitendo)777円基板のSTM32F103Rでirukaさんのarmonを動くようにしてみました。
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にする.
- 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環境構築編
目標は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
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
2011年6月27日月曜日
液晶工房 777円基板
2011/6/26(日)で液晶工房が閉店した。老舗パーツショップと違う品ぞろえでお気に入りのお店でした。
閉店セールで入手した「777円 基板」の覚書
いろいろなMPUに対応したブレイクアウトボードになってます。
全体像
http://iteadstudio.com/ の同じ商品のリンクを張ってみました。
[Bare PCB] STM32F103RB The Smallest System Dev Board
Schematic
BOM
[Bare PCB] STM32F103VB The Smallest System Dev Board
ENC28J60 Ethernet Module
Demo code for ENC28J60(Includes ATMega48, STM32,LPC2103 and 8051 demo)
Open-source TCP/IP stack -- available as an Arduino library
[Bare PCB] AT91SAM7S64 Minimum system bare board
Schemaitc
BOM
You can purchase the assembled one here
[Bare PCB] RS232 to TLL Adapter Board
MAX3232互換用
[Bare PCB] EPM240 CLPL development board
Schematic
BOM
EMP240 CPLD datasheet
Assembled board here
[Bare PCB] ALTERA FPGA CycloneII EP2C5T144 smallest system board
Schematic (pdf)
BOM (xls)
Altera CycloneII EP2C5T144 FPGA Mini Development Board
閉店セールで入手した「777円 基板」の覚書
いろいろなMPUに対応したブレイクアウトボードになってます。
全体像
http://iteadstudio.com/ の同じ商品のリンクを張ってみました。
[Bare PCB] STM32F103RB The Smallest System Dev Board
Schematic
BOM
[Bare PCB] STM32F103VB The Smallest System Dev Board
ENC28J60 Ethernet Module
Demo code for ENC28J60(Includes ATMega48, STM32,LPC2103 and 8051 demo)
Open-source TCP/IP stack -- available as an Arduino library
[Bare PCB] AT91SAM7S64 Minimum system bare board
Schemaitc
BOM
You can purchase the assembled one here
[Bare PCB] RS232 to TLL Adapter Board
MAX3232互換用
[Bare PCB] EPM240 CLPL development board
Schematic
BOM
EMP240 CPLD datasheet
Assembled board here
[Bare PCB] ALTERA FPGA CycloneII EP2C5T144 smallest system board
Schematic (pdf)
BOM (xls)
Altera CycloneII EP2C5T144 FPGA Mini Development Board
2011年6月12日日曜日
REGZA RD-BZ800のリモコンをVIZIO(TV)で使えるようにする(構想)
REGZA RD-BZ800のリモコンをVIZIO(TV)で使えるようにする。
普段はSONYの学習リモコンを使ってるのですが、これが妻に評判が悪い。
REGZAのリモコンを学習するにはボタン数が少ない。
シフト機能も使えるけどボタンの刻印が無いから、よく使わないボタン機能を忘れてしまう。
RD-BZ800のリモコンには
左上の青色文字部分がテレビコントロール部分
初代HDDレコーダーClipOnのアルミヘアライン仕上げのB&O風デザインリモコン。
このGUIがしっかりしてればこれだけのボタン数でかなりのこと出来るんだけどね...
アナログ放送が停波したら別用途に利用予定。IRRemoteライブラリをちょっと修正
Binary sketch size: 8816 bytes (of a 32256 byte maximum)
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
Masahiko KANETAKA
kane4d@gmail.com
http://kane4d.blogspot.com/
Port MAP
D0 I RX
D1 O TX
D2
D3 O IR LED Drive
D4
D5
D6
D7 I IR Receiver module(PL-IRM1261)
D8
D9
D10
D11
D12
D13 O LED
*/
//#define DEBUG 1
//#define CORE_LED0_PIN 13
#define MAKER_CODE 0x8F700000
#define REMOTE_CMD(x) ( MAKER_CODE | x )
#include <IRremote.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
irrecv.blink13(true);
}
// based on Print::printNumber
void printHex64(unsigned long long n)
{
unsigned char buf[sizeof(unsigned long long) * 2];
unsigned long i = 0;
if (n == 0) {
Serial.print('0');
return;
}
while (n > 0) {
buf[i++] = n & 0xf;
n >>= 4;
}
for (; i > 0; i--) {
Serial.print((char) (buf[i - 1] < 10 ?
'0' + buf[i - 1] :
'A' + buf[i - 1] - 10));
}
}
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
irsend.sendNEC(results->decode_type, 32);
if (results->value == REPEAT){
//repeat code
irsend.sendNEC(REPEAT, 32);
}else if ((results->value & 0xFFFF0000) == MAKER_CODE){
irsend.sendNEC(results->decode_type, 32);
}
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: ");
switch(results->value){
case (0xA90):
Serial.print("Power ");
irsend.sendNEC(REMOTE_CMD(0x10EF), 32);
break;
case (0x490):
Serial.print("Vol.Up ");
irsend.sendNEC(REMOTE_CMD(0x40BF), 32);
break;
case (0xC90):
Serial.print("Vol.Down ");
irsend.sendNEC(REMOTE_CMD(0xC03F), 32);
break;
case (0x90):
Serial.print("CH.Up ");
irsend.sendNEC(REMOTE_CMD(0x00FF), 32);
break;
case (0x890):
Serial.print("CH.Down ");
irsend.sendNEC(REMOTE_CMD(0x807F), 32);
break;
case (0xA50):
Serial.print("InputSel ");
irsend.sendNEC(REMOTE_CMD(0x639C), 32);
break;
case (0x3AE9):
Serial.print("ChiAna ");
irsend.sendNEC(REMOTE_CMD(0xD42B), 32);
break;
case (0x26E9):
Serial.print("ChiDigi ");
irsend.sendNEC(REMOTE_CMD(0x847B), 32);
break;
case (0x1AE9):
Serial.print("BS110 ");
irsend.sendNEC(REMOTE_CMD(0x20DF), 32);
break;
case (0x6AE9):
Serial.print("CS110 ");
irsend.sendNEC(REMOTE_CMD(0xA05F), 32);
break;
}
}
else if (results->decode_type == RC5) {
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6) {
Serial.print("Decoded RC6: ");
}
printHex64(results->value);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++) {
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
}
void loop() {
if (irrecv.decode(&results)) {
dump(&results);
irrecv.resume(); // Receive the next value
}
}
普段はSONYの学習リモコンを使ってるのですが、これが妻に評判が悪い。
REGZAのリモコンを学習するにはボタン数が少ない。
シフト機能も使えるけどボタンの刻印が無いから、よく使わないボタン機能を忘れてしまう。
RD-BZ800のリモコンには
- テレビコントロールのプリセット値にVIZIOの項目が無い
- 機能別の独立したボタンが多すぎ
- シンプルリモコンがシンプルすぎ
左上の青色文字部分がテレビコントロール部分
IRremoteのサンプルプログラムIRrecvDumpをちょいと手直ししてリモコンコード変換機にしてます。
機能 | VIZIO TV | SONY TV | REGZA TV |
---|---|---|---|
電源 | 8F7010EF | A90(12bits) | 2FD48b7 |
Vol Up | 8F7040BF | 490 | 2FD58A7 |
Vol Down | 8F70C03F | C90 | 2FD7887 |
Ch Up | 8F7000FF | 90 | 2FDD821 |
Ch Down | 8F70807F | 890 | 2FDF807 |
入力切り替え | 8F70639C(HDMI) | A50 | 2FDF00F |
地上波アナログ | 8F7004FB | 3AE9(15bits) | 2FDDE21 |
地上波デジタル | 8F70847B | 26E9 | 2FD5EA1 |
BS110 | 8F7020DF | 1AE9 | 2FD3EC1 |
CS110 | 8F70A05F | 6AE9 | 2FDBE41 |
VIZIOのリモコン受光部はここ
初代HDDレコーダーClipOnのアルミヘアライン仕上げのB&O風デザインリモコン。
このGUIがしっかりしてればこれだけのボタン数でかなりのこと出来るんだけどね...
アナログ放送が停波したら別用途に利用予定。
- sendNECを実行すると受信機能が破壊される
- sendNECにリピート送信を追加
Binary sketch size: 8816 bytes (of a 32256 byte maximum)
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
Masahiko KANETAKA
kane4d@gmail.com
http://kane4d.blogspot.com/
Port MAP
D0 I RX
D1 O TX
D2
D3 O IR LED Drive
D4
D5
D6
D7 I IR Receiver module(PL-IRM1261)
D8
D9
D10
D11
D12
D13 O LED
*/
//#define DEBUG 1
//#define CORE_LED0_PIN 13
#define MAKER_CODE 0x8F700000
#define REMOTE_CMD(x) ( MAKER_CODE | x )
#include <IRremote.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
irrecv.blink13(true);
}
// based on Print::printNumber
void printHex64(unsigned long long n)
{
unsigned char buf[sizeof(unsigned long long) * 2];
unsigned long i = 0;
if (n == 0) {
Serial.print('0');
return;
}
while (n > 0) {
buf[i++] = n & 0xf;
n >>= 4;
}
for (; i > 0; i--) {
Serial.print((char) (buf[i - 1] < 10 ?
'0' + buf[i - 1] :
'A' + buf[i - 1] - 10));
}
}
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
irsend.sendNEC(results->decode_type, 32);
if (results->value == REPEAT){
//repeat code
irsend.sendNEC(REPEAT, 32);
}else if ((results->value & 0xFFFF0000) == MAKER_CODE){
irsend.sendNEC(results->decode_type, 32);
}
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: ");
switch(results->value){
case (0xA90):
Serial.print("Power ");
irsend.sendNEC(REMOTE_CMD(0x10EF), 32);
break;
case (0x490):
Serial.print("Vol.Up ");
irsend.sendNEC(REMOTE_CMD(0x40BF), 32);
break;
case (0xC90):
Serial.print("Vol.Down ");
irsend.sendNEC(REMOTE_CMD(0xC03F), 32);
break;
case (0x90):
Serial.print("CH.Up ");
irsend.sendNEC(REMOTE_CMD(0x00FF), 32);
break;
case (0x890):
Serial.print("CH.Down ");
irsend.sendNEC(REMOTE_CMD(0x807F), 32);
break;
case (0xA50):
Serial.print("InputSel ");
irsend.sendNEC(REMOTE_CMD(0x639C), 32);
break;
case (0x3AE9):
Serial.print("ChiAna ");
irsend.sendNEC(REMOTE_CMD(0xD42B), 32);
break;
case (0x26E9):
Serial.print("ChiDigi ");
irsend.sendNEC(REMOTE_CMD(0x847B), 32);
break;
case (0x1AE9):
Serial.print("BS110 ");
irsend.sendNEC(REMOTE_CMD(0x20DF), 32);
break;
case (0x6AE9):
Serial.print("CS110 ");
irsend.sendNEC(REMOTE_CMD(0xA05F), 32);
break;
}
}
else if (results->decode_type == RC5) {
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6) {
Serial.print("Decoded RC6: ");
}
printHex64(results->value);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++) {
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
}
void loop() {
if (irrecv.decode(&results)) {
dump(&results);
irrecv.resume(); // Receive the next value
}
}
腕時計電池の下調べ
2011年6月11日土曜日
腕時計の電池交換
腕時計をしなくなったのはいつごろからだろうか?
「電池の切れ目が縁の切れ目」
10気圧防水時計は時計屋さんで交換すると高いんですよねぇ。
そんな訳で動作しないが捨てられない時計が溜まってしまいました。
メタボの重たい腰を持ち上げて、この「Cooの腕時計」さんのサイトを参考に電池交換しました。
ダイビングするわけではないので、防水性能は自己責任ということで...
使用したボタン電池
基本方針
用意した道具は
です。
電池交換用にdealeXtreameで購入したバキューム式ピックアップツール($4.19)を使いました。
購入してから気づいたのですが、同じものでもっと安い($3.62)のが有ったんです。
吸盤は大中小の3種類付属。
今回は中サイズをチョイス
後部に使ってない吸盤を収納できます。
タンタルコンデンサの足にさして収納してます。
CASIO G-SHOCK PRT-401J(SR927 x 2)
ファーブル昆虫記の文庫本が同梱されてました。
ファーブルにちなんでバックライトがフンコロガシなんです。
ベルトの合成皮革部分が加水分解?して破損
安いSR927が見つからず今回は電池交換断念
CASIO G-SHOCK GT-000(CR2016)
G-SHOCKは圧電素子に接続するスプリング部分以外はゴムで保護されてる。
裏ぶたの注意書き
ゴムに付着した緑色のものは???
先の細いピンセットで留め金を外す。
嫌いなMAXELL電池が入っている。
未使用でサイババ状態になった古電池。
新しい電池をセットしてAC(All Clear)ジャンパーショートする。
このモデルはACの刻印が見にくい。
リセット後は製造年が表示されるのかな?
95年製
CASIO G-SHOCK DW-8800(CR2016)
何年も電池切れ状態だったけど電話帳は消えてませんでした。
CASIO G-SHOCK 裏ぶた未確認(CR2016)
これはMade in KOREAです。
SEIKO ALBA U.K.G GORI(CR2025)
裏ぶたには圧電素子と注意書きが付いてます。
一度も電池交換してないので純正電池が入ってました。
電池を吸着
あとは新しい電池を入れて、AC(All Clear)後ねじ止めで作業終了。
マジックテープのベルトが長いのでスキーウエアや手袋の上に装着できます。
ねじ止め式じゃない時計がまだあるけど、面倒なので後回しと云うことで...
「電池の切れ目が縁の切れ目」
10気圧防水時計は時計屋さんで交換すると高いんですよねぇ。
そんな訳で動作しないが捨てられない時計が溜まってしまいました。
メタボの重たい腰を持ち上げて、この「Cooの腕時計」さんのサイトを参考に電池交換しました。
ダイビングするわけではないので、防水性能は自己責任ということで...
使用したボタン電池
基本方針
- 裏ぶたの説明書きをよく読む
- AC端子の位置確認
- スプリングを紛失しないように注意
- 指紋を残さない
用意した道具は
です。
電池交換用にdealeXtreameで購入したバキューム式ピックアップツール($4.19)を使いました。
購入してから気づいたのですが、同じものでもっと安い($3.62)のが有ったんです。
吸盤は大中小の3種類付属。
今回は中サイズをチョイス
後部に使ってない吸盤を収納できます。
タンタルコンデンサの足にさして収納してます。
CASIO G-SHOCK PRT-401J(SR927 x 2)
ファーブル昆虫記の文庫本が同梱されてました。
ファーブルにちなんでバックライトがフンコロガシなんです。
ベルトの合成皮革部分が加水分解?して破損
安いSR927が見つからず今回は電池交換断念
CASIO G-SHOCK GT-000(CR2016)
G-SHOCKは圧電素子に接続するスプリング部分以外はゴムで保護されてる。
裏ぶたの注意書き
ゴムに付着した緑色のものは???
先の細いピンセットで留め金を外す。
嫌いなMAXELL電池が入っている。
未使用でサイババ状態になった古電池。
新しい電池をセットしてAC(All Clear)ジャンパーショートする。
このモデルはACの刻印が見にくい。
リセット後は製造年が表示されるのかな?
95年製
CASIO G-SHOCK DW-8800(CR2016)
何年も電池切れ状態だったけど電話帳は消えてませんでした。
CASIO G-SHOCK 裏ぶた未確認(CR2016)
これはMade in KOREAです。
SEIKO ALBA U.K.G GORI(CR2025)
この時計だけ分解写真付きです。
G-Shockは必ずゴムシートが入ってるけど、これには入ってないです。裏ぶたには圧電素子と注意書きが付いてます。
一度も電池交換してないので純正電池が入ってました。
電池を吸着
あとは新しい電池を入れて、AC(All Clear)後ねじ止めで作業終了。
マジックテープのベルトが長いのでスキーウエアや手袋の上に装着できます。
ねじ止め式じゃない時計がまだあるけど、面倒なので後回しと云うことで...
登録:
投稿 (Atom)