2009年9月16日水曜日

xclexeのリリース

I made the program for clipboard extension of Linux

everything xclexe can do is just keep watching the clipboard , and throw it to specific application by the rule.
Don't worry about you are no idea of the rule. Just execute it, and then you will get the sample under the $HOME/.xclexe

[global]
#x=50
#y=50
#width=840
#height=70
#border_width=2

[exec]
#PATH=/usr/bin/ed2k
#KEYWORD=ed2k:
#FLAG=1

There are 2 section in rule file, The first one is [global], you can define the windows size and position at here.
And second one is [exec], you can define the specific application rule at here. if you have one more rule just need to append a new [exec] section.

For example.
[exec]
PATH=/usr/bin/ed2k
KEYWORD=ed2k:
FLAG=1

PATH means specific application path.
KEYWORD means the keyword of clipboard content.
FLAG means searching rule, 1 means check the content head, 2 means check the content end, 0 - means search the keyword.

The sample means keep check the clipboard content, if the content begin with "edk2:" string,
Then clipboard content would be the first parameter execute by the /usr/bin/ed2k.
Translate to the comand line is:
/usr/bin/ed2k

BTW, # means comment out.

enjoy it!

you can download the sources from the URL
http://file7.brsbox.com/download.php?sid=cd48f0bb55ece2d19cb4329a866bfbab&fc=e63d5a4a126d0ad675631a5688bdf375/xclexe.tar.gz

2009年8月13日木曜日

Cortextと関係ないですが(その1)

子供を生まれったので、最近はものすごく忙しくで、せかくstm32f107のチープをもらったのに、試しの時間もなくなった...
父は大変よ~~~
まぁ~~最近linuxの仕事ばかりやっているので、Linuxの情報をメモしたいと思う

①Fedora11のSELINUXを止まれ
# vi /etc/sysconfig/selinux
SELINUX=disabled
保存してから再起動

②Fedora11でiptableを止まれ
# /etc/init.d/iptables stop

③Fedora11でWineで作ったプログラムをサービスとして登録
スクリプトのサンプルが下記の通り
#!/bin/bash
# chkconfig: 35 99 1
# 上記の一行はchkconfig専用、ない登録できない
progname=service

# wineのプログラムをデーモンで実行させるように、作ったプログラム、ソースは面倒から添付しない
# 原理は簡単、fork関数だけ
wineloader=/usr/local/bin/wineloader

#サービスのパス
prog=/usr/local/bin/service

# wineがrootで実行すると、かなり危険ので、通常のユーザで登録
user=kevinx

# Source function library.
#このファイルにいい関数がいっぱい入っている、Fedora11特有
. /etc/init.d/functions

RETVAL=0

start() {
echo -n $"Starting $progname: "
daemon --user $user $wineloader -e $prog
RETVAL=$?
return $RETVAL
}

