CẨM NANG STM32 CĂN BẢN CẦN BIẾT–SPI Flash – Demo

Demo

Lý thuyết, ta đã nói quá nhiều rồi; giờ bắt tay vào thực hành nào! Hãy build chương trình nếu bạn chưa có (trong thư mục ~/stm32f103c8t6/rtos/winbond):

$ make clobber
$ make
...
arm-none-eabi-size main.elf
   text   data    bss    dec    hex    filename
  17376   1472  18104  36952   9058    main.elf

Nối bộ lập trình vào, và thực hiện các lệnh sau:

$ make flash
/usr/local/bin/st-flash  write main.bin 0x8000000
st-flash 1.3.1-9-gc04df7f-dirty
2017-11-04T10:03:37 INFO src/usb.c: -- exit_dfu_mode
2017-11-04T10:03:37 INFO src/common.c: Loading device parameters....
...
2017-11-04T10:03:39 INFO src/common.c: Starting verification of write
  complete
2017-11-04T10:03:39 INFO src/common.c: Flash written and verified!
  jolly good!

Khi thiết bị STM32 được flash xong, rút bộ lập trình ra trước tiên (quan trọng), rồi nối cáp USB giữa STM32 và máy tính của bạn. Tôi đang sử dụng minicom như là chương trình terminal ở đây, nhưng bạn có thể sử dụng chương trình khác nếu bạn thích. Để kết nối qua USB, bạn sẽ cần tìm tên thiết bị để sử dụng. Xem lại Chương 7, “USB Serial”, nếu bạn cần hướng dẫn cách thực hiện.

Mẹo   Nếu minicom của bạn được cài đặt để thư mục lưu mặc định yêu cầu quyền root, bạn có thể muốn sử dụng sudo minicom -s.

Để thiết lập minicom để sử dụng, hãy sử dụng như sau:

$ minicom -s

This brings up the following dialog:

            +-----[configuration]------+
            | Filenames and paths      |
            | File transfer protocols  |
            | Serial port setup        |<--- choose
            | Modem and dialing        |
            | Screen and keyboard      |
            | Save setup as dfl        |
            | Save setup as..          |
            | Exit                     |
            | Exit from Minicom        |
            +--------------------------+

Choose ” Serial port setup ” by using the cursor down key. Then, a setup dialog is shown, as follows:

+---------------------------------------------------------------+
| A -    Serial Device      : /dev/cu.usbserial-A100MX3L        |
| B - Lockfile Location     : /usr/local/Cellar/minicom/2.7/var |
| C -   Callin Program      :                                   |
| D -  Callout Program      :                                   |
| E -    Bps/Par/Bits       : 2400 8O1                          |
| F - Hardware Flow Control : No                                |
| G - Software Flow Control : No                                |
|                                                               |
|    Change which setting?                                      |
+---------------------------------------------------------------+

Nhập “A” và nhập tên đường dẫn thiết bị cho thiết bị USB của bạn. Các cài đặt còn lại không quan trọng. Nhấn Return (hoặc Enter) để kết thúc hộp thoại đó, sau đó lưu các cài đặt đó bằng cách chọn “Save setup as…” Tôi dùng tên “usb”. Lưu cài đặt của bạn sẽ giúp bạn tiết kiệm thời gian trong các chương sau của cuốn sách này.

Thoát ra khỏi minicom bằng cách chọn “Exit from minicom.” Nếu bạn chọn “Exit” thay vào đó để nó không bị lỗi về dòng lệnh, bạn có thể cần phải sử dụng phím tắt Esc-X (hoặc Control-A X) để thoát.

=> Bài viết được trích từ sách : Cẩm nang STM32 (tập 1)

Chạy bản Demo

Khi thiết lập minicom xong, bạn có thể cắm cáp USB của STM32 và khởi động minicom (theo trình tự đó). Sử dụng tên cài đặt đã lưu của bạn làm đối số trên dòng lệnh minicom (tôi đã sử dụng “usb” tại đây):

$ minicom usb

Khi kết nối qua USB với STM32 của bạn, minicom sẽ hiển thị:

Welcome to minicom 2.7

OPTIONS:

Compiled on Sep 17 2016, 05:53:15.

Port /dev/cu.usbmodemWGDEM1, 10:17:40

Press Meta-Z for help on special keys

Bây giờ chúng ta có thể giao tiếp với STM32. Nhấn Return (hoặc Enter) để code demo hiển thị menu sau:

Winbond Flash Menu:

0 ... Power down
  1 ... Power on
  a ... Set address
  d ... Dump page
  e ... Erase (Sector/Block/64K/Chip)
  i ... Manufacture/Device info
  h ... Ready to load Intel hex
  j ... JEDEC ID info
  r ... Read byte
  p ... Program byte(s)
  s ... Flash status
  u ... Read unique ID
  w ... Write Enable
  x ... Write protect
Address: 000000

Nhấn một ký tự bất kỳ (không trùng với các ký tự đã được chọn làm tên lệnh), hoặc nhấn Return (hoặc Enter) sẽ khiến menu này được hiển thị lại. Điều đầu tiên cần làm là xem liệu chúng ta có thể đọc trạng thái của thiết bị flash hay không. Nhấn “s” (hoặc “S”) để đọc trạng thái:

