2015年12月24日 星期四

STM32 I2C Bootloader Test Code(MCU to MCU)

1. 與前一篇STM32 Usart Bootloader Test Code(MCU to MCU)相同, 只是將Usart的升級方式
    改為I2C.

2. 假想的被升級MCU為STM32F401, 因此我們一樣先去觀察stm32f401 datasheet, 從boot 
     mode章節可以看到支援I2C升級的有哪幾根GPIO.

3. Hardware Define:
  • Test Platform: stm32f401 discovery board
  • I2C SCL: PB6
  • I2C SDA: PB9
  • Boot0: PA15
  • Reset: PB5    

4. Mode of connection:
  • PB6 ->  Device_I2C_SCL(ex: PA8)
  • PB9 ->  Device_I2C_SDA(ex: PB4)
  • PA15 -> Device_Boot0
  • PB5 -> Devices_Reset
  • GND -> GND     

 5. Code flow:
  • Init: I2C1(pb6/pb9) & PA15(boot0) & PB5(reset)  & USB(vcp)  Initialize.
  • Main Flow:  等待USB(vcp)接收Binary file, 若接收完畢, 則開始將Binary file透過I2C1分段送出給Device.

6. Boot Mode Example(Get Version):
  • 接下來選擇一個I2C Boot Mode的get version範例講解, 從程式上看起來相當地簡單,送出2個bytes(0x01,0xfe)後, 接著確定是否有收到Ack.
  • 若是有收到Ack後, 便在讀取1byte version info, 並於讀取後, 再次檢查是否有收到Ack.
  • 為何要做這樣的流程呢? 主要是依照st所提供的文件來做好做滿, 如下圖是Get Version 的流程圖, 可以看到Host送出0x01 + 0xfe後,  並等待device是否有送出ack, 如果有的話, 則讀取1byte, 而這1byte便是bootloader version.


7. Test Flow:
  • 將硬體按照上面所述的與Device接好後, 則可以搭配tera term來接收binary file.

  • 需特別注意tera term在執行send file時候, 需記得勾選binary option.




8. Test Code Download Link:


9. Logic Analyzer Signal:

    LA (Please use Saleae Logic 1.2.5 Beta to Open)

2015年12月23日 星期三

STM32 Usart Bootloader Test Code(MCU to MCU)

1. 目前大部份的MCU升級韌體的方式大都是透過Linux平台寫入Bin檔, 所以可能比較少人會特
    地去接觸這一塊, 因此本範例使用MCU去升級MCU程式的方式來示範STM32 Usart
    Bootloader該如何使用.

2. 基本上每一顆STM32 MCU的升級方式都有些不同, 因此必須要先透過Datasheet來了解有哪
    幾種升級的方式, 由於本範例是建立在透過STM32F401 Discovery Board去升級其它的STM32
    MCU, 因此我們可以先假設使用STM32F401去升級STM32F401, 從F401 Datasheet上看起來,
    Usart Bootloader只支援Usart1(PA9/PA10), Usart2(PD5/PD6).


3. Hardware Define:

  • Test Platform: stm32f401 discovery board
  • Usart Tx: PA2
  • Usart Rx: PA3
  • Boot0: PA15
  • Reset: PB5    
4. Mode of connection:
  • PA2 ->  Device_Usart_Rx(ex: PA10)
  • PA3 ->  Device_Usart_Tx(ex: PA9)
  • PA15 -> Device_Boot0
  • PB5 -> Devices_Reset     
