2009年5月29日金曜日

Clock configuration register(RCC_CFGR)







Address offset: 0x04
Reset value: 0x0000 0000
Access: 0 ≤ wait state ≤ 2, word, half-word and byte access
1 or 2 wait states inserted only if the access occurs during clock source switch.

Clock control register(RCC_CR)








Clock control register(RCC_CR)
Address offset:0x00
Reset value:0x0000 XX83 where X is undefined.
Access: no wait state, word, half-word and byte access

Flashのスタートアドレスについて

● Boot from main Flash memory: the main Flash memory is aliased in the boot memory
space (0x0000 0000), but still accessible from its original memory space (0x800 0000).
In other words, the Flash memory contents can be accessed starting from address
0x0000 0000 or 0x800 0000.
● Boot from System memory: the System memory is aliased in the boot memory space
(0x0000 0000), but still accessible from its original memory space (0x1FFF F000).
● Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000.

STM32のreference manualから上記の文書を見ました。
つまり、Main Flash memoryモードで、ldファイルにFLASHのスタートアドレスが0x8000000だけじゃなくて、0x00000000でも平気の意味ですか?

しっかり勉強しなければいかないすね...

2009年5月26日火曜日

STM32のUSBLibv2.2.1をFreeRTOSに移行

STのUSBLibがFreeRtosに移行して、ビルドまではできました。
結構改造したので、メモしましょう。

FwLibのバージョン番号はV2.0.3
USBLibのバージョン番号はV2.2.1

Makefileを下記に示します

# Project name
PROJECT_NAME=RTOSDemo

RTOS_SOURCE_DIR=../../../Source
DEMO_COMMON_DIR=../../Common/Minimal
DEMO_INCLUDE_DIR=../../Common/include
ST_LIB_DIR=../../Common/drivers/ST/STM32F10xFWLib/v2_0_3
ST_USB_LIB_DIR=../../Common/drivers/ST/USBLib/library
ST_USBCODE_DIR=./STCode/usblib

CC=arm-none-eabi-gcc
OBJCOPY=arm-none-eabi-objcopy
OBJDUMP=arm-none-eabi-size
NM = arm-none-eabi-nm
LDSCRIPT=stm32_flash.ld

# should use --gc-sections but the debugger does not seem to be able to cope with the option.
LINKER_FLAGS=-nostartfiles -Xlinker -o$(PROJECT_NAME).axf -Xlinker -M -Xlinker -Map=$(PROJECT_NAME).map -Xlinker --no-gc-sections

DEBUG=-ggdb
OPTIM=-O0


CFLAGS=$(DEBUG) \
$(OPTIM) \
-T$(LDSCRIPT) \
-I . \
-I ./STCode \
-I $(RTOS_SOURCE_DIR)/include \
-I $(RTOS_SOURCE_DIR)/portable/GCC/ARM_CM3 \
-I $(DEMO_INCLUDE_DIR) \
-I $(ST_LIB_DIR)/inc \
-I $(ST_USB_LIB_DIR)/inc \
-I $(ST_USBCODE_DIR) \
-D GCC_ARMCM3 \
-D inline= \
-D PACK_STRUCT_END=__attribute\(\(packed\)\) \
-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) \
-mthumb \
-mcpu=cortex-m3 \
-ffunction-sections \
-fdata-sections