stop() {
echo -n $"Stopping $progname: "
killproc $prog
RETVAL=$?
return $RETVAL
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac

exit $RETVAL

登録命令
chkconfig --add service

スクリプトの参照URLは
http://www.geocities.co.jp/SiliconValley-Cupertino/9120/startup.html
http://surf.ap.seikei.ac.jp/~nakano/linux/init.d.html
wineloaderの参照URLは
http://d.hatena.ne.jp/rero/20041002/p1

つづく...

2009年7月4日土曜日

Linuxのusb sniffer

昔Windowsの場合、USBのドライバを開発するとき、BUS Houndを使ってUSB通信パケットをキャプチャできるんですが、今Linuxの環境で同じようなものを探します。
結局、カーネルでCONFIG_DEBUG_FSとCONFIG_USB_MONのオプションを有効すれば、何もインストールしなくでも簡単にできるです。
命令が下記のとおり:
# mount -t debugfs none /sys/kernel/debug
# cat /sys/kernel/debug/usbmon/0u
ここ0uの意味は全通信を監視
特定のデバイスを監視の場合が、そのデバイス対応しているの番号を使います。
ちなみに、番号確認命令はlsusbです。
詳しい情報が下記のURLを参照
http://pylone.jp/blog/tips_usbmon

2009年6月30日火曜日

VIMが大好き!

最初はVIMのこと使いにくいと思いました。
少しつつ勉強しながら、大好きになりました。
やはり、メインキーボードだけ、なんでもできるのはかっこういいでしょう ^^

VIMでtagの使い方を探していた時、下記のURLを見つかりました。
ありがとう、勉強になりました!

2009年6月26日金曜日

NVICの優先順位について

ここ参照します。
http://blog.ednchina.com/STM32/143803/message.aspx

簡単に言えば、STM32の優先グループが五つのモードがあります。

/* 0 bits for pre-emption priority 4 bits for subpriority */
#define NVIC_PriorityGroup_0 ((u32)0x700)

/* 1 bits for pre-emption priority 3 bits for subpriority */
#define NVIC_PriorityGroup_1 ((u32)0x600)

/* 2 bits for pre-emption priority 2 bits for subpriority */
#define NVIC_PriorityGroup_2 ((u32)0x500)

/* 3 bits for pre-emption priority 1 bits for subpriority */
#define NVIC_PriorityGroup_3 ((u32)0x400)

/* 4 bits for pre-emption priority 0 bits for subpriority */
#define NVIC_PriorityGroup_4 ((u32)0x300)

割り込みを発生する時、優先順位高いの関数が優先順位低いの関数を中断して先に実行する。

pre-emptionの数字が低いの方が優先順位が高い、例えば:0が1より優先が高い。
pre-emptionは同じの場合、subpriorityの数字を確認する、小さいの方が高い。

わたしのコードが下記を示す

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN_RX0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);

/* Enable the DMA1 Channel1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

優先1、USART1
優先2、USB
優先3、DMA1

2009年6月22日月曜日

ADCのサンプルコード

ANALOG INPUT:PA.4(ADC_AIN_CHANNEL_X)、PC.4(ADC_AIN_CHANNEL_Y)、PC.5(ADC_AIN_CHANNEL_Z)
DMA1を利用して、X Y Z情報がADC1_DR_AddressからADC_ConvertedValueXに自動保存します。
ADC_ConvertedValueX[0]=X
ADC_ConvertedValueX[1]=Y
ADC_ConvertedValueX[2]=Z

サンプルコードが下記に示す。

void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

/* Enable DMA1 clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* Enable ADC1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

/* DMA1 channel1 configuration ---------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValueX[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 3;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;/*DMA_MemoryInc_Disable;*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

/* Enable the DMA1 Channel1 Transfer complete interrupt */
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);

/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 3;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channel configuration */
ADC_RegularChannelConfig(ADC1, ADC_AIN_CHANNEL_X, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_AIN_CHANNEL_Y, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_AIN_CHANNEL_Z, 3, ADC_SampleTime_55Cycles5);

/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));

/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);

/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
}

今、OpenJTAGを使ってデバック環境でX、Y、Z情報をきちんと取りますが、デバッグ以外の場合がDMA1の割り込みを発生しません。
何で?

2009年6月12日金曜日

MAX3232の接続方式

こんな感じです、正しいはずなんですが、何か動かない…

2009年6月8日月曜日

Virtual Com Portがやっとできました ^_^

STM32の割り込みサービスルーチン(stm32f10x_it)が更新していないのせいだ、
割り込み関数正しく処理されていませんので、USBデバイスが認識をできなくなた。

hw_config.cにNVICの定義が下記の通り

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN_RX0_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

で、今のstm32f10x_itにこの割り込み関数が空っぽだ。
void USB_LP_CAN_RX0_IRQHandler(void)
{
}

stm32f10x_itを調整して(crt0_STM32xが古いので、調整も必要です)
void USB_LP_CAN_RX0_IRQHandler(void)
{
  USB_Istr();
}

OpenJTAGを外して、ボードだけPCに挿入してみると、デバイスが見つかりました!