5. Code flow:
  • Init: Usart2(pa2/pa3) & PA15(boot0) & PB5(reset)  & USB(vcp)  Initialize.

  • Usart Init:  
    • baud rate: 115200.
    • data length: 9bit
    • stop bit: 1bit
    • parity: even         


  • Main Flow:  等待USB(vcp)接收Binary file, 若接收完畢, 則開始將Binary file透過Usart2分                        段送出給Device.

    6. Boot Mode Example(Get Version):
    • 接下來選擇一個Usart Boot Mode的get version範例講解, 從程式上看起來相當地簡單,送出2個bytes, 接著接收5個bytes.
    • 為何要這樣送2bytes又接收5bytes呢? 主要是依照st所提供的文件來做好做滿, 如下圖是Get Version 的流程圖, 可以看到Host送出0x01 + 0xfe後,  並等待device是否有送出ack, 如果有的話, 則連續接收5bytes, 而這5bytes的定義則都定義好了.

    7. Test Flow:
    • 將硬體按照上面所述的與Device接好後, 則可以搭配tera term來接收binary file.

    • 需特別注意tera term在執行send file時候, 需記得勾選binary option.




    8. Test Code Download Link:


    9. Logic Analyzer Signal:

        LA (Please use Saleae Logic 1.2.5 Beta to Open)

    2015年12月17日 星期四

    self balance electric scooter

    公司最近準備要切入平衡車市場了, 跟客戶拿了一台樣品回來改, 但是看起來路還很長呢...XD


    2015年12月12日 星期六

    STM32F4xx Software I2C Slave Test Code

    1. 既然有使用GPIO模擬的I2C Master, 當然也會有使用GPIO模擬的I2C Slave, 本範例是使用2塊
        STM32F401 Discovery Board模擬I2C Master/Slave來互相傳收資料, 由於預設的I2C GPIO是
        PB6和PB9, 因此我們必須將2塊Discovery Board的PB6/PB9互接.




    2. Master Main Flow:

    • I2C GPIO Init.
    • write one byte(0xEF) to slave.
    • write six bytes(0x12,0x34,0x56,0x78,0xAB,0xCD) to slave.
    • read one byte(0x55) from slave.
    • read six bytes(0x11,0x22,0x33,0x44,0x55,0x66) from slave.     

    3. Slave Main Flow:
    • 除了設定I2C GPIO外, 還需要利用Start Condition一個特性, SDA會由High to Low, 因此我們可以在SDA GPIO設定一個Falling edge Interrupt來偵測何時發生I2C傳輸.
    • slave discovery board address = 0x72.

    • 由於我們是使用SDA(PB9)來偵測Falling edge Interrupt, 所以我們必須使用STM32的EXTI9_5_IRQn來進行傳輸.

    4. Test Flow:(Logic analyzer)
    • write one byte to slave:

    • write six bytes to slave:
    • read one byte from slave:
    • read six bytes from slave:

    5. Test Code Download Link:

         Master

         Slave

    2015年12月11日 星期五

    STM32F4xx Software I2C Master Test Code

    1. I2C是目前相當多人使用的通訊介面, 但由於每個MCU的I2C設定皆不相同, 因此當要使用時,
       皆需要許多時間來先研讀之後, 才能可以使用.

    2. 因此若能使用一般的GPIO來模擬I2C SCL SDA的話, 那麼未來在各個MCU之間跨平台使用
        皆相當地方便, 因為只要簡單的設定GPIO High及Low之後, 即可馬上使用I2C介面來進行傳
        輸.
       

    3. Test Platform:
        STM32F401 Discovery Board, 從電路圖上看起來他預設的I2C GPIO是PB6(SCL)和PB9(SDA),
        且在I2C Bus上有掛載一顆LSM303DLHC Sensor.

    4. Main Flow:

    • I2C Software GPIO Init.
    • Systick Init(Delay).
    • Read LSM303DLHC ChipID(0x0F).
    • Write Enable Command to LSM303DLHC.



    5. Logic analyzer Signal:

    • Read LSM303DLHC ChipID

    • Write AXES ENABLE TO LSM303DLHC


    6. Example Code Download Link:
     
        STM32F4x1_Discovery_Software_I2C_Master_Test_Code

    2015年12月2日 星期三

    STM32F4 USB Host + FAT_FS Example Code

    1. 本範例是參考ST官方提供的stm32f429 discovery board的其中一個範例:
         LTDC_AnimatedPictureFromUSB來參考修改的, 如下圖所示, 將一個usb disk插入usb port後,
         可以在stm32f429 discovery board上內建的LCD顯示相關資訊.


    2. 由於我們使用的硬體為stm32f4x1 discovery board, 並沒有內建LCD螢幕, 因此呈現方式為使
        用stm32f4x1 discovery board + usb disk + fat fs, 透過fat fs在usb disk中寫入一個STM32.TXT
        檔.


    3. 在STM32.TXT檔中除了會寫入usb disk information外, 還可以寫入類似像log之類的user
         message.

    4. 測試方式可以參考影片:


    • 在尚未插入usb disk之前, discovery board上面的LEDs會採用旋轉的方式來輪流亮起.
    • 當插入usb disk, 且系統有偵測到的話, 則是不停地toggle LEDs, 此時並可以看到usb disk的讀寫燈會有間歇性的亮起, 代表有在寫入.
    • 在寫入的過程中, 如按下User Button, 則代表停止寫入, 並將file system關掉及re-mount usb disk.
    • 此時可以將usb disk與PC連接, 可以看到根目錄下會有一個STM32.TXT檔案.
    • 打開STM32.TXT檔案後可以看到usb disk相關的資訊, 以及我們測試的log message.


    5. 完整程式下載連結如下:
        stm32f4x1_discovery_usbhost_fatfs_example







    2015年11月30日 星期一

    STM32F4 Usart Polling/Interrupt/DMA Example Code

    1. 本範例是使用stm32f4x1 discovery board當做硬體測試平台, 搭配ttl to usb小板與pc之間溝通.

    2. stm32f4x1 discovery board上是選用PA2(Tx)及PA3(Rx)這2隻GPIO來當做Usart Tx/Rx, 因此所
        有的範例皆採用這2隻來進行測試.

    3. Usart Example Code共有底下4種測試程式, 分別是根據Tx及Rx可以設定的方式排列出來, 由
        於Rx polling mode於實際上非常少用, 所以就不進行測試了.

    • Tx: Polling, Rx: Interrupt.
    • Tx: Interrupt, Rx: Interrupt.
    • Tx: DMA, Rx:Interrupt.
    • Tx: DMA, Rx: DMA

    4. PC端的測試工具是使用Putty, baud rate預設是使用921600.



    5. 接線方式:
    • stm32f401 discovery board  PA2(Tx)  =>  ttl to usb小板 Rx
    • stm32f401 discovery board  PA3(Rx)  =>  ttl to usb小板 Tx
    • stm32f401 discovery board  GND  =>  ttl to usb小板 GND


    6. 範例的呈現方式皆是將鍵盤上輸入的字元原封不動地輸出, 也提供了兩個比對特定字串的範
        例, 如輸入'hello', 會出現'world', 輸入'justin', 會出現'wang', 且支援"Backspace"功能, 當輸入到
        一半時, 發現打錯字, 可以使用"Backspace"來更正輸入字串.



    7. 完整範例連結如下:

    2015年11月25日 星期三

    nRF52832 BLE Mouse Test(IAR EWARM Version)

    1. 跟之前提供的nRF52832 BLE Mouse Test範例功能完全相同, 只差在一個是Keil-MDK, 一個是
        IAR EWARM的版本而已.

    2. IAR EWARM Version完整範例下載連結:
        ble_app_hids_mouse_iar_ewarm

    3. 預設是使用DK(PCA10040)板子, 若需要改用Preview DK, 請將底下設定改為PCA10036.



    4. 測試影片如之前所示:


    2015年11月24日 星期二

    nRF52832 Errata Document

    1. 最近在nRF52832上面檢測一些問題, 發現怎麼樣都解不掉, 或是程式跑到一些function時, 一
        定會有飛掉的情況發生, 經詢問了代理商之後, 原來發現是IC本身的問題造成的.

    2. 目前拿在手上的板子有兩塊, 分別是Preview DK & DK這兩塊板子, 經上官網查詢才知道原來
        是這兩塊板子上面的都是工程樣品, 只是DK解掉了一些Preview DK的問題, 可以透過板子上
        的IC編號來得知自己手上拿到的是哪一個版本, 目前我手上Preview DK上面的是Engineering
        A(QFAA-AA), 而DK上面的是Engineering B(QFAA-BA).



    3. 現在看起來最新版本的IC是Rev 1, 不過不知道會上在哪一塊板子上, 或許是DK上面吧, 只是
        我手上拿到的剛好都是工程樣品, 若是發現有解不掉的問題或是遇到怎樣都無法啟動的功能,
        建議可以先上官網查一下是不是剛好是IC的問題, 以免浪費許多時間Debug.

    4. 官網查詢Link:  Errata v1.1 & v1.0

    2015年11月20日 星期五

    nRF52832 BLE Mouse Test

    1. 最近使用nRF52832做了airmouse相關的demo, 因此對於ble_app_hids_mouse這個example code
        有一些初步的了解.

    2. 本範例的執行結果是當藍芽滑鼠與PC配對成功後, 會不停地劃方, 且按下Button3會等同於按
        下滑鼠左鍵.

    3. 完整範例下載連結:
        nRF52_SDK_0.9.2_bt_mouse 

    4. 由於現在nRF52有Preview DK & DK兩塊板子, 因此在不同的開發板上要執行此程式, 須記得
        要修改define, 如使用Preview DK的話, 請修改為BOARD_PCA10036.
     


    5. 原先的範例如要傳送mouse button的資訊到PC的話, 需使用與mouse dx dy不同的id, 這樣會浪
        費BLE頻寬, 因此我有修改BLE Profile, 讓dx dy與button可以同時傳送給PC.

    6. main loop flow:

    • 程式一開始會先設定一個10msec的Timer, 利用這個Timer每次送一個Flag給main loop判斷何時要傳送dx dy & button給PC.
    • main loop則是不停地檢查mousetimerIsReady flag, 當發現為1時, 則去執行key scan & send dx dy.  



    • 劃方程式如下所示, 只是不斷地送出固定的dx dy座標給PC, 並配合key scan一同將結果送出去.

    7. Test Flow:

    • 當程式燒入DK Board後, 此時會看到LED1約間隔1秒的頻率在閃爍著.
    • 此時可以使用藍芽新增裝置來新增Nordic_Mouse.






    • 當新增完畢後, 便可以開始測試, 底下是使用Mouse Test2這個Tool進行測試的影片.