SOURCE= main.c \
timertest.c \
printf.c \
stm32f10x_it.c \
./ParTest/ParTest.c \
./STCode/lcd_mb694.c \
./serial/serial.c \
$(ST_LIB_DIR)/src/stm32f10x_lib.c \
$(ST_LIB_DIR)/src/stm32f10x_rcc.c \
$(ST_LIB_DIR)/src/stm32f10x_gpio.c \
$(ST_LIB_DIR)/src/stm32f10x_spi.c \
$(ST_LIB_DIR)/src/stm32f10x_systick.c \
$(ST_LIB_DIR)/src/stm32f10x_tim.c \
$(ST_LIB_DIR)/src/stm32f10x_usart.c \
$(ST_LIB_DIR)/src/stm32f10x_nvic.c \
$(ST_LIB_DIR)/src/stm32f10x_fsmc.c \
$(ST_LIB_DIR)/src/stm32f10x_flash.c \
$(ST_USB_LIB_DIR)/src/usb_init.c \
$(ST_USB_LIB_DIR)/src/usb_regs.c \
$(ST_USB_LIB_DIR)/src/usb_mem.c \
$(ST_USB_LIB_DIR)/src/usb_int.c \
$(ST_USB_LIB_DIR)/src/usb_core.c \
$(ST_USBCODE_DIR)/usb_istr.c \
$(ST_USBCODE_DIR)/usb_desc.c \
$(ST_USBCODE_DIR)/usb_pwr.c \
$(ST_USBCODE_DIR)/usb_endp.c \
$(ST_USBCODE_DIR)/usb_prop.c \
$(ST_USBCODE_DIR)/hw_config.c \
$(DEMO_COMMON_DIR)/blocktim.c \
$(DEMO_COMMON_DIR)/death.c \
$(DEMO_COMMON_DIR)/flash.c \
$(DEMO_COMMON_DIR)/integer.c \
$(DEMO_COMMON_DIR)/PollQ.c \
$(DEMO_COMMON_DIR)/semtest.c \
$(RTOS_SOURCE_DIR)/list.c \
$(RTOS_SOURCE_DIR)/queue.c \
$(RTOS_SOURCE_DIR)/tasks.c \
$(RTOS_SOURCE_DIR)/portable/GCC/ARM_CM3/port.c \
$(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c

LIBS=

OBJS = $(SOURCE:.c=.o)

all: $(PROJECT_NAME).bin $(PROJECT_NAME).hex

$(PROJECT_NAME).bin : $(PROJECT_NAME).axf
$(OBJCOPY) $(PROJECT_NAME).axf -O binary $(PROJECT_NAME).bin

$(PROJECT_NAME).hex : $(PROJECT_NAME).axf
$(OBJCOPY) $(PROJECT_NAME).axf -O ihex $(PROJECT_NAME).hex

$(PROJECT_NAME).axf : $(OBJS) crt0_STM32x.o Makefile
$(CC) $(CFLAGS) $(OBJS) crt0_STM32x.o cortexm3_macro.s $(LIBS) $(LINKER_FLAGS)

$(OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
$(CC) -c $(CFLAGS) $< -o $@ crt0_STM32x.o : crt0_STM32x.c Makefile $(CC) -c $(CFLAGS) -O1 crt0_STM32x.c -o crt0_STM32x.o clean : rm $(OBJS) rm crt0_STM32x.o rm $(PROJECT_NAME).axf rm $(PROJECT_NAME).hex log : $(PROJECT_NAME).axf $(NM) -n $(PROJECT_NAME).axf > $(PROJECT_NAME)SymbolTable.txt
$(OBJDUMP) $(PROJECT_NAME).axf > $(PROJECT_NAME)MemoryListing.txt


コピーしたファイルは下記のとおり
../
usblib/
| hw_config.h
| platform_config.h
| usb_conf.h
| usb_desc.h
| usb_istr.h
| usb_prop.h
| usb_pwr.h
| hw_config.c
| usb_desc.c
| usb_endp.c
| usb_istr.c
| usb_prop.c
| usb_pwr.c

次はstm32f10x_conf.h に一行を追加します
#define _FLASH

最後はmain.cに必要なヘッドファイルを追加します
#include "usb_lib.h"
#include "usb_desc.h"
#include "usb_pwr.h"
#include "hw_config.h"

実機に確認しましたが、USB認識でもできません。
PIDとVIDをきちんと書きましたが、何で動かないの?
謎ですね...

2009年5月21日木曜日

RCCは???

RCCは?

typedef struct
{
vu32 CR;
vu32 CFGR;
vu32 CIR;
vu32 APB2RSTR;
vu32 APB1RSTR;
vu32 AHBENR;
vu32 APB2ENR;
vu32 APB1ENR;
vu32 BDCR;
vu32 CSR;
} RCC_TypeDef;

#define PERIPH_BASE ((u32)0x40000000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)

#ifdef _RCC
#define RCC ((RCC_TypeDef *) RCC_BASE)
#endif /*_RCC */

RCCのアドレスは0x40000000+0x20000+0x1000=0x40021000です

/* Flash registers base address */
#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000)

ここの0x40022000は何ですか?よくわからないですが…

ちなみに、上記の定義体が「STM32F10xFWLib/v2_0_3/inc/stm32f10x_map.h 」に載っています。

2009年5月17日日曜日

FreeRTOSとBlink

FreertosをCQ-STARAMに入れます〜〜〜

まず、ここから→ http://developers.stf12.net/linux-demo
勉強を始めます。

前のBlinkと同じように改修したいと思いますが、
demo_src_v1.0.tar.gz を展開して見たら、stm32_flash.ldのファイルはこういう風に書きました。

MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}


FLASHのサイズは512k、RAMは64K、それはOK
しかし、FLASHは0からは何って?0x08000000じゃありませんか?

2009年5月16日土曜日

DFUの初体験

今日はDFUを初体験しました。
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=964224&bbs_page_no=1&bbs_id=1032
を参照して、IAPのことをちょっとわかりました。
CQ-STARMで8000000から8002fffまではUSBのIAPです、ソースがSTMのUSBLIB中に含めっているみたい。

if (DFU_Button_Read() != 0x00)
{
   /* Test if user code is programmed starting from address 0x8003000 */
  if (((*(vu32*)0x8003000) & 0x2FFF0000 ) == 0x20000000)
  {
     /* Jump to user application */

    JumpAddress = *(vu32*) (ApplicationAddress + 4);
    Jump_To_Application = (pFunction) JumpAddress;
    /* Initialize user application's Stack Pointer */
    __MSR_MSP(*(vu32*) ApplicationAddress);
    Jump_To_Application();
  }
} /* Otherwise enters DFU mode to allow user to program his application */

これはPB9を判断して、0の場合が8003000にジャンプするのこと。
ということは、IAPの領域を潰せないように、自分のコードが8003000に入ればOK

blinkのサンプルを改造して、DFUよりCQ-STARMにダウンロードしてみたら、LEDがピカピカになった。 ^^b

次は、Freertosだ。。。

2009年5月15日金曜日

GCCビルド環境

Cortex-m3のGCCビルド環境について

今確認しているファイルはldファイルです。
中身がCPUのFLASHとRAM情報を入っているらしい。

たとえばLM3S811のldファイルは
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 8K
}
これはFlash領域が0から64kまでの意味?SRAMは8K?

じゃ、わたしのSTM32103の場合は
MEMORY
{
FLASH (rx) : ORIGIN = 0x8003000, LENGTH = 128k-12K
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}
本当ですかね。。。

を参照しましょう。