: S
SR1 = 00 (write protected)
SR2 = 00

Chương trình demo báo cáo (thanh ghi) SR1 của W25Q25 là hex 00 và SR2 là 00. Nếu bạn nhìn thấy FF thay vào đó, thì bạn có thể không thể giao tiếp qua SPI đúng cách.

Để Write Enable (cho phép ghi), nhấn “W”:

: W
SR1 = 02 (write enabled)
SR2 = 00

Từ đây, bạn có thể thấy rằng SR1 của thiết bị flash giờ đây đọc là hex 02, cho biết rằng thanh ghi bây giờ đã được bật. Với chức năng ghi được bật, bạn có thể thực hiện xóa chip (nhấn “E”):

: E
Erase what?
  s ... Erase 4K sector
  b ... Erase 32K block
  z ... Erase 64K block
  c ... Erase entire chip
anything else to cancel
: c
Erasing chip..
Chip erased!

Đừng ngạc nhiên nếu quá trình xóa mất vài giây. Đó là một công việc “vất vả”, nhưng ai đó phải làm điều đó. Đó không phải là phần mềm bị treo, mà chỉ là chip Winbond hoạt động hết công suất.

Bây giờ, hãy đặt địa chỉ và kiểm tra xem chip có thực sự bị xóa hay không. Nhập “A” và nhập số không, sau đó là Return (Enter):

: A
Address: 0
Address: 000000
Giờ, thử xuất đầy một trang (page: 256 byte) bằng cách gõ “D”:
: D
000000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000030 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000070 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000080 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000090 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
0000A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
0000B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
0000C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
0000D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
0000E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
0000F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
Address: 000100

Điều đó dường như xác nhận thao tác xóa, ít nhất là trang 0. Lưu ý rằng địa chỉ đã được tăng lên bởi một trang, do đó, các lần nhấn tiếp theo “D” sẽ cho phép hiển thị các trang kế tiếp.

Bây giờ, hãy ghi vài byte. Theo dõi phiên được hiển thị:

: W
SR1 = 02 (write enabled)
SR2 = 00
: A
Address: 0
Address: 000000
: P
$000000 AA BB CC DD EE
$000005 5 bytes written.
: D
000000 AA BB CC DD EE FF FF FF FF FF FF FF FF FF FF FF ................
000010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................

Trong phiên, chúng ta đặt lại địa chỉ về 0 sau khi bật ghi và sau đó nhập “P” để lập trình vài byte. Ở giữa mỗi byte dữ liệu AA, BB, v.v., nhấn Return (Enter). Nhấn Return (Enter) lần nữa sẽ thoát khỏi chế độ lập trình.

Để xác minh rằng dữ liệu đã được ghi, trang 0 đã được xuất đầy. Dữ liệu mã ASCII cũng có thể được lập trình bằng cách nhập một ký tự nháy đơn ngay trước ký tự cần nhập, từng ký tự một. Phiên sau minh họa điều này (trang 0 giả định đã xóa):

: P
$000000 'H 'e 'l 'l 'o '  'W 'o 'r 'l 'd '!
$00000C 12 bytes written.
: D
000000 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 FF FF FF FF Hello World!....
000010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
000020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................

Văn bản đã được nhập thành công.

Bây giờ, hãy kiểm tra bản chất của lập trình flash. Đặt địa chỉ đến vị trí đã xóa và lập trình địa chỉ là 0x7F. Ở đây, chúng ta sẽ sử dụng địa chỉ hex 10:

: P
$000010 7F
$000011 1 bytes written.
: D
000000 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 FF FF FF FF Hello World!....
000010 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................

Kiểm tra xem dòng thứ hai có hiển thị 7F ở bên trái không. Bây giờ, chương trình vị trí hex 10, với giá trị hex BF:

: A
Address: 10
Address: 000010
: P
$000010 BF
$000011 1 bytes written.
: D
000000 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 FF FF FF FF Hello World!....
000010 3F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ?...............

Lưu ý rằng bit cao (bit 7) của vị trí 000010 không thay đổi. Nhưng vì bit 6 (trong 0xBF) là số không, một bit zero mới (bit 6) đã được lập trình, dẫn đến giá trị kết quả là 0x3F.

ID nhà sản xuất

Mã định danh (số ID) chip flash có thể được kiểm tra bằng các lệnh menu “I” và “J”:

: I
Manufacturer $EF Device $15 (W25X32)
: J
Manufacturer $EF Type $40 Capacity $16 (W25X32)

=> xem thêm Lập trình Arm STM32

Giảm Nguồn cấp

Chip Winbond có thể được giảm nguồn cấp để tiết kiệm dòng tiêu thụ. Sử dụng các tùy chọn menu “0” và “1” để tắt và bật:

: 0

: 1

Ở trạng thái “on” và đọc, dòng tiêu thụ trên thiết bị của tôi là khoảng 19,4 mA. Khi tắt nguồn, dòng điện giảm xuống còn 0,7 μA.

=> Sách Arduino, ESP8266, STM32 : Sách tự động hóa