2010年12月16日 星期四

ARM7-TDMI 第一步 - 使用 Winbond W90P710CDG 記錄

一、系統已經內建 uCLinux,先學習在上面開發 AP。
二、主板開機後連接網路線(對接或透過HUB)
三、使用 IP-Search-Utility - Etm.exe 或其它方式查詢主板 IP。
四、telnet 進去主板,登入 admin 確定 uCLinux 有跑起來。
五、安裝 Virtual Box 及 linux-Demo.vdi. 下載網址 http://www.metavert.com/public/Virtual-Linux/
六、參照 http://www.metavert.com/public/htm-w90f/21-virtual_linux.htm 說明,設定 Virtual Box 並載入 linux-Demo.vdi,或自行摸索把 linux-Demo.vdi 建成虛擬機器就是了。
七、在 Virtual Box 中啟動 linux-Demo。(Ubuntu)
八、進入 Ubuntu 後查看虛擬電腦 ip 是不是跟主板在同一子網域,若沒則作修改。看要改主板或 Ubuntu 都可。
九、將範例 g03a.tar.gz 、上載工具 tools.tar.gz 及安裝 scripts install.sh 透過共享資料夾或其它方式上傳到 Ubuntu。
十、執行 install.sh (注意查看 scripts 內容 PRJ=xxx 是否正確)
十一、安裝成功會在 home 資料夾建立範例程式,並安裝好上載工具 eUpg90
十二、開發、編輯、編譯程式,產生 目的檔 i.e. example。(最好使用 Eclipse,開發環境都設定好了,只需將 example Import 進 project 即可,真方便)
十三、在 Ubuntu 命令列,切到目的檔所在目錄,下達「eUpg90 -file -a192.168.1.10 example /usr/example」指令將 example 上傳到主板的 /usr/example 。此處 192.168.1.10 是主板的 IP。(程式需透過 eUpg90 上載,用 ftp 上傳的不行,原因還不知)
十四、telnet 主板切至 /usr 目錄應會看到上載的程式 example,執行、驗證。Good!!
完成。

*到它內建的 www 首頁就有很多範例可供參考。

2010年12月4日 星期六

STM32 多個外部中斷設定方式(使用stm32f10x_lib)

一、打開 GPIO 時鐘及重映射功能時鐘。

/* System Clocks Configuration */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE );



二、打開/設定 外部中斷的 中斷套嵌。

/* NVIC configuration */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;
NVIC_Init(&NVIC_InitStructure);

注意:不同的外部中斷需各別使用 NVIC_Init() 函式來設定,不可以用「|」OR 運算來同時設定。


三、設置 GPIO 腳位、屬性。

/* Configure the GPIO ports */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOE, &GPIO_InitStructure);

注意:不同的 IO PORT 需各別使用 GPIO_Init() 函式來設定,但同一個 PORT 可以用「|」OR 運算來同時設定。


四、連結 外部中斷線 到 GPIO線(PIN0~PIN15)

/* Connect EXTI Line to GPIO Pin */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);

注意:不同 GPIO Pin 需各別使用 GPIO_EXTILineConfig() 函式來設定,不可以用「|」OR 運算來同時設定。


五、設置外部中斷反應方式並打開外部中斷

/* Configure EXTI Line to generate an interrupt on falling edge */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3;
EXTI_Init(&EXTI_InitStructure);

注意:所有的外部中斷可以使用一次/多次 EXTI_Init() 函式來設定,並可以用「|」OR 運算來同時設定。


六、最後在 stm32f10x_it.c 處理中斷函式…

void EXTIx_IRQHandler(void)
{
}

2010年12月2日 星期四

RL-ARM 使用 user timer 的方法

一、在 RTX_Config.c 修改 OS_TIMERCNT。(預設是 0 記得要修改)

#ifndef OS_TIMERCNT
#define OS_TIMERCNT 5
#endif


二、在 task 中建立 timer。

OS_ID tmr1;
tmr1 = os_tmr_create (300, 1); /// after 300 system_tick, callback.
if (tmr1 == NULL) {
printf ("Failed to create user timer.\n");
}


三、在 RTX_Config.c 修改 timer 的 callback 函式 os_tmr_call。

void os_tmr_call (U16 info) {
/* This function is called when the user timer has expired. Parameter */
/* 'info' holds the value, defined when the timer was created. */
/* HERE: include optional user code to be executed on timeout. */
}

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...