USB認識には、OpenJTAGが直接使わないですが、
でもおかげで、あやし所を確認できました、JTAGがいいものですね ^^


2009年6月5日金曜日

工欲善其事,必先利其器

今日は開発環境構築について、参照した資料を整理します。
◆ CodeSourcery G++
◆ Openocd
私の場合が安定のためバージョン1690をインストールした
./configure --enable-ft2232_libftdi --enable-usbprog
◆ Eclipse
 GDB Hardware Debuggingの導入:
◆ OpenJTAG
◆ FreeRTOSの導入

これから、シリアルとUSBを検証したいので、下記の資料が探す

以上


2009年6月4日木曜日

Eclipse & RTOSDemo

FreeRTOSがEclipseに導入の参照資料:

JTAGKey-Tinyの設定資料:

今回OpenJtagを利用したいので、Eclipse環境にopenocdの設定ファイルを改造することを必要と思う
openocdの設定ファイルは四つがあります。
◆ jtagkey.cfg
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666

# interface configuration
interface ft2232
#ft2232_device_desc "Amontec JTAGkey A"
ft2232_device_desc "USB<=>JTAG&RS232
#ft2232_layout jtagkey
ft2232_layout "jtagkey_prototype_v1
#ft2232_vid_pid 0x0403 0xcff8
ft2232_vid_pid 0x1457 0x511

#jtag_speed 30
#jtag_khz 500

◆ stm32_mdBZ.cfg
# for stm32 medium density RevB and Z

set _CHIPNAME stm32
set _ENDIAN little

# jtag speed
#jtag_khz 565

reset_config trst_and_srst srst_pulls_trst
jtag_nsrst_delay 100
jtag_ntrst_delay 100

#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst

