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