最近上淘寶買了一個很便宜的Jlink ARM OB, 剛好中間遇到過年, 所以等了快三週才收到,
簡單測試了一下真的是蠻方便使用的, 唯一美中不足的大概就是沒有把RESET Pin拉出來吧.
2016年2月23日 星期二
2016年2月19日 星期五
STM32F373/383 I2C Master Driver
1. 底下是stm32f373/stm32f383 I2C Master test code的簡易測試範例, 主要是利用I2C去
對L3GD20做I2C R/W的測試.
2. Main Loop:
對L3GD20做I2C R/W的測試.
2. Main Loop:
- Include I2C.h.
- Init I2C.
- Enable L3GD20 Normal Mode by I2C.(I2C Write)
- Get L3GD20 Chip ID.(I2C Read)
3. 測試波形如下:
- I2C Write:
4. I2C Driver Download Link:
2016年2月18日 星期四
bin2h tool
1. 有時候在執行一些bin file的操作時, 會很希望把bin file轉成hex buffer來操作, 剛好最近看到有
一個Tool就可以做到這件事情, 先趕快把它記錄下來.
2. 先到官方網站上去下載最新版Tool.
http://www.deadnode.org/sw/bin2h/
3. 接著將下載下來的bin2h.exe和希望轉換成hex buffer的bin file放在同一個目錄底下.
ex: 希望將SysTick_Example.bin轉換成hex buffer, 並存在 systick.h檔案裡面.
4. 開啟DOS Command模式, 到存放bin2h.exe和bin file檔案的路徑底下, 輸入以下command:
bin2h.exe -c -z <bin file name> output file name
ex: bin2h.exe -c -z <SysTick_Example.bin> systick.h
5. 轉換成功後, .h檔案會自己產生, 此時可以先用ultraedit檢查一下是否有轉換成功, 使用ultraedit
開啟SysTick_Example.bin後, 可以看到右下方有顯示bin file的大小, 以本範例來看是1560bytes.
6. 於是我們也利用ultraedit來打開systick.h看看, 打開後就會看到如下所示的hex buffer,
可以直接複製到project裡面使用, 而buffer size則在最下面.
7. 可以看到buffer size = 1560, 與我們從ultraedit上面觀察到的長度相同.
8. bin2h.exe and test files download link:
bin2h.exe
SysTick_Example.bin
systick.h
一個Tool就可以做到這件事情, 先趕快把它記錄下來.
2. 先到官方網站上去下載最新版Tool.
http://www.deadnode.org/sw/bin2h/
3. 接著將下載下來的bin2h.exe和希望轉換成hex buffer的bin file放在同一個目錄底下.
ex: 希望將SysTick_Example.bin轉換成hex buffer, 並存在 systick.h檔案裡面.
4. 開啟DOS Command模式, 到存放bin2h.exe和bin file檔案的路徑底下, 輸入以下command:
bin2h.exe -c -z <bin file name> output file name
ex: bin2h.exe -c -z <SysTick_Example.bin> systick.h
5. 轉換成功後, .h檔案會自己產生, 此時可以先用ultraedit檢查一下是否有轉換成功, 使用ultraedit
開啟SysTick_Example.bin後, 可以看到右下方有顯示bin file的大小, 以本範例來看是1560bytes.
6. 於是我們也利用ultraedit來打開systick.h看看, 打開後就會看到如下所示的hex buffer,
可以直接複製到project裡面使用, 而buffer size則在最下面.
7. 可以看到buffer size = 1560, 與我們從ultraedit上面觀察到的長度相同.
8. bin2h.exe and test files download link:
bin2h.exe
SysTick_Example.bin
systick.h
2016年2月15日 星期一
2016年2月3日 星期三
nRF51x22 Simple KeyScan
1. Test Schematic: (KEY1 = GPIO25)
2. Button.c
--------------------------------------------------------------------------------------------------------------------
3. Button.h
---------------------------------------------------------------------------------------------------------------------
2. Button.c
--------------------------------------------------------------------------------------------------------------------
#include "Button.h" uint16_t DebounceKeyCnt = 0; uint8_t KeyValue = 0; uint8_t KeyState = 0; void Button_Init(void) { nrf_gpio_pin_dir_set(Button_GPIO_Pin,NRF_GPIO_PIN_DIR_INPUT); //configurate pin direction to input nrf_gpio_cfg_input(Button_GPIO_Pin, NRF_GPIO_PIN_PULLUP); //pull-up } uint8_t KeyScan(void) { KeyValue = nrf_gpio_pin_read(Button_GPIO_Pin); #ifdef high_active KeyValue = KeyValue; //active high #endif #ifdef low_active KeyValue = !(KeyValue); //active low #endif if(KeyValue >= 1) { DebounceKeyCnt++; if(DebounceKeyCnt >= 5) { DebounceKeyCnt = 0; KeyState = 1; } } else { DebounceKeyCnt = 0; KeyState = 0; } return(KeyState); }
3. Button.h
---------------------------------------------------------------------------------------------------------------------
#include "nrf_drv_gpiote.h"
#define Button_GPIO_Pin 25
#if 0
#define high_active
#else
#define low_active
#endif
void Button_Init(void);
uint8_t KeyScan(void);
nRF51x22 Simple Timer Code
1. 定義一個固定時間觸發的Timer.
2. 只需要Timer Init 和 Timer Handler這兩個function就可以用了.
Timer Init:
-------------------------------------------------------------------------------------------------------------------------
Timer Handler:
-------------------------------------------------------------------------------------------------------------------------
2. 只需要Timer Init 和 Timer Handler這兩個function就可以用了.
Timer Init:
-------------------------------------------------------------------------------------------------------------------------
void Timer_Init(int32_t deltatime) { NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; //Set counter to 16 bit resolution NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer; NRF_TIMER2->PRESCALER = 9; //16MHz/(2^9) = 16MHz/512 = 31250Hz = 32usec NRF_TIMER2->CC[2] = (deltatime/32); //250 = 8msec , 500 = 16msec NRF_TIMER2->INTENSET = TIMER_INTENSET_COMPARE2_Enabled << TIMER_INTENSET_COMPARE2_Pos; NRF_TIMER2->SHORTS = (TIMER_SHORTS_COMPARE1_CLEAR_Enabled << TIMER_SHORTS_COMPARE1_CLEAR_Pos); NVIC_ClearPendingIRQ(TIMER2_IRQn); NVIC_SetPriority(TIMER2_IRQn,3); NVIC_EnableIRQ(TIMER2_IRQn); NRF_TIMER2->TASKS_START = 1; }
Timer Handler:
-------------------------------------------------------------------------------------------------------------------------
void TIMER2_IRQHandler(void) { if((NRF_TIMER2->EVENTS_COMPARE[2] == 1) && (NRF_TIMER2->INTENSET & TIMER_INTENSET_COMPARE2_Msk)) { NRF_TIMER2->EVENTS_COMPARE[2] = 0; //nrf_gpio_pin_toggle(20); //debug gpio NRF_TIMER2->TASKS_CLEAR = 1; } }3. 假設需要定義一個固定每10msec會觸發的Timer, 可以在Init的時候帶入這樣的參數. Timer_Init(10000);
2016年2月2日 星期二
nRF51x22 I2C Master Driver
1. 最近開始接觸nRF51x22系列的東西, 真的是有點小複雜, 因此就把最近弄好的一些東西先簡
易備份在Blogger上, 以方便之後有需要的時候容易能馬上使用.
2. 使用I2C Master Driver之前, 必須要先include以下的c & h file, 才能正常使用, 檔名及路徑如
下:
易備份在Blogger上, 以方便之後有需要的時候容易能馬上使用.
2. 使用I2C Master Driver之前, 必須要先include以下的c & h file, 才能正常使用, 檔名及路徑如
下:
- 測試的版本皆是在nRF51_SDK_9.0.0_2e23562.zip這個sdk版本下進行測試的.
- twi_hw_master.c:
\components\drivers_nrf\twi_master\incubated\
- twi_master.h:
\components\drivers_nrf\twi_master\incubated\
- twi_master_config.h:
\components\drivers_nrf\twi_master\incubated\config\
3. 接著就是使用底下的i2c.c & i2c.h 這兩個檔案就可以使用了.
i2c.c:
--------------------------------------------------------------------------------------------------------------------------
i2c.h:
--------------------------------------------------------------------------------------------------------------------------
i2c.c:
--------------------------------------------------------------------------------------------------------------------------
#include "i2c.h" void I2C_Master_Init(void) { twi_master_init(); } int I2C_Write(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer, uint16_t NumByteToWrite) { #define i2c_write_data_len 6 uint8_t w2_data[i2c_write_data_len+1], i; w2_data[0] = RegAddr; for ( i = 0 ; i < NumByteToWrite ; i++ ) { w2_data[i +1] = pBuffer[i]; } if(twi_master_transfer(DeviceAddr,w2_data,NumByteToWrite+1,TWI_ISSUE_STOP) == false) return -1; return 0; } int I2C_Read(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer, uint16_t NumByteToRead) { if(twi_master_transfer(DeviceAddr, &RegAddr, 1, TWI_DONT_ISSUE_STOP) == false) return -1; if(twi_master_transfer(DeviceAddr|TWI_READ_BIT, pBuffer, NumByteToRead, TWI_ISSUE_STOP) == false) return -1; return 0; }
i2c.h:
--------------------------------------------------------------------------------------------------------------------------
#include "twi_master.h" void I2C_Master_Init(void); int I2C_Write(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer, uint16_t NumByteToWrite); int I2C_Read(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer, uint16_t NumByteToRead);
4. 調整i2c speed的地方在twi_master_init()裡面:
訂閱:
文章 (Atom)