#jtag scan chain
if { [info exists CPUTAPID ] } {
set _CPUTAPID $CPUTAPID
} else {
# See STM Document RM0008
# Section 26.6.3
set _CPUTAPID 0x3ba00477
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

if { [info exists BSTAPID ] } {
set _BSTAPID $BSTAPID
} else {
# See STM Document RM0008
# Section 26.6.2
# Medium Density RevA
# set _BSTAPID 0x06410041
# Rev B and Rev Z
# set _BSTAPID 0x16410041
# My board is a Rev B and Rev Z
set _BSTAPID 0x16410041
}
jtag newtap $_CHIPNAME bs -irlen 5 -ircapture 0x1 -irmask 0x1 -expected-id $_BSTAPID

set _TARGETNAME [format "%s.cpu" $_CHIPNAME]
target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x20000000 -work-area-size 16384 -work-area-backup 0

#flash bank stm32x 0 0 0 0 0
#The flash of my board is start from 0x8000000 and length is 128k
flash bank stm32x 0x08000000 0x20000 0 0 0

# For more information about the configuration files, take a look at:
# openocd.texi

◆ stm32_gdb.cfg
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666

init
jtag_khz 565
#reset init
verify_ircapture disable

◆ stm32_program_eclipse.cfg
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666

init
jtag_khz 565
#reset init
verify_ircapture disable

halt
wait halt
poll
stm32x mass_erase 0
#flash write_image C:/Projects/FreeRTOS/Demo/CORTEX_STM32Fxxx_Eclipse/RTOSDemo/RTOSDemo.bin 0x08000000 bin
flash write_image ./RTOSDemo/RTOSDemo.bin 0x8000000 bin
reset run
shutdown

STM32に書き込み場合が Run -> Externels Tools -> OpenOCD Programmerを使います。
デバックの場合が Run -> Externels Tools -> OpenOCD Serverを利用します。

Eclipse+OpenOCD+OpenJTAG+STM32の開発環境ができました!

d^_^b

2009年6月3日水曜日

zylincdtについて

Eclipse環境構築すると、大体二つの方式があります、
ELFファイルによってデバッグするの場合がzylincdtになります。
今回zylinを利用するつもりはないですが、一応メモします。

Eclipse CDT plugin | Eclipse update site | Mini FAQ
Zylin Embedded CDT
Zylin-embedded CDT works with the official Eclipse CDT 4.x or newer.

From time to time Zylin has some patches to CDT that are not yet part of the official CDT CVS HEAD. Normally there is also a bug report sent to CDT for each of the issues. These "work-in-progress-at-your-own-risk-thus-warned-patches" are kept in cdtpatches.txt together with the Zylin Embedded CDT source code.
Download & installation

   1. Install Eclipse 3.3 or newer. We recommend the Eclipse Classic 3.x package

      http://www.eclipse.org
   2. Eclipse CDT 4.x or newer

      http://www.eclipse.org/cdt
   3. Install Zylin-embedded CDT using, the update site

      http://opensource.zylin.com/zylincdt 

If you are unfamiliar with Eclipse update sites, Subclipse provides helpful instructions. page:

http://subclipse.tigris.org/install.html 

OpenJTAGの2

openocd.cfgを下記のように修正した

telnet_port 4444
gdb_port 3333
gdb_memory_map enable
gdb_flash_program enable
interface ft2232
jtag_speed 1
ft2232_vid_pid 0x1457 0x5118
ft2232_latency 2
ft2232_layout "jtagkey_prototype_v1"
reset_config trst_and_srst

# script for stm32

# jtag speed
jtag_khz 500

jtag_nsrst_delay 100
jtag_ntrst_delay 100

reset_config trst_and_srst

jtag_device 4 0x1 0xf 0xe
jtag_device 5 0x1 0x1 0x1e

target create target0 cortex_m3 -endian little -chain-position 0

[new_target_name] configure -work-area-virt 0 -work-area-phys 0x20000000 -work-area-size 16384 -work-area-backup 0

flash bank stm32x 0x08000000 0x20000 0 0 0

openocdを実行する
kevinx@Ubuntu:~/workspace$ openocd
Open On-Chip Debugger 1.0 (2008-11-26-09:42) svn:unknown


BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS


$URL: http://svn.berlios.de/svnroot/repos/openocd/trunk/src/openocd.c $
jtag_speed: 1
500 kHz
Info: JTAG device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xba00, Version: 0x3)
Info: JTAG device found: 0x16410041 (Manufacturer: 0x020, Part: 0x6410, Version: 0x1)
Warning:no tcl port specified, using default port 6666

telnetに確認

kevinx@Ubuntu:~/workspace$ telnet 127.0.0.1 4444
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Open On-Chip Debugger
> poll
target state: unknown
> halt
target was in unknown state when halt was requested
> resume
> poll
target state: running
>

よくわからないですが、openocdができました!

2009年6月2日火曜日

OpenJTAGの1

今日はOpenJtagを試しました。
PCに接続してみたら

kevinx@Ubuntu:~/workspace$ openocd
Open On-Chip Debugger 1.0 (2008-10-04-09:26) svn:717
$URL: svn://svn.berlios.de/openocd/trunk/src/openocd.c $
Info: options.c:50 configuration_output_handler(): jtag_speed: 0, 0
Info: options.c:50 configuration_output_handler(): Open On-Chip Debugger 1.0 (2008-10-04-09:26) svn:717
Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xba00, Version: 0x3)
Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x16410041 (Manufacturer: 0x020, Part: 0x6410, Version: 0x1)
Error: jtag.c:1399 jtag_examine_chain(): number of discovered devices in JTAG chain (2) doesn't match configuration (1)
Error: jtag.c:1400 jtag_examine_chain(): check the config file and ensure proper JTAG communication (connections, speed, ...)
Error: jtag.c:1556 jtag_init_inner(): trying to validate configured JTAG chain anyway...
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1565 jtag_init_inner(): Could not validate JTAG chain, exit
Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xba00, Version: 0x3)
Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x16410041 (Manufacturer: 0x020, Part: 0x6410, Version: 0x1)
Error: jtag.c:1399 jtag_examine_chain(): number of discovered devices in JTAG chain (2) doesn't match configuration (1)
Error: jtag.c:1400 jtag_examine_chain(): check the config file and ensure proper JTAG communication (connections, speed, ...)
Error: jtag.c:1556 jtag_init_inner(): trying to validate configured JTAG chain anyway...
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IR mismatch, scan returned 0x11
Error: jtag.c:1565 jtag_init_inner(): Could not validate JTAG chain, exit

