2011年7月18日月曜日

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にする.

0 件のコメント:

コメントを投稿