設定ファイルっぽいですね。
kevinx@Ubuntu:~/workspace$ more openocd.cfg
telnet_port 4444
gdb_port 3333
interface ft2232
jtag_speed 0
ft2232_vid_pid 0x1457 0x5118
ft2232_layout "jtagkey_prototype_v1"
reset_config trst_and_srst
jtag_device 4 0x1 0xf 0xe
daemon_startup attach
target arm920t little reset_run 0 arm920t
#arm7_9 fast_memory_access enable
working_area 0 0x200000 0x4000 backup
#flash bank cfi 0 0x100000 2 2 0
#debug_level 3
nand device s3c2440 0
run_and_halt_time 0 5000
ft2232_device_desc "USB<=>JTAG&RS232"

今回のターゲットはcortex-m3ですので、target arm920t はもちろんダメじゃないですか...
正しいの設定は何だろうかな...

2009年6月1日月曜日

Flash module organization (high-density devices)

RCC - register map and reset values

Control/status register (RCC_CSR)







Address: 0x24
Reset value: 0x0C00 0000, reset by system Reset, except reset flags by power Reset only.
Access: 0 ≤ wait state ≤ 3, word, half-word and byte access
Wait states are inserted in case of successive accesses to this register.

Backup domain control register (RCC_BDCR)







Address offset: 0x20
Reset value: 0x0000 0000, reset by Backup domain Reset.
Access: 0 ≤ wait state ≤ 3, word, half-word and byte access
Wait states are inserted in case of successive accesses to this register.
Note: LSEON, LSEBYP, RTCSEL and RTCEN bits of the Backup domain control register
(RCC_BDCR) are in the Backup domain. As a result, after Reset, these bits are writeprotected
and the DBP bit in the Power control register (PWR_CR) has to be set before
these can be modified. Refer to Section 5 on page 58 for further information. These bits are
only reset after a Backup domain Reset (see Section 6.1.3: Backup domain reset). Any
internal or external Reset will not have any effect on these bits.

APB1 peripheral clock enable register (RCC_APB1ENR)







Address: 0x1C
Reset value: 0x0000 0000
Access: word, half-word and byte access
No wait state, except if the access occurs while an access to a peripheral on APB1 domain
is on going. In this case, wait states are inserted until this access to APB1 peripheral is
finished.
Note: When the peripheral clock is not active, the peripheral register values may not be readable
by software and the returned value is always 0x0.

APB2 peripheral clock enable register (RCC_APB2ENR)






Address: 0x18
Reset value: 0x0000 0000
Access: word, half-word and byte access
No wait states, except if the access occurs while an access to a peripheral in the APB2
domain is on going. In this case, wait states are inserted until the access to APB2 peripheral
is finished.
Note: When the peripheral clock is not active, the peripheral register values may not be readable
by software and the returned value is always 0x0.

AHB peripheral clock enable register (RCC_AHBENR)







Address offset: 0x14
Reset value: 0x0000 0014
Access: no wait state, word, half-word and byte access
Note: When the peripheral clock is not active,the peripheral register values may not be readable
by software and the returned value is always 0x0.

APB1 peripheral reset register (RCC_APB1RSTR)







Address offset: 0x10
Reset value: 0x0000 0000
Access: no wait state, word, half-word and byte access

APB2 peripheral reset register (RCC_APB2RSTR)






Address offset: 0x0C
Reset value: 0x00000 0000
Access: no wait state, word, half-word and byte access

Clock interrupt register (RCC_CIR)







Address offset: 0x08
Reset value: 0x0000 0000
Access: no wait state, word, half-word and byte access

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
}
本当ですかね。。。

を参照しましょう。