Download as pdf or txt
Download as pdf or txt
You are on page 1of 88

Machine Translated by Google

I. Giới thiệu
Machine Translated by Google

1. Giới thiệu về Danh mục đầu tư MCU


STM32

Chương này giới thiệu ngắn gọn về toàn bộ danh mục STM32. Mục tiêu của nó là giới thiệu cho người đọc về
họ vi điều khiển khá phức tạp này được chia thành mười họ con riêng biệt.
Chúng chia sẻ một tập hợp các đặc điểm và các tính năng hiện tại dành riêng cho chuỗi đã cho. Ngoài ra,
phần giới thiệu nhanh về kiến trúc Cortex-M cũng được trình bày. Không chỉ muốn trở thành một tài liệu
tham khảo đầy đủ về kiến trúc Cortex-M hoặc bộ vi điều khiển STM32, nó nhằm mục đích trở thành hướng dẫn
cho người đọc trong việc lựa chọn bộ vi điều khiển phù hợp nhất với nhu cầu phát triển của họ, với hơn
500 MCU để lựa chọn. , thật không dễ dàng để quyết định cái nào phù hợp với hóa đơn.

1.1 Giới thiệu về Bộ xử lý dựa trên ARM

Với thuật ngữ ARM ngày nay chúng ta đề cập đến cả vô số họ kiến trúc Máy tính Tập lệnh Giảm thiểu (RISC)
và một số họ lõi hoàn chỉnh là các khối xây dựng (do đó có thuật ngữ lõi) của CPU do nhiều nhà sản xuất
silicon sản xuất. Khi xử lý các bộ xử lý dựa trên ARM, có thể xảy ra nhiều nhầm lẫn do có nhiều phiên bản
kiến trúc ARM khác nhau (ARMv6, ATMv6-M, ARMv7-M, ARMv7-A, v.v.) và nhiều kiến trúc lõi, trong đó lần lượt
dựa trên bản sửa đổi kiến trúc ARM. Ví dụ, để rõ ràng, bộ xử lý dựa trên lõi Cortex-M4 được thiết kế trên
kiến trúc ARMv7-M.

Kiến trúc ARM là một tập hợp các thông số kỹ thuật liên quan đến tập lệnh, mô hình thực thi, tổ chức và
bố cục bộ nhớ, chu kỳ lệnh, v.v., mô tả chính xác máy sẽ triển khai kiến trúc nói trên. Nếu trình biên
dịch của bạn có thể tạo các hướng dẫn lắp ráp cho kiến trúc đó, thì nó có thể tạo mã máy cho tất cả các
máy thực (hay còn gọi là bộ xử lý) đang triển khai kiến trúc đã cho đó.

Cortex-M là một họ các lõi vật lý được thiết kế để tích hợp thêm với các thiết bị silicon dành riêng cho
nhà cung cấp để tạo thành một bộ vi điều khiển hoàn chỉnh. Cách thức hoạt động của lõi không chỉ được xác
định bởi kiến trúc ARM liên quan của nó (ví dụ: ARMv7-M), mà còn bởi các thiết bị ngoại vi tích hợp và
khả năng phần cứng do nhà sản xuất silicon xác định. Ví dụ: kiến trúc lõi Cortex-M4 được thiết kế để hỗ
trợ các hoạt động truy cập dữ liệu bit trong hai vùng bộ nhớ cụ thể bằng cách sử dụng một tính năng gọi
là dải bit, nhưng việc triển khai thực tế có thêm tính năng đó hay không là tùy thuộc vào quá trình triển
khai thực tế. STM32F4 là một họ MCU dựa trên lõi Cortex-M4 thực hiện tính năng dải bit này. Hình 1 cho
thấy rõ ràng mối quan hệ giữa MCU dựa trên Cortex-M3 và lõi Cortex-M3 của nó.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 3

Hình 1: Mối quan hệ giữa lõi Cortex-M3 và MCU dựa trên Cortex-M3

ARM Holdings là một công ty của Anh¹ phát triển tập lệnh và kiến trúc cho các sản phẩm dựa trên ARM
nhưng không sản xuất thiết bị. Đây là một khía cạnh thực sự quan trọng của thế giới ARM và là lý do
tại sao có nhiều nhà sản xuất silicon phát triển, sản xuất và bán các bộ vi điều khiển dựa trên kiến
trúc và lõi của ARM. ST Microelectronics là một trong số đó và hiện là nhà sản xuất duy nhất bán danh

mục đầy đủ các bộ xử lý dựa trên Cortex-M.

ARM Holdings không sản xuất cũng như bán các thiết bị CPU dựa trên thiết kế của riêng mình mà cấp phép
kiến trúc bộ xử lý cho các bên quan tâm. ARM cung cấp nhiều điều khoản cấp phép khác nhau, khác nhau
về chi phí và sản phẩm. Khi đề cập đến lõi Cortex-M, người ta cũng thường nói đến lõi Sở hữu trí tuệ
(IP), nghĩa là bố cục thiết kế chip được coi là tài sản trí tuệ của một bên, cụ thể là ARM Holdings.

Nhờ mô hình kinh doanh này và các tính năng thực sự thú vị như khả năng tiêu thụ điện năng thấp, chi
phí sản xuất thấp của một số kiến trúc, v.v., ARM là kiến trúc tập lệnh được sử dụng rộng rãi nhất
xét về số lượng. Các sản phẩm dựa trên ARM đã trở nên cực kỳ phổ biến. Hơn 50 tỷ bộ vi xử lý ARM đã
được sản xuất tính đến năm 2014, 10 tỷ trong số đó được sản xuất vào năm 2013.
Bộ vi xử lý dựa trên ARM trang bị cho khoảng 75% thiết bị di động trên thế giới. Rất nhiều CPU 64 bit
và đa lõi chính thống và phổ biến, được sử dụng trong các thiết bị đã trở thành biểu tượng trong ngành
công nghiệp điện tử (ví dụ: iPhone của Apple), dựa trên kiến trúc ARM (ARMv8-A).

Là một loại tiêu chuẩn phổ biến, có rất nhiều trình biên dịch và công cụ, cũng như Hệ điều hành

¹Vào tháng 7 năm 2016, Softbank Nhật Bản đã công bố kế hoạch mua lại ARM Holdings với giá 31 tỷ USD. Thỏa thuận đã được chốt vào tháng 9
Vào ngày 5 và vào ngày hôm sau, công ty trước đây của Anh đã bị hủy niêm yết khỏi Sở giao dịch chứng khoán Luân Đôn.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 4

Các hệ thống (Linux là HĐH được sử dụng nhiều nhất trên các bộ xử lý Cortex-A) hỗ trợ các kiến trúc này,
mang đến cho các nhà phát triển nhiều cơ hội để xây dựng các ứng dụng của họ.

1.1.1 Bộ xử lý dựa trên Cortex và Cortex-M

ARM Cortex là một tập hợp rộng các kiến trúc 32/64-bit và lõi thực sự phổ biến trong thế giới nhúng.
Các bộ vi điều khiển Cortex được chia thành ba phân họ chính:

• Cortex-A, viết tắt của Application, là một loạt bộ xử lý cung cấp nhiều giải pháp cho các thiết bị
thực hiện các tác vụ điện toán phức tạp, chẳng hạn như lưu trữ nền tảng Hệ điều hành (OS) phong phú
(Linux và Android phái sinh của nó là những nền tảng phổ biến nhất) , và hỗ trợ nhiều ứng dụng phần
mềm. Lõi Cortex-A trang bị cho bộ xử lý có trong hầu hết các thiết bị di động, như điện thoại và máy
tính bảng. Trong phân khúc thị trường này, chúng ta có thể tìm thấy một số nhà sản xuất silicon khác
nhau, từ những người bán các bộ phận theo danh mục (TI hoặc Freescale) cho đến những người sản xuất
bộ vi xử lý cho những người được cấp phép khác. Trong số các lõi phổ biến nhất trong phân khúc này,
chúng ta có thể tìm thấy các bộ xử lý 32-bit Cortex-A7 và Cortex-A9, cũng như các lõi 64-bit Cortex-
A53 và Cortex-A57 hiệu năng cực cao mới nhất.

• Cortex-M, viết tắt của eMbedded, là một loạt các bộ xử lý có khả năng mở rộng, tương thích, tiết kiệm
năng lượng và dễ sử dụng được thiết kế cho thị trường nhúng chi phí thấp. Dòng Cortex-M được tối ưu
hóa cho các MCU nhạy cảm với điện năng và chi phí, phù hợp với các ứng dụng như Internet vạn vật, kết
nối, điều khiển động cơ, đo sáng thông minh, thiết bị giao diện con người, hệ thống điều khiển ô tô
và công nghiệp, thiết bị gia dụng trong nhà, sản phẩm tiêu dùng và dụng cụ y tế. Trong phân khúc thị
trường này, chúng ta có thể tìm thấy nhiều nhà sản xuất silicon sản xuất bộ xử lý Cortex-M: ST
Microelectronics là một trong số đó.

• Cortex-R, viết tắt của Real-Time, là một loạt bộ xử lý cung cấp các giải pháp điện toán hiệu năng cao
cho các hệ thống nhúng, nơi cần có độ tin cậy, tính sẵn sàng cao, khả năng chịu lỗi, khả năng bảo
trì và đáp ứng thời gian thực xác định. Bộ xử lý chuỗi Cortex-R cung cấp khả năng xử lý nhanh và xác
định cũng như hiệu suất cao, đồng thời đáp ứng các hạn chế thời gian thực đầy thách thức. Họ kết hợp
các tính năng này trong một gói tối ưu hóa hiệu suất, điện năng và diện tích, làm cho chúng trở thành
lựa chọn đáng tin cậy trong các hệ thống đáng tin cậy đòi hỏi khả năng chịu lỗi.

Các phần tiếp theo sẽ giới thiệu các tính năng chính của bộ xử lý Cortex-M, đặc biệt là từ quan điểm của
nhà phát triển nhúng.

1.1.1.1 Thanh ghi lõi

Giống như tất cả các kiến trúc RISC, bộ xử lý Cortex-M là các máy tải/lưu trữ, chỉ thực hiện các thao tác
trên các thanh ghi CPU ngoại trừ² đối với hai loại lệnh: tải và lưu trữ, được sử dụng để truyền dữ liệu
giữa các thanh ghi CPU và vị trí bộ nhớ.

²Điều này không hoàn toàn đúng, vì có sẵn các hướng dẫn khác trong kiến trúc ARMv6/7 truy cập các vị trí bộ nhớ, nhưng với
mục đích của cuộc thảo luận này, tốt nhất bạn nên coi câu đó là đúng.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 5

Hình 2 cho thấy các thanh ghi Cortex-M lõi. Một số trong số chúng chỉ có ở dòng hiệu suất cao hơn như
M3, M4 và M7. R0-R12 là các thanh ghi có mục đích chung và có thể được sử dụng làm toán hạng cho các
lệnh ARM. Tuy nhiên, một số thanh ghi mục đích chung có thể được trình biên dịch sử dụng làm thanh
ghi với các chức năng đặc biệt. R13 là thanh ghi Con trỏ ngăn xếp (SP), thanh ghi này cũng được cho
là đã được xếp chồng. Điều này có nghĩa là nội dung thanh ghi thay đổi theo chế độ CPU hiện tại (đặc
quyền hoặc không có đặc quyền). Chức năng này thường được Hệ điều hành thời gian thực (RTOS) sử dụng
để thực hiện chuyển ngữ cảnh.

Hình 2: Thanh ghi lõi ARM Cortex-M

Ví dụ, xem xét đoạn mã C sau sử dụng các biến cục bộ “a”, “b”, “c”:

...

uint8_t a,b,c;

một = 3;

b = 2;

c = a * b;
...
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 6

Trình biên dịch sẽ tạo mã hợp ngữ ARM³ sau:

1 phim r3, #3 ; di chuyển "3" trong thanh ghi r3


2 nhịp r3, [r7, #7] ;lưu trữ nội dung của r3 trong "a" r3, #2 r3, [r7,

3 phim #6] ;lưu ; di chuyển "2" trong thanh ghi r3


4 nhịp trữ nội dung của r3 trong "b" r2, [r7, # 7] ;tải nội dung của "a"

5 ldrb trong r2 r3, [r7, #6] ;tải nội dung của "b" trong r3

6 ldrb

7 smulbb r3, r2, r3 ;nhân "a" với "b" và lưu kết quả vào r3

8 nhịp r3, [r7, #5] ; lưu trữ kết quả trong "c"

Như chúng ta có thể thấy, tất cả các hoạt động luôn liên quan đến một thanh ghi. Các lệnh ở dòng
1-2 di chuyển số 3 vào thanh ghi r3 và sau đó lưu trữ nội dung của nó (nghĩa là số 3) bên trong
vị trí bộ nhớ được cung cấp bởi thanh ghi r7 (là con trỏ khung, như chúng ta sẽ thấy trong
Chương 20 ) cộng với phần bù của 7 vị trí bộ nhớ - đó là nơi lưu trữ một biến. Điều tương tự
cũng xảy ra với biến b ở dòng 3-4. Sau đó dòng 5-7 tải nội dung của biến a và b và thực hiện phép nhân.
Cuối cùng, dòng 8 lưu kết quả vào vị trí bộ nhớ của biến c.

Hình 3: Không gian địa chỉ bộ nhớ cố định Cortex-M

³Mã lắp ráp đó đã được tạo để biên dịch ở chế độ ngón tay cái với bất kỳ tối ưu hóa nào bị tắt, gọi GCC theo cách sau: $
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -fverbose-asm -save-temps -O0 -g -c file.c
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 7

1.1.1.2 Bản đồ bộ nhớ

ARM định nghĩa một không gian địa chỉ bộ nhớ được tiêu chuẩn hóa chung cho tất cả các lõi Cortex-M, đảm bảo

tính di động của mã giữa các nhà sản xuất silicon khác nhau. Không gian địa chỉ rộng 4GB và được tổ chức ở

một số vùng phụ với các chức năng logic khác nhau. Hình 3 cho thấy cách bố trí bộ nhớ của bộ xử lý Cortex-M
⁴.

512 MB đầu tiên được dành riêng cho vùng mã. Các thiết bị STM32 tiếp tục chia vùng này thành một số vùng

phụ như trong Hình 4. Hãy để chúng tôi giới thiệu ngắn gọn về chúng.

Tất cả các bộ xử lý Cortex-M ánh xạ vùng mã bắt đầu từ địa chỉ 0x0000 0000⁵. Vùng này cũng bao gồm con trỏ
tới đầu ngăn xếp (thường được đặt trong SRAM) và bảng vectơ, như chúng ta sẽ thấy trong Chương 7. Vị trí

của vùng mã được chuẩn hóa giữa tất cả các nhà cung cấp Cortex-M khác, ngay cả khi kiến trúc cốt lõi đủ linh

hoạt để cho phép các nhà sản xuất sắp xếp khu vực này theo một cách khác. Trên thực tế, đối với tất cả các

thiết bị STM32, một khu vực bắt đầu từ địa chỉ 0x0800 0000 được liên kết với bộ nhớ flash MCU bên trong và

đó là khu vực chứa mã chương trình. Tuy nhiên, nhờ vào một cấu hình khởi động cụ thể mà chúng ta sẽ khám
phá trong Chương 22, khu vực này cũng được đặt bí danh từ địa chỉ 0x0000 0000. Điều này có nghĩa là hoàn
toàn có thể tham chiếu đến nội dung của bộ nhớ flash bắt đầu từ địa chỉ 0x0800 0000 và 0x0000 0000 (ví dụ:

một thủ tục nằm ở địa chỉ 0x0800 16DC cũng có thể được truy cập từ 0x0000 16DC).

⁴Mặc dù bố cục bộ nhớ và kích thước của các vùng con (và do đó cũng là địa chỉ của chúng) được chuẩn hóa giữa tất cả các lõi Cortex-M, nhưng một
số chức năng có thể khác nhau. Ví dụ: Cortex-M7 không cung cấp các vùng băng tần bit và một số thiết bị ngoại vi trong vùng Bus ngoại vi riêng sẽ
khác. Luôn luôn tham khảo hướng dẫn tham khảo cho kiến trúc mà bạn đang xem xét.
⁵Để tăng khả năng đọc, tất cả các địa chỉ 32 bit trong cuốn sách này đều được viết tách hai byte trên khỏi các byte thấp hơn. Vì vậy, mỗi khi
bạn nhìn thấy một địa chỉ được thể hiện theo cách này (0x0000 0000) , bạn phải diễn giải nó giống như một địa chỉ 32-bit phổ biến (0x00000000). Quy
tắc này không áp dụng cho mã nguồn C và hợp ngữ.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 số 8

Hình 4: Bố cục bộ nhớ Vùng mã trên các MCU STM32

Hai phần cuối dành riêng cho bộ nhớ hệ thống và byte tùy chọn. Cái trước là vùng ROM dành riêng cho bộ nạp khởi

động. Mỗi họ STM32 (và các họ phụ của chúng - mật độ thấp, mật độ trung bình, v.v.) cung cấp một bộ tải khởi động

được lập trình sẵn vào chip trong quá trình sản xuất. Như chúng ta sẽ thấy trong Chương 22, bộ tải khởi động này

có thể được sử dụng để tải mã từ một số thiết bị ngoại vi, bao gồm USART, USB và CAN bus. Vùng Tùy chọn byte chứa

một loạt các cờ bit có thể được sử dụng để định cấu hình một số khía cạnh của MCU (chẳng hạn như bảo vệ đọc flash,

cơ quan giám sát phần cứng, chế độ khởi động, v.v.) và có liên quan đến bộ vi điều khiển STM32 cụ thể.

Quay trở lại toàn bộ không gian địa chỉ 4GB, vùng chính tiếp theo là vùng được giới hạn với MCU SRAM bên trong. Nó

bắt đầu tại địa chỉ 0x2000 0000 và có khả năng mở rộng đến 0x3FFF FFFF. Tuy nhiên, địa chỉ cuối thực tế phụ thuộc

vào lượng SRAM bên trong hiệu dụng. Ví dụ: trong trường hợp MCU STM32F103RB có 20KB SRAM, chúng ta có địa chỉ cuối

cùng là 0x2000 4FFF⁶. Việc cố gắng truy cập vào một vị trí bên ngoài khu vực này sẽ gây ra ngoại lệ Lỗi Bus (sẽ

nói thêm về vấn đề này sau).

Bộ nhớ 0,5 GB tiếp theo được dành riêng cho việc ánh xạ các thiết bị ngoại vi. Mọi thiết bị ngoại vi do MCU cung

cấp (bộ hẹn giờ, giao diện I²C và SPI, USART, v.v.) đều có bí danh trong khu vực này. Việc tổ chức không gian bộ

nhớ này tùy thuộc vào MCU cụ thể.

Vùng 2GB tiếp theo được dành riêng cho bộ lưu trữ SRAM và/hoặc flashe bên ngoài. Các thiết bị Cortex-M có thể thực

thi mã và tải/lưu trữ dữ liệu từ bộ nhớ ngoài, giúp mở rộng tài nguyên bộ nhớ trong, thông qua giao diện EMI/FSMC.

Một số thiết bị STM32, như STM32F7, có thể thực thi mã từ bộ nhớ ngoài mà không bị tắc nghẽn hiệu năng, nhờ bộ đệm

L1 và ARTTM
*
⁶Địa chỉ cuối cùng được tính như sau: 20K bằng 20 1024 byte, trong cơ số 16 là 0x5000. Nhưng địa chỉ bắt đầu từ
0, do đó địa chỉ cuối cùng là 0x2000 0000 + 0x4FFF.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 9

Máy gia tốc.

0,5 GB bộ nhớ cuối cùng được phân bổ cho các thiết bị ngoại vi bên trong (lõi) của bộ xử lý Cortex, cộng với một

vùng dành riêng cho các cải tiến trong tương lai đối với bộ xử lý Cortex. Tất cả các thanh ghi bộ xử lý Cortex đều

ở các vị trí cố định cho tất cả các bộ vi điều khiển dựa trên Cortex. Điều này cho phép mã được chuyển dễ dàng hơn
giữa các biến thể STM32 khác nhau và thực tế là các bộ vi điều khiển dựa trên Cortex của các nhà cung cấp khác.

1.1.1.3 Dải bit

Trong các ứng dụng nhúng, việc làm việc với các bit đơn lẻ của một từ bằng cách sử dụng mặt nạ bit là khá phổ biến.

Ví dụ: giả sử rằng chúng tôi muốn đặt hoặc xóa bit thứ 3 (bit 2) của một byte không dấu. Chúng tôi chỉ có thể làm

điều này bằng cách sử dụng mã C sau:

...

uint8_t nhiệt độ = 0;

tạm thời |= 0x4;

tạm thời &= ~0x4;


...

Mặt nạ bit được sử dụng khi chúng ta muốn tiết kiệm dung lượng trong bộ nhớ (sử dụng một biến duy nhất và gán một

ý nghĩa khác cho từng bit của nó) hoặc chúng ta phải xử lý các thanh ghi và thiết bị ngoại vi MCU bên trong.

Xem xét mã C trước đó, chúng ta có thể thấy rằng trình biên dịch sẽ tạo mã hợp ngữ ARM sau⁷:

#temp |= 0x4;
Một: 79fb ldrb r3, [r7, #7] orr.w
c: f043 0304 r3, r3, #4 strb r3,
10: 71fb [r7, #7]

#temp &= ~0x4;


12: 79fb ldrb r3, [r7, #7] bic.w
14: f023 0304 r3, r3, #4 strb r3,
18: 71fb [r7, #7]

Như chúng ta có thể thấy, một thao tác đơn giản như vậy yêu cầu ba hướng dẫn lắp ráp (tìm nạp, sửa đổi, lưu).

Điều này dẫn đến hai loại vấn đề. Trước hết, có sự lãng phí chu kỳ CPU liên quan đến ba hướng dẫn đó. Thứ hai, mã

đó hoạt động tốt nếu CPU đang làm việc ở chế độ một tác vụ và chúng ta chỉ có một luồng thực thi, nhưng nếu chúng

ta đang xử lý việc thực thi đồng thời, một tác vụ khác (hoặc đơn giản là một quy trình ngắt) có thể ảnh hưởng đến

nội dung của bộ nhớ trước khi chúng tôi hoàn thành thao tác “mặt nạ bit” (ví dụ: một ngắt xảy ra giữa các lệnh tại

các dòng 0xC-0x10 hoặc 0x14-0x18 trong mã hợp ngữ ở trên).

Dải bit là khả năng ánh xạ từng bit của một vùng bộ nhớ nhất định thành toàn bộ từ trong vùng bộ nhớ dải bit bí

danh, cho phép truy cập nguyên tử vào bit đó. Hình 5 cho thấy cách Cortex

⁷Mã lắp ráp đó được tạo để biên dịch ở chế độ ngón tay cái với bất kỳ tối ưu hóa nào bị tắt, gọi GCC theo cách sau: $
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -fverbose-asm -save-temps -O0 -g - tập tin c.c
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 10

CPU đặt bí danh nội dung của địa chỉ bộ nhớ 0x2000 0000 thành vùng dải bit 0x2200 0000-1c.
Ví dụ: nếu chúng tôi muốn sửa đổi (bit 2) của vị trí bộ nhớ 0x2000 0000 , chúng tôi chỉ cần truy cập
vào vị trí bộ nhớ 0x2200 0008 .

Hình 5: Ánh xạ bộ nhớ của địa chỉ SRAM 0x2000 0000 trong vùng dải bit (8 bit đầu tiên trong số 32 bit được hiển thị)

Đây là công thức để tính toán địa chỉ cho các vùng bí danh:

bit_band_address = bí danh_vùng_cơ sở + (vùng_cơ_sở_bù x 32) + (số_bit x 4)

Ví dụ, xét địa chỉ bộ nhớ của hình 5, để truy cập bit 2:

bí danh_vùng_cơ sở = 0x22000000
vùng_cơ sở_offset = 0x20000000 - 0x20000000 = 0
bit_band_address = 0x22000000 + 0*32 + (0x2 x 0x4) = 0x22000008

ARM xác định hai vùng băng tần bit cho MCU dựa trên Cortex-M⁸, mỗi vùng rộng 1 MB và được ánh xạ tới
vùng bí danh băng tần bit 32Mbit. Mỗi từ 32 bit liên tiếp trong vùng bộ nhớ “bí danh” đề cập đến
từng bit liên tiếp trong vùng “băng tần bit” (điều này giải thích mối quan hệ về kích thước: 1Mbit <-
> 32Mbit). Cái đầu tiên bắt đầu ở 0x2000 0000 và kết thúc ở 0x200F FFFF và nó có bí danh từ 0x2200
0000 đến 0x23FF FFFF. Nó được dành riêng cho việc truy cập bit của các vị trí bộ nhớ SRAM. Một vùng
dải bit khác bắt đầu ở 0x4000 0000 và kết thúc ở 0x400F FFFF, như trong Hình 6.

⁸Thật không may, MCU dựa trên Cortex-M7 không cung cấp khả năng tạo dải bit.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 11

Hình 6: Bản đồ bộ nhớ và các vùng dải bit

Vùng khác này được dành riêng cho việc ánh xạ bộ nhớ của các thiết bị ngoại vi. Ví dụ: ST ánh xạ Thanh ghi dữ liệu

đầu ra GPIO (GPIO->ODR) của thiết bị ngoại vi GPIOA từ 0x4002 0014. Điều này có nghĩa là mỗi bit của từ được đánh

địa chỉ tại 0x4002 0014 cho phép sửa đổi trạng thái đầu ra của GPIO (từ THẤP đến CAO và ngược lại ngược lại). Vì

vậy, nếu chúng tôi muốn sửa đổi trạng thái PIN5 của cổng GPIOA⁹, sử dụng công thức trước đó, chúng tôi có:

bí danh_vùng_cơ sở = 0x42000000
vùng_cơ sở_offset = 0x40020014 - 0x40000000 = 0x20014
bit_band_address = 0x42000000 + 0x20014*32 + (0x5 x 0x4) = 0x42400294

Chúng ta có thể định nghĩa hai macro trong C cho phép dễ dàng tính toán các địa chỉ bí danh dải bit:

1 // Xác định địa chỉ cơ sở của dải bit

2 #define BITBAND_SRAM_BASE 0x20000000

3 // Xác định địa chỉ cơ sở của dải bí danh

4 #define ALIAS_SRAM_BASE 0x22000000

5 // Chuyển đổi địa chỉ SRAM thành vùng bí danh 6

#define BITBAND_SRAM(a,b) ((ALIAS_SRAM_BASE + ((uint32_t)&(a)-BITBAND_SRAM_BASE)*32 + (b*4)))


7

8 // Xác định địa chỉ cơ sở của dải bit ngoại vi


9 #define BITBAND_PERI_BASE 0x40000000

10 // Xác định địa chỉ cơ sở của dải bí danh ngoại vi


11 #define ALIAS_PERI_BASE 0x42000000

12 // Chuyển đổi địa chỉ PERI thành vùng bí danh 13

#define BITBAND_PERI(a,b) ((ALIAS_PERI_BASE + ((uint32_t)a-BITBAND_PERI_BASE)*32 + (b*4)))

Vẫn sử dụng ví dụ trên, chúng ta có thể sửa nhanh trạng thái PIN5 của cổng GPIOA như sau:

⁹Bất kỳ ai đã chơi với bảng Nucleo đều biết rằng đèn LED người dùng LD2 (màu xanh lục) được kết nối với chân cổng đó.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 12

1 #define GPIOA_PERH_ADDR 0x40020000


2 #define ODR_ADDR_OFF 0x14
3

4 uint32_t *GPIOA_ODR = GPIOA_PERH_ADDR + ODR_ADDR_OFF; 5 uint32_t


*GPIOA_PIN5 = BITBAND_PERI(GPIOA_ODR, 5);
6

7 *GPIOA_PIN5 = 0x1; // Biến GPIO CAO

1.1.1.4 Thumb-2 và sắp xếp bộ nhớ

Về mặt lịch sử, bộ xử lý ARM cung cấp bộ hướng dẫn 32 bit. Điều này không chỉ cho phép tập hợp
các lệnh phong phú mà còn đảm bảo hiệu suất tốt nhất trong quá trình thực hiện các lệnh liên
quan đến phép toán số học và chuyển bộ nhớ giữa các thanh ghi lõi và SRAM. Tuy nhiên, tập lệnh
32 bit có chi phí về dung lượng bộ nhớ của phần sụn. Điều này có nghĩa là một chương trình
được viết bằng Kiến trúc tập lệnh 32 bit (ISA) yêu cầu số lượng byte lưu trữ flash cao hơn,
điều này ảnh hưởng đến mức tiêu thụ điện năng và chi phí chung của MCU (tấm wafer silicon đắt
tiền và các nhà sản xuất liên tục thu nhỏ kích thước chip để giảm chi phí của họ).

Để giải quyết các vấn đề như vậy, ARM đã giới thiệu tập lệnh Thumb 16 bit, đây là tập hợp con
của tập lệnh 32 bit được sử dụng phổ biến nhất. Mỗi lệnh ngón tay cái dài 16 bit và được
"dịch" tự động sang lệnh ARM 32 bit tương ứng có tác dụng tương tự đối với kiểu bộ xử lý. Điều
này có nghĩa là các lệnh Thumb 16-bit được mở rộng trong suốt (từ quan điểm của nhà phát triển)
sang các lệnh ARM 32-bit đầy đủ trong thời gian thực mà không làm giảm hiệu suất. Mã ngón tay
cái thường có kích thước bằng 65% mã ARM và cung cấp 160% hiệu suất của mã sau khi chạy từ hệ
thống bộ nhớ 16 bit; tuy nhiên, trong Thumb, opcodes 16-bit có ít chức năng hơn. Ví dụ: chỉ
các nhánh mới có thể có điều kiện và nhiều opcode bị hạn chế chỉ truy cập một nửa trong số tất
cả các thanh ghi mục đích chung của CPU.
Sau đó, ARM đã giới thiệu tập lệnh Thumb-2, là sự kết hợp của tập lệnh 16 và 32 bit trong một
trạng thái hoạt động. Thumb-2 là một tập lệnh có độ dài thay đổi và cung cấp nhiều lệnh hơn so
với Thumb, đạt được mật độ mã tương tự.

Cortex-M3/4/7 được thiết kế để hỗ trợ các tập lệnh Thumb và Thumb-2 đầy đủ và một số trong số
chúng hỗ trợ các tập lệnh khác dành riêng cho các phép toán Dấu phẩy động (Cortex-M4/7) và các
phép toán Đa dữ liệu một lệnh (SIMD) (còn được gọi là hướng dẫn NEON).
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 13

Hình 7: Sự khác biệt giữa truy cập bộ nhớ được căn chỉnh và không được căn chỉnh

Một tính năng thú vị khác của lõi Cortex-M3/4/7 là khả năng thực hiện truy cập không phân bổ vào bộ nhớ.

Các CPU dựa trên ARM theo truyền thống có khả năng truy cập các biến có dấu và không dấu theo byte (8-bit), nửa từ

(16-bit) và từ (32-bit) mà không làm tăng số lượng lệnh hợp ngữ như xảy ra trên kiến trúc MCU 8-bit . Tuy nhiên, các

kiến trúc ARM ban đầu không thể thực hiện truy cập bộ nhớ chưa được phân bổ, gây lãng phí vị trí bộ nhớ.

Để hiểu vấn đề, hãy xem sơ đồ bên trái trong Hình 7. Ở đây chúng ta có tám biến. Với quyền truy cập phù
hợp với bộ nhớ, chúng tôi muốn nói rằng để truy cập các biến từ (1 và 4 trong sơ đồ), chúng tôi cần truy
cập các địa chỉ là bội số của 32 bit (4 byte). Nghĩa là, một biến từ chỉ có thể được lưu trữ trong
0x2000 0000, 0x2000 0004, 0x2000 0008 , v.v. Mọi nỗ lực truy cập vào một vị trí không phải là bội số của
4 đều gây ra ngoại lệ về Lỗi sử dụng. Vì vậy, hướng dẫn giả ARM sau đây là không chính xác:

STR R2, 0x20000002

Điều tương tự cũng áp dụng cho truy cập một nửa từ: có thể truy cập vào các vị trí bộ nhớ được lưu trữ
ở bội số 2 byte: 0x2000 0000, 0x2000 0002, 0x2000 0004 , v.v. Hạn chế này gây ra sự phân mảnh bên trong
bộ nhớ RAM. Để giải quyết vấn đề này, các MCU dựa trên Cortex-M3/4/7 có thể thực hiện truy cập bộ nhớ
không được phân bổ, như thể hiện trong sơ đồ bên phải trong Hình 7. Như chúng ta có thể thấy, biến 4
được lưu trữ bắt đầu từ địa chỉ 0x2000 0007 (trong ARM đầu tiên ) . kiến trúc, điều này chỉ có thể thực
hiện được với các biến byte đơn). Điều này cho phép chúng tôi lưu trữ biến 5 trong vị trí bộ nhớ 0x2000
000b, khiến biến 8 được lưu trữ trong 0x2000 000e. Bộ nhớ hiện đã được đóng gói và chúng tôi đã lưu 4 byte SRAM.

Tuy nhiên, quyền truy cập chưa được chỉ định bị hạn chế đối với các hướng dẫn ARM sau:

• LDR, LDRT •

LDRH, LDRHT • LDRSH,

LDRSHT • STR, STRT •

STRH, STRHT

1.1.1.5 Đường ống

Bất cứ khi nào chúng ta nói về việc thực hiện các lệnh, chúng ta đang đưa ra một loạt các giả định không tầm thường.

Trước khi một lệnh được thực thi, CPU phải lấy nó từ bộ nhớ và giải mã nó. thủ tục này
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 14

tiêu thụ một số chu kỳ CPU, tùy thuộc vào bộ nhớ và kiến trúc CPU lõi, được cộng vào chi phí lệnh thực
tế (nghĩa là số chu kỳ cần thiết để thực hiện lệnh đã cho).

Các CPU hiện đại giới thiệu một cách để song song hóa các hoạt động này nhằm tăng thông lượng hướng
dẫn của chúng (số lượng hướng dẫn có thể được thực hiện trong một đơn vị thời gian). Chu kỳ hướng dẫn
cơ bản được chia thành một loạt các bước, như thể các hướng dẫn đi dọc theo một đường ống.
Thay vì xử lý tuần tự từng lệnh (từng lệnh một, hoàn thành một lệnh trước khi bắt đầu với lệnh tiếp
theo), mỗi lệnh được chia thành một chuỗi các giai đoạn để các bước khác nhau có thể được thực hiện
song song.

Hình 8: Đường ống hướng dẫn ba giai đoạn

Tất cả các bộ vi điều khiển dựa trên Cortex-M đều giới thiệu một dạng đường ống. Phổ biến nhất là
đường ống 3 tầng, như trong Hình 8. Đường ống 3 tầng được hỗ trợ bởi Cortex-M0/3/4. Các lõi Cortex-
M0+, được dành riêng cho các MCU công suất thấp, cung cấp quy trình 2 giai đoạn (mặc dù quy trình quy
trình giúp giảm chi phí thời gian liên quan đến chu kỳ tìm nạp/giải mã/thực thi lệnh, nhưng nó đưa ra
chi phí năng lượng phải được giảm thiểu trong ứng dụng năng lượng thấp). Các lõi Cortex-M7 cung cấp
một quy trình 6 giai đoạn.

Khi xử lý các đường ống, phân nhánh là một vấn đề cần giải quyết. Thực hiện chương trình là tất cả về
việc thực hiện các con đường khác nhau; điều này đạt được thông qua phân nhánh (nếu goto bằng nhau).
Thật không may, việc phân nhánh làm mất hiệu lực của các luồng đường ống, như thể hiện trong Hình 9.
Hai lệnh cuối cùng đã được tải vào đường ống nhưng chúng bị loại bỏ do đường nhánh tùy chọn đã được
sử dụng (chúng tôi thường gọi chúng là bóng nhánh)

Hình 9: Phân nhánh trong thực thi chương trình liên quan đến đường ống

Ngay cả trong trường hợp này, có một số kỹ thuật để giảm thiểu tác động của việc phân nhánh. Chúng
thường được gọi là kỹ thuật dự đoán rẽ nhánh. Ý tưởng đằng sau những kỹ thuật này là CPU
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 15

bắt đầu tìm nạp và giải mã cả các lệnh sau khi phân nhánh và các lệnh sẽ đạt được nếu việc phân
nhánh xảy ra (trong Hình 9 cả hai lệnh MOV và ADD ). Tuy nhiên, có những cách khác để thực hiện
sơ đồ dự đoán rẽ nhánh. Nếu bạn muốn tìm hiểu sâu hơn về chủ đề này, bài đăng này¹⁰ từ diễn đàn
hỗ trợ chính thức của ARM là một điểm khởi đầu tốt.

1.1.1.6 Xử lý ngắt và ngoại lệ

Quản lý ngắt và ngoại lệ là một trong những tính năng mạnh mẽ nhất của bộ xử lý dựa trên Cortex-
M. Ngắt và ngoại lệ là các sự kiện không đồng bộ làm thay đổi luồng chương trình. Khi một ngoại
lệ hoặc một ngắt xảy ra, CPU sẽ tạm dừng việc thực thi tác vụ hiện tại, lưu ngữ cảnh của nó
(nghĩa là con trỏ ngăn xếp của nó) và bắt đầu thực hiện một quy trình được thiết kế để xử lý sự
kiện ngắt. Quy trình này được gọi là Trình xử lý ngoại lệ trong trường hợp có ngoại lệ và Quy
trình dịch vụ ngắt (ISR) trong trường hợp có gián đoạn. Sau khi ngoại lệ hoặc ngắt đã được xử
lý, CPU sẽ tiếp tục luồng thực thi trước đó và tác vụ trước đó có thể tiếp tục thực hiện ¹¹.

Trong kiến trúc ARM, ngắt là một loại ngoại lệ. Ngắt thường được tạo ra từ các thiết bị ngoại vi trên
chip (ví dụ: bộ hẹn giờ) hoặc đầu vào bên ngoài (ví dụ: công tắc xúc giác được kết nối với GPIO) và trong
một số trường hợp, chúng có thể được kích hoạt bằng phần mềm. Thay vào đó, các ngoại lệ liên quan đến
việc thực thi phần mềm và chính CPU có thể là một nguồn ngoại lệ. Đây có thể là các sự kiện lỗi, chẳng
hạn như nỗ lực truy cập vào vị trí bộ nhớ không hợp lệ hoặc các sự kiện do Hệ điều hành tạo ra, nếu có.

Mỗi ngoại lệ (và do đó ngắt) có một số xác định duy nhất nó. Bảng 1 cho thấy các ngoại lệ được
xác định trước phổ biến đối với tất cả các lõi Cortex-M, cộng với một số lượng khác nhau do người
dùng xác định liên quan đến quản lý ngắt. Con số này phản ánh vị trí của thường trình xử lý ngoại
lệ bên trong bảng vectơ, nơi lưu trữ địa chỉ thực của thường trình. Ví dụ: vị trí 15 chứa địa
chỉ bộ nhớ của vùng mã chứa trình xử lý ngoại lệ cho ngắt SysTick, được tạo khi bộ đếm thời gian
SysTick về 0.

¹⁰http://bit.ly/1k7ggh6
¹¹Với thuật ngữ nhiệm vụ, chúng tôi đề cập đến một loạt các hướng dẫn cấu thành luồng thực thi chính. Nếu chương trình cơ sở của chúng tôi dựa

trên HĐH, kịch bản có thể rõ ràng hơn một chút. Ngoài ra, trong trường hợp chế độ ngủ năng lượng thấp, CPU có thể được cấu hình để quay trở lại trạng
thái ngủ sau khi thực hiện quy trình quản lý ngắt.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 16

Bảng 1: Các loại ngoại lệ Cortex-M

Khác với ba trường hợp đầu tiên, mỗi ngoại lệ có thể được chỉ định một mức độ ưu tiên, xác định
thứ tự xử lý trong trường hợp bị gián đoạn đồng thời: số càng thấp, mức độ ưu tiên càng cao.
Ví dụ: giả sử chúng ta có hai quy trình ngắt liên quan đến đầu vào bên ngoài A và B. Chúng ta
có thể chỉ định ngắt có mức độ ưu tiên cao hơn (số thấp hơn) cho đầu vào A. Nếu ngắt liên quan
đến A đến trong khi bộ xử lý đang phục vụ ngắt từ đầu vào B việc thực thi B bị tạm dừng, cho
phép thực thi thường trình dịch vụ ngắt có mức ưu tiên cao hơn ngay lập tức.

Cả ngoại lệ và ngắt đều được xử lý bởi một đơn vị chuyên dụng có tên là Bộ điều khiển ngắt
Vector lồng nhau (NVIC). NVIC có các tính năng sau:

• Quản lý ngắt và ngoại lệ linh hoạt: NVIC có thể xử lý cả tín hiệu/yêu cầu ngắt đến từ
thiết bị ngoại vi và ngoại lệ đến từ lõi bộ xử lý, cho phép chúng tôi bật/tắt chúng trong
phần mềm (ngoại trừ NMI¹²) .

¹²Ngoài ra, không thể tắt ngoại lệ Đặt lại, ngay cả khi nói về việc tắt ngoại lệ Đặt lại là không phù hợp, vì đây là ngoại lệ đầu tiên
được tạo ra sau khi thiết lập lại MCU. Như chúng ta sẽ thấy trong Chương 7, ngoại lệ Đặt lại là điểm vào thực tế của mọi ứng dụng STM32.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 17

• Hỗ trợ ngoại lệ/ngắt lồng nhau: NVIC cho phép ấn định mức độ ưu tiên cho các ngoại lệ và ngắt (ngoại
trừ ba loại ngoại lệ đầu tiên), mang đến khả năng phân loại các ngắt dựa trên nhu cầu của người dùng.
• Vectored exception/interrupt entry: NVIC tự

động xác định vị trí của ngoại lệ


trình xử lý liên quan đến ngoại lệ/ngắt mà không cần mã bổ sung.

• Mặt nạ ngắt: các nhà phát triển có thể tự do tạm dừng việc thực thi tất cả các trình xử lý ngoại lệ
(ngoại trừ NMI) hoặc tạm dừng một số trong số chúng trên cơ sở mức độ ưu tiên, nhờ vào một tập hợp
các thanh ghi chuyên dụng. Điều này cho phép thực hiện các tác vụ quan trọng một cách an toàn mà
không phải xử lý các gián đoạn không

đồng bộ. • Độ trễ ngắt xác định: một tính năng thú vị của NVIC là độ trễ xác định của quá trình xử lý
ngắt, bằng 12 chu kỳ cho tất cả các lõi Cortex-M3/4, 15 chu kỳ cho Cortex-M0, 16 chu kỳ cho Cortex-
M0+, bất kể trạng thái hiện tại của bộ xử lý.

• Định vị lại các trình xử lý ngoại lệ: như chúng ta sẽ khám phá tiếp theo, các trình xử lý ngoại lệ có
thể được định vị lại đến các vị trí bộ nhớ flash khác cũng như hoàn toàn khác - ngay cả bộ nhớ ngoài
- không chỉ đọc. Điều này mang lại mức độ linh hoạt cao cho các ứng dụng nâng cao.

1.1.1.7 SysTimer

Bộ xử lý dựa trên Cortex-M có thể tùy chọn cung cấp Bộ hẹn giờ hệ thống, còn được gọi là SysTick. Tin tốt
là tất cả các thiết bị STM32 đều cung cấp một, như trong Bảng 3.
SysTick là bộ đếm thời gian đếm ngược 24 bit được sử dụng để cung cấp đánh dấu hệ thống cho Hệ điều hành
thời gian thực (RTOS) như FreeRTOS. Nó được sử dụng để tạo các ngắt định kỳ cho các tác vụ theo lịch trình.
Các lập trình viên có thể xác định tần suất cập nhật của bộ đếm thời gian SysTick bằng cách đặt các thanh ghi của nó. Bộ đếm

thời gian SysTick cũng được STM32 HAL sử dụng để tạo độ trễ chính xác, ngay cả khi chúng tôi không sử dụng RTOS. Thông tin

thêm về bộ đếm thời gian này trong Chương 11.

1.1.1.8 Chế độ nguồn

Xu hướng hiện nay trong ngành công nghiệp điện tử, đặc biệt là khi nói đến thiết kế thiết bị di động, là
về quản lý năng lượng. Giảm mức tiêu thụ điện năng xuống mức tối thiểu là mục tiêu chính của tất cả các nhà
thiết kế phần cứng và lập trình viên tham gia phát triển các thiết bị chạy bằng pin.
Bộ xử lý Cortex-M cung cấp một số cấp độ quản lý năng lượng, có thể được chia thành hai nhóm chính: tính
năng nội tại và chế độ năng lượng do người dùng xác định.

Với các tính năng nội tại, chúng tôi đề cập đến những khả năng riêng liên quan đến mức tiêu thụ năng lượng
được xác định trong quá trình thiết kế của cả lõi Cortex-M và toàn bộ MCU. Ví dụ: lõi Cortex-M0+ chỉ xác
định hai giai đoạn đường ống để giảm mức tiêu thụ điện năng trong quá trình tìm nạp trước hướng dẫn.
Một hành vi tự nhiên khác liên quan đến quản lý năng lượng là mật độ mã cao của tập lệnh Thumb-2, cho phép
các nhà phát triển chọn MCU có bộ nhớ flash nhỏ hơn để đáp ứng nhu cầu năng lượng thấp hơn.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 18

Hình 10: Mức tiêu thụ năng lượng của Cortex-M ở các chế độ năng lượng khác nhau

Theo truyền thống, bộ xử lý Cortex-M cung cấp các chế độ năng lượng do người dùng xác định thông qua Đăng ký

điều khiển hệ thống (SCR). Tiện ích đầu tiên là chế độ Run (xem Hình 10), chế độ này giúp CPU chạy hết khả năng

của nó. Ở chế độ Chạy, mức tiêu thụ điện năng phụ thuộc vào tần số xung nhịp và các thiết bị ngoại vi được sử dụng.

Chế độ ngủ là chế độ năng lượng thấp đầu tiên có sẵn để giảm mức tiêu thụ điện năng. Khi được kích hoạt, hầu hết

các chức năng đều bị treo, tần số CPU bị giảm xuống và các hoạt động của nó bị giảm xuống mức cần thiết để nó

hoạt động trở lại. Ở chế độ Ngủ sâu, tất cả các tín hiệu đồng hồ đều bị dừng và CPU cần một sự kiện bên ngoài để

đánh thức khỏi trạng thái này.

Tuy nhiên, các chế độ năng lượng này chỉ là các mô hình chung, được triển khai thêm trong MCU thực tế. Ví dụ:

hãy xem Hình 11 hiển thị mức tiêu thụ năng lượng của MCU STM32F2 chạy ở 80MHZ @30°C¹³. Như chúng ta có thể thấy,

mức tiêu thụ năng lượng tối đa đạt được ở chế độ Chạy (nghĩa là chế độ Hoạt động) với bộ tăng tốc ARTTM bị tắt.

Kích hoạt bộ tăng tốc ARTTM, chúng tôi có thể tiết kiệm tới 10mAh đồng thời đạt được hiệu suất điện toán tốt

hơn. Điều này cho thấy rõ ràng rằng việc triển khai MCU thực có thể đưa ra các mức năng lượng khác nhau.

¹³Nguồn ST AN3430
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 19

Hình 11: Công suất tiêu thụ của STM32F2 ở các chế độ công suất khác nhau

Các dòng STM32Lx cung cấp thêm một số mức năng lượng trung gian, cho phép chọn chính xác chế độ năng lượng

ưa thích và do đó hiệu suất và mức tiêu thụ năng lượng của MCU.

Chúng ta sẽ đi sâu hơn về chủ đề này trong Chương 19.

1.1.1.9 CMSIS

Một trong những lợi thế chính của nền tảng ARM (cho cả nhà cung cấp silicon và nhà phát triển ứng dụng) là

sự tồn tại của một bộ công cụ phát triển hoàn chỉnh (trình biên dịch, thư viện thời gian chạy, trình gỡ lỗi,
v.v.) có thể tái sử dụng giữa nhiều nhà cung cấp.

ARM cũng đang tích cực làm việc để chuẩn hóa cơ sở hạ tầng phần mềm giữa các nhà cung cấp MCU. Tiêu chuẩn

giao diện phần mềm vi điều khiển Cortex (CMSIS) là lớp trừu tượng phần cứng độc lập với nhà cung cấp dành

cho dòng bộ xử lý Cortex-M và chỉ định các giao diện trình gỡ lỗi. CMSIS bao gồm các thành phần sau:

• CMSIS-CORE: API cho lõi bộ xử lý Cortex-M và các thiết bị ngoại vi. Nó cung cấp một giao diện chuẩn hóa
cho Cortex-M0/3/4/7. • Trình điều

khiển CMSIS: xác định các giao diện trình điều khiển ngoại vi chung cho phần mềm trung gian giúp chúng

có thể tái sử dụng trên các thiết bị được hỗ trợ. API độc lập với RTOS và kết nối các thiết bị ngoại

vi của bộ vi điều khiển với phần mềm trung gian thực hiện, trong số những thứ khác, ngăn xếp giao tiếp,

hệ thống tệp hoặc giao diện người dùng đồ họa.

• CMSIS-DSP: Bộ sưu tập thư viện DSP với hơn 60 Hàm cho các loại dữ liệu khác nhau: điểm cố định (phân số

q7, q15, q31) và dấu phẩy động chính xác đơn (32-bit). Thư viện có sẵn cho Cortex-M0, Cortex-M3 và

Cortex-M4. Việc triển khai Cortex-M4 được tối ưu hóa cho tập lệnh SIMD.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 20

• API CMSIS-RTOS: API chung cho Hệ điều hành thời gian thực. Nó cung cấp một giao diện lập trình được
tiêu chuẩn hóa, có thể di động tới nhiều RTOS và do đó cho phép các mẫu phần mềm, phần mềm trung gian,
thư viện và các thành phần khác có thể hoạt động trên các hệ thống RTOS được hỗ trợ. Chúng ta sẽ nói
về lớp API này trong Chương 23. • CMSIS-Pack: mô tả, sử dụng tệp mô

tả gói dựa trên XML có tên “PDSC”, các phần liên quan đến người dùng và thiết bị của bộ sưu tập tệp (cụ
thể là “gói phần mềm”) bao gồm nguồn , tiêu đề, tệp thư viện, tài liệu, thuật toán lập trình flash,

mẫu mã nguồn và dự án ví dụ. Các công cụ phát triển và cơ sở hạ tầng web sử dụng tệp PDSC để trích
xuất các tham số thiết bị, thành phần phần mềm và cấu hình bảng đánh giá.

• CMSIS-SVD: Mô tả Chế độ xem Hệ thống (SVD) cho Thiết bị ngoại vi. Mô tả các thiết bị ngoại vi của
thiết bị trong tệp XML và có thể được sử dụng để tạo nhận thức về thiết bị ngoại vi trong trình gỡ
lỗi hoặc tệp tiêu đề với các thanh ghi ngoại vi và định nghĩa ngắt.

• CMSIS-DAP: Cổng truy cập gỡ lỗi. Các chương trình cơ sở được tiêu chuẩn hóa cho Thiết bị gỡ lỗi kết
nối với Cổng truy cập gỡ lỗi CoreSight. CMSIS-DAP được phân phối dưới dạng một gói riêng biệt và rất
phù hợp để tích hợp trên các bảng đánh giá.

Tuy nhiên, sáng kiến này của ARM vẫn đang phát triển và sự hỗ trợ cho tất cả các thành phần từ ST vẫn còn
rất sơ khai. ST HAL chính thức là cách chính để phát triển các ứng dụng cho nền tảng STM32, nền tảng này
thể hiện rất nhiều điểm đặc biệt giữa các MCU thuộc các họ khác nhau. Hơn nữa, khá rõ ràng rằng mục tiêu
chính của các nhà cung cấp silicon là giữ chân khách hàng của họ và tránh việc họ chuyển sang nền tảng MCU

khác (ngay cả khi dựa trên cùng lõi ARM Cortex). Vì vậy, chúng ta còn lâu mới có một lớp hoàn chỉnh và di
động hoạt động trên tất cả các MCU dựa trên ARM có sẵn trên thị trường.

1.1.1.10 Triển khai hiệu quả các tính năng Cortex-M trong danh mục STM32

Một số tính năng được trình bày trong các đoạn trước là tùy chọn và có thể không có sẵn trong một MCU nhất
định. Bảng 2 và 3 tóm tắt các hướng dẫn và thành phần Cortex-M có sẵn trong Danh mục STM32. Chúng có thể
hữu ích trong quá trình lựa chọn MCU STM32.

Bảng 2: Các biến thể lệnh ARM Cortex-M


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 21

Bảng 3: Các thành phần tùy chọn của ARM Cortex-M

1.2 Giới thiệu về Vi điều khiển STM32

STM32 là một loạt các bộ vi điều khiển được chia thành chín họ phụ, mỗi họ có các tính năng riêng.
ST bắt đầu sản xuất danh mục này trên thị trường vào năm 2007, bắt đầu với dòng STM32F1 vẫn đang
được phát triển. Hình 12 cho thấy khuôn bên trong của MCU STM32F103, một trong những MCU STM32
phổ biến nhất¹⁴. Tất cả các bộ vi điều khiển STM32 đều có lõi Cortex-M, cộng với một số tính năng
ST đặc biệt (như bộ tăng tốc ARTTM). Bên trong, mỗi bộ vi điều khiển bao gồm lõi bộ xử lý, RAM
tĩnh, bộ nhớ flash, giao diện gỡ lỗi và nhiều thiết bị ngoại vi khác. Một số MCU cung cấp các
loại bộ nhớ bổ sung (EEPROM, CCM, v.v.) và toàn bộ dòng thiết bị hướng đến các ứng dụng tiêu thụ
điện năng thấp đang không ngừng phát triển.

¹⁴Hình ảnh này được lấy từ Zeptobars.ru (http://bit.ly/1FfqHsv), một blog thực sự tuyệt vời. Các tác giả của nó đã giải mã (tháo vỏ bảo vệ) các mạch
tích hợp trong axit và công bố hình ảnh về những gì bên trong con chip. Tôi yêu những hình ảnh đó, bởi vì chúng cho thấy những gì con người có thể đạt
được trong lĩnh vực điện tử.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 22

Hình 12: Khuôn bên trong của một STM32F103 MCU³

Các đoạn còn lại trong chương này sẽ giới thiệu cho người đọc về các bộ vi điều khiển STM32, đưa ra một
cái nhìn tổng quan đầy đủ về tất cả các họ con của STM32.

1.2.1 Ưu điểm của STM32 Portfolio….


Nền tảng STM32 cung cấp một số lợi thế cho các nhà phát triển nhúng. Đoạn này cố gắng tóm tắt những cái
có liên quan.

• Chúng là các MCU dựa trên Cortex-M: điều này có thể vẫn chưa rõ đối với những bạn mới sử dụng nền
tảng này. Là bộ vi điều khiển dựa trên Cortex-M đảm bảo rằng bạn có sẵn một số công cụ trên thị
trường để phát triển ứng dụng của mình. ARM đã trở thành một loại tiêu chuẩn trong thế giới nhúng
(điều này đặc biệt đúng với bộ xử lý Cortex-A; trong phân khúc thị trường Cortex-M vẫn có một số
lựa chọn thay thế tốt: PIC, MSP430, v.v.) và 50 tỷ thiết bị được bán bởi Năm 2014 là một sự đảm
bảo mạnh mẽ rằng đầu tư vào nền tảng này là một lựa chọn tốt. • Chuỗi công cụ dựa trên
ARM miễn phí: nhờ sự phổ biến của các bộ xử lý dựa trên ARM, có thể làm việc với các chuỗi công cụ
hoàn toàn miễn phí mà không cần đầu tư nhiều tiền để bắt đầu làm việc với nền tảng này, điều này
cực kỳ quan trọng nếu bạn là một người yêu thích hoặc một sinh viên.
• Tái sử dụng bí quyết: STM32 là một danh mục đầu tư khá phong phú, dựa trên một mẫu số chung: nền
tảng CPU chính của họ. Ví dụ, điều này đảm bảo rằng bí quyết thu được
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 23

làm việc trên CPU STM32Fx nhất định có thể dễ dàng được áp dụng cho các thiết bị khác trong cùng một dòng.

Hơn nữa, làm việc với bộ xử lý Cortex-M cho phép bạn sử dụng lại nhiều kỹ năng đã học được nếu bạn (hoặc sếp của

bạn) quyết định chuyển sang MCU Cortex-M từ các nhà cung cấp khác (về lý thuyết). • Tương thích pin-to-pin:

hầu hết các MCU STM32 được thiết kế để tương thích pin-to-pin bên trong danh mục STM32 mở rộng. Điều này đặc biệt

đúng đối với các gói LQFP64-100 và đó là một điểm cộng lớn. Bạn sẽ có ít trách nhiệm hơn trong việc lựa chọn ban

đầu bộ vi điều khiển phù hợp cho ứng dụng của mình, biết rằng cuối cùng bạn có thể chuyển sang họ khác trong

trường hợp bạn thấy nó không phù hợp với nhu cầu của mình. • Chịu được 5V: Hầu hết các chân STM32 đều chịu được

5V. Điều này có nghĩa là

bạn có thể giao tiếp với các thiết bị khác không cung cấp 3.3VI/O mà không cần sử dụng bộ dịch mức (trừ khi tốc độ

thực sự là chìa khóa cho ứng dụng của bạn - bộ dịch mức luôn đưa ra một điện dung ký sinh làm giảm tần số chuyển

mạch).

• 32 xu cho 32 bit: STM32F0 là lựa chọn phù hợp nếu bạn muốn chuyển từ MCU 8/16 bit sang một nền tảng mạnh mẽ và

nhất quán, trong khi vẫn giữ mức giá mục tiêu tương đương. Bạn có thể sử dụng RTOS để tăng cường ứng dụng của

mình và viết mã tốt hơn nhiều. • Bộ tải khởi động tích hợp: Các MCU

STM32 được vận chuyển với một bộ tải khởi động tích hợp, cho phép lập trình lại bộ nhớ flash bên trong bằng cách

sử dụng một số thiết bị ngoại vi giao tiếp (USART, I²C, v.v.). Đối với một số bạn, đây sẽ không phải là một tính

năng tuyệt vời, nhưng nó có thể đơn giản hóa đáng kể công việc của những người phát triển thiết bị với tư cách

là chuyên gia.

1.2.2 ….Và nhược điểm của nó

Cuốn sách này không phải là một tập tài liệu quảng cáo hay một tài liệu do những người tiếp thị làm ra. Tác giả cũng

không phải là nhân viên ST hoặc anh ta có kinh doanh với ST. Vì vậy, thật đúng khi nói rằng có một số cạm bẫy liên

quan đến nền tảng này.

• Đường cong học tập: Đường cong học tập của STM32 có thể khá dốc, đặc biệt đối với người dùng thiếu kinh nghiệm.

Nếu bạn hoàn toàn mới đối với phát triển nhúng, quá trình học cách phát triển các ứng dụng STM32 có thể thực sự

khiến bạn nản lòng. Ngay cả khi ST đang làm rất tốt trong việc cố gắng cải thiện tài liệu tổng thể và các thư

viện chính thức, thì vẫn rất khó để xử lý nền tảng này và điều này thật đáng tiếc. Trong lịch sử, tài liệu ST

không phải là tài liệu tốt nhất cho những người thiếu kinh nghiệm, quá khó hiểu và thiếu các ví dụ rõ ràng.

• Thiếu các công cụ chính thức: cuốn sách này sẽ hướng dẫn người đọc quy trình thiết lập chuỗi công cụ đầy đủ cho

nền tảng STM32. Việc ST không cung cấp môi trường phát triển chính thức của mình (chẳng hạn như Microchip cung

cấp cho các MCU của họ) đã đẩy rất nhiều người ra khỏi nền tảng này. Đây là một rủi ro chiến lược mà những người

ở ST nên nghiêm túc xem xét. • Tài liệu rời rạc và phân tán: ST đang tích cực làm việc để cải thiện tài liệu

chính thức của mình cho nền tảng STM32. Bạn có thể tìm thấy rất nhiều bảng dữ liệu thực sự khổng lồ trên trang web

của ST, nhưng vẫn còn thiếu tài liệu tốt, đặc biệt là cho HAL của nó. Các phiên bản gần đây của CubeHAL cung cấp

một hoặc nhiều tệp “CHM”¹⁵, được tạo tự động từ

¹⁵a Tệp CHM là định dạng tệp điển hình của Microsoft được sử dụng để phân phối tài liệu ở định dạng HTML chỉ trong một tệp. Nó thực sự phổ biến trên
hệ điều hành Windows và bạn có thể tìm thấy một số công cụ miễn phí tốt trên MacOS và Linux để đọc chúng.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 24

tài liệu bên trong mã nguồn CubeHAL. Tuy nhiên, những tệp đó không đủ để bắt đầu lập trình với

khung này, đặc biệt nếu bạn chưa quen với hệ sinh thái STM32 và thế giới Cortex-M.

• Lỗi HAL: thật không may, HAL chính thức từ ST chứa một số lỗi và một số lỗi thực sự nghiêm
trọng và dẫn đến sự nhầm lẫn cho người mới. Ví dụ: trong quá trình phát triển cuốn sách này,
tôi đã tìm thấy lỗi trong một số tập lệnh liên kết¹⁶ (được coi là khối nền tảng của HAL) và
trong một số quy trình quan trọng sẽ hoạt động trơn tru. Mỗi ngày, ít nhất một bài đăng mới
liên quan đến lỗi HAL xuất hiện trên diễn đàn ST chính thức¹⁷ và điều này có thể gây ra sự thất
vọng lớn. ST đang tích cực làm việc để sửa các lỗi HAL, nhưng có vẻ như chúng tôi vẫn còn lâu
mới có được “bản phát hành ổn định”. Hơn nữa, vòng đời phát hành phần mềm của họ quá cũ và
không phù hợp với thời đại chúng ta đang sống: các bản sửa lỗi được phát hành sau vài tháng và
đôi khi bản sửa lỗi gây ra nhiều vấn đề hơn bản thân mã bị hỏng. ST nên nghiêm túc xem xét đầu
tư ít hơn vào việc thiết kế bộ công cụ phát triển tiếp theo và đầu tư nhiều hơn vào việc phát
triển STM32 HAL tử tế, vốn hiện không phù hợp với sự phát triển phần cứng. Tôi trân trọng đề
nghị phát hành toàn bộ HAL trên một cộng đồng dành cho các nhà phát triển như github và để cộng
đồng giúp sửa lỗi. Điều này cũng sẽ đơn giản hóa đáng kể quy trình báo cáo lỗi, hiện đang được
yêu cầu đối với các bài đăng rải rác trên diễn đàn ST. Một điều đáng tiếc thực sự.

1.3 Xem nhanh các phân họ STM32

Như bạn đã đọc, STM32 là một dòng sản phẩm khá phức tạp, bao gồm hơn mười dòng sản phẩm con.
Hình 13 và Hình 14 tóm tắt danh mục STM32 hiện tại¹⁸. Các sơ đồ tổng hợp các phân họ thành bốn nhóm
vĩ mô: MCU hiệu suất cao, Dòng chính, Không dây và Công suất cực thấp.

Bộ vi điều khiển hiệu năng cao là những MCU STM32 dành riêng cho các ứng dụng sử dụng nhiều CPU và
đa phương tiện. Chúng là các MCU dựa trên Cortex-M3/4F/7, với tần số xung nhịp tối đa nằm trong
khoảng từ 120MHz (F2) đến 400MHz (H7). Tất cả các MCU trong nhóm này đều cung cấp ARTTM Accelerator,
một công nghệ ST cho phép thực thi 0-wait từ bộ nhớ flash.

¹⁶http://bit.ly/1iRAKdf
¹⁷http://bit.ly/1LTf2MS
¹⁸Sơ đồ được lấy từ tài liệu quảng cáo ST Microelectronics này (http://bit.ly/1G7HMFj).
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 25

Hình 13: Danh mục STM32


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 26

Hình 14: Danh mục STM32

MCU chính được phát triển cho các ứng dụng nhạy cảm về chi phí, trong đó chi phí của MCU phải
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 27

thậm chí ít hơn 1 đô la/pc và không gian là một hạn chế lớn. Trong nhóm này, chúng ta có thể tìm thấy các
MCU dựa trên Cortex-M0/3/4, với tần số xung nhịp tối đa nằm trong khoảng từ 48MHz (F0) đến hơn 72MHz (F1/F3).

MCU không dây là dòng vi điều khiển STM32 lõi kép hoàn toàn mới với mặt trước radio 2,4 GHz tích hợp phù
hợp cho các ứng dụng không dây và Bluetooth. Các MCU này có lõi Cortex-M0+ (có tên là Bộ xử lý mạng) dành

riêng cho quản lý vô tuyến (ngăn xếp BLE 5.0 đồng hành cũng được cung cấp bởi ST) và lõi Cortex-M4 có thể

lập trình cho người dùng (có tên là Bộ xử lý ứng dụng) cho ứng dụng nhúng chính.

Nhóm Công suất cực thấp bao gồm các họ MCU STM32 giải quyết các ứng dụng tiêu thụ điện năng thấp, được sử

dụng trong các thiết bị chạy bằng pin cần giảm tổng mức tiêu thụ điện năng xuống mức thấp để đảm bảo tuổi

thọ pin lâu hơn. Trong nhóm này, chúng ta có thể tìm thấy cả MCU dựa trên Cortex-M0+, dành cho các ứng dụng

nhạy cảm về chi phí và bộ vi điều khiển dựa trên Cortex-M4F với Thay đổi tỷ lệ điện áp động (DVS), một công

nghệ cho phép tối ưu hóa điện áp bên trong CPU theo tần số của nó.

Các đoạn sau đây mô tả ngắn gọn về từng họ STM32, giới thiệu các tính năng chính của nó. Những cái quan

trọng nhất sẽ được tóm tắt bên trong các bảng. Các bảng được sắp xếp bởi tác giả của cuốn sách này, lấy cảm

hứng từ tài liệu chính thức của ST.

1.3.1 F0

Bảng 4: Các tính năng của STM32F0

Sê-ri STM32F0 là dòng MCU 32 bit nổi tiếng có giá 32 xu từ danh mục đầu tư STM32. Nó được thiết kế để có mức
giá hợp lý có thể cạnh tranh với các MCU 8/16-bit từ các nhà cung cấp khác, cung cấp một nền tảng tiên tiến

và mạnh mẽ hơn.

Các tính năng quan trọng nhất của loạt bài này là:

• Cốt lõi:

– Lõi ARM Cortex-M0 ở xung nhịp tối đa 48 MHz.


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 28

– Tùy chọn Cortex-M0 bao gồm Bộ hẹn giờ SysTick. •


Bộ nhớ: –
RAM tĩnh từ 4 đến 32 KB.

– Flash từ 16 đến 256 KB.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết
bị ngoại vi: –
Mỗi thiết bị sê-ri F0 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem
Bảng 4 để biết tổng quan nhanh).
• Nguồn dao động bao gồm RC bên trong (8 MHz, 40 kHz), HSE bên ngoài tùy chọn (4 đến 32 MHz),
LSE (32,768 đến 1000 kHz).

• Gói IC: LQFP, TSSOP20¹⁹, UFBGA, UFQFPN, WLCSP (xem Bảng 4 để biết thêm về điều này). • Dải điện áp
hoạt động là 2.0V đến 3.6V với khả năng giảm xuống 1.8V ±8%.

1.3.2 F1

Bảng 5: Các tính năng của STM32F1

Sê-ri STM32F1 là MCU dựa trên ARM đầu tiên của ST. Được giới thiệu trên thị trường vào năm 2007, đây vẫn

là MCU phổ biến nhất trong danh mục STM32. Rất nhiều bo mạch phát triển có sẵn trên thị trường, do ST và
các nhà cung cấp khác sản xuất, và bạn sẽ tìm thấy vô số ví dụ trên web về bộ vi điều khiển F1. Nếu bạn
chưa quen với thế giới STM32, có lẽ dòng F1 là lựa chọn tốt nhất để bắt đầu tìm hiểu nền tảng này.

Sê-ri F1 đã phát triển theo thời gian bằng cách tăng tốc độ, kích thước bộ nhớ trong, nhiều loại thiết bị
ngoại vi. Có 5 dòng F1: Connectivity (STM32F105/107), Performance (STM32F103), USB Access (STM32F102),
Access (STM32F101), Value (STM32F100).

Các tính năng quan trọng nhất của loạt bài này là:

¹⁹F0/L0 là những dòng STM32 duy nhất cung cấp gói tiện lợi này.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 29

• Cốt lõi:

– Lõi ARM Cortex-M3 với xung nhịp tối đa nằm trong khoảng từ 24 đến 72 MHz.

• Bộ nhớ: –
RAM tĩnh từ 4 đến 96 KB.

– Flash từ 16 đến 256 KB.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. •

Thiết bị ngoại

vi: – Mỗi thiết bị sê-ri F1 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem
Bảng 5 để biết tổng quan nhanh).

• Nguồn dao động bao gồm RC bên trong (8 MHz, 40 kHz), HSE bên ngoài tùy chọn (4-24MHz(F100),
4-16MHz(F101/2/3), 3-25MHz (F105/7), LSE (32,768 - 1000 kHz) ).

• Các gói IC: LFBGA, LQFP, UFBGA, UFQFPN, WLCSP (xem Bảng 5 để biết thêm về điều này). • Dải
điện áp hoạt động là 2.0V đến 3.6V • Nhiều
tùy chọn kết nối, bao gồm Ethernet, CAN và USB 2.0 OTG.

1.3.3 F2

Bảng 6: Các tính năng của STM32F2

Sê-ri STM32F2 của bộ vi điều khiển STM32 là giải pháp hiệu quả về chi phí trong phân khúc mance hiệu
suất cao. Đây là MCU dựa trên Cortex-M3 mới nhất và nhanh nhất, với Bộ gia tốc ARTTM độc quyền từ ST.
F2 tương thích pin-to-pin với STM32 F4-series. STM32F2 là MCU được các nhà phát triển đồng hồ Pebble nổi
tiếng lựa chọn cho chiếc đồng hồ thông minh đầu tiên của họ.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 30

Hình 15: Đồng hồ Pebble đầu tiên có STM32F205 MCU bên trong

Các tính năng quan trọng nhất của loạt bài này là:

• Cốt lõi:

– Lõi ARM Cortex-M3 với xung nhịp tối đa 120 MHz.

• Ký ức:
– RAM tĩnh từ 64 đến 128 KB.
*
4 KB được hỗ trợ bởi pin, 80 byte được hỗ trợ bởi pin với chức năng xóa phát hiện giả mạo.

– Flash từ 128 đến 1024 KB.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết

bị ngoại vi: –

Mỗi thiết bị sê-ri F2 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem
Bảng 6 để biết tổng quan nhanh).

• Bộ tạo dao động bao gồm RC bên trong (16 MHz, 32 kHz), HSE bên ngoài tùy chọn (1 đến 26 MHz), LSE
(32,768 đến 1000 kHz).

• Các gói IC: BGA, LQFP, UFBGA, WLCSP (xem Bảng 6 để biết thêm về điều này). • Dải

điện áp hoạt động là 1,8V đến 3,6V.


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 31

1.3.4 F3

Bảng 7: Các tính năng của STM32F3

STM32F3 là dòng MCU mạnh nhất trong phân khúc Mainstream, dựa trên lõi ARM Cortex-M4F. Nó được
thiết kế để tương thích gần như pin-to-pin với STM32 F1-series, ngay cả khi nó không cung cấp cùng
loại thiết bị ngoại vi. STM32F3 là MCU được chọn bởi các nhà phát triển đồ chơi droid²⁰ BB-8 của
Sphero²¹.

Đặc điểm nổi bật của dòng sản phẩm này là sự hiện diện của các thiết bị ngoại vi tương tự tích hợp
giúp giảm chi phí ở cấp độ ứng dụng và đơn giản hóa thiết kế ứng dụng, bao gồm:

• Bộ so sánh cực nhanh (25 ns).


• Op-amp với độ lợi có thể lập trình
được. • DAC 12-

bit. • ADC 12-bit cực nhanh với 5 MSPS (Million Samples Per Second) trên mỗi kênh (lên đến 18
MSPS ở chế độ xen
kẽ). • ADC sigma-delta 16-bit chính xác (21
kênh). • Bộ hẹn giờ điều biến độ rộng xung 16 bit nâng cao 144 MHz (độ phân giải < 7 ns) cho
các ứng dụng điều khiển; hẹn giờ độ phân giải cao (217 pico giây), tự bù so với nguồn điện
và độ lệch nhiệt độ.

Một tính năng thú vị khác của sê-ri này là sự hiện diện của Bộ nhớ ghép nối lõi (CCM), một kiến
trúc bộ nhớ cụ thể ghép nối một số vùng bộ nhớ với lõi CPU, cho phép 0-wait
²⁰http://cnet.co/1M2NyJS
²¹http://www.sphero.com/
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 32

Những trạng thái. Điều này có thể được sử dụng để tăng cường các thói quen quan trọng về thời gian, cải thiện hiệu suất lên tới

40%. Ví dụ, các thói quen của hệ điều hành để chuyển ngữ cảnh có thể được lưu trữ trong khu vực này để tăng tốc các hoạt động RTOS.

Các tính năng quan trọng nhất của loạt bài này là:

Hình 16: Người máy BB-8 được tạo bằng MCU STM32F3

• Cốt lõi:

– Lõi ARM Cortex-M4F với tốc độ xung nhịp tối đa là 72 MHz.

• Bộ nhớ: –

RAM tĩnh từ 16 đến 80 KB cho mục đích chung với tính năng kiểm tra tính chẵn lẻ của phần cứng.
*
Pin hỗ trợ 64/128 byte với khả năng xóa phát hiện giả mạo.

– Bộ nhớ ghép lõi lên tới 8 KB (CCM) với tính năng kiểm tra tính chẵn lẻ của phần cứng.

– Flash từ 32 đến 512 KB.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết bị ngoại vi:

– Mỗi thiết bị sê-

ri F3 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem

Bảng 7 để biết tổng quan nhanh).

• Bộ tạo dao động bao gồm RC bên trong (8 MHz, 40 kHz), HSE bên ngoài tùy chọn (4 đến 32 MHz), LSE (32,768 đến 1000 kHz).

• Các gói IC: LQFP, UFBGA, UFQFPN, WLCSP (xem Bảng 7 để biết thêm về điều này). Điều hành

dải điện áp là 1,8V ±8%. đến 3,6V.


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 33

1.3.5 F4

Bảng 8: Các tính năng của STM32F4

Sê-ri STM32F4 là nhóm MCU dựa trên Cortex-M4F phổ biến nhất trong phân khúc Hiệu năng cao. Sê-ri F4 cũng
là sê-ri STM32 đầu tiên có các lệnh DSP và Dấu phẩy động SP. F4 tương thích từng chân với dòng STM32 F2 và
thêm tốc độ xung nhịp cao hơn, RAM tĩnh 64K CCM, I²S song công hoàn toàn, đồng hồ thời gian thực được cải
thiện và ADC nhanh hơn. Sê-ri STM32F4- cũng được nhắm mục tiêu đến các ứng dụng đa phương tiện và một số
MCU cung cấp hỗ trợ dành riêng cho LCD TFT.

Các tính năng quan trọng nhất của loạt bài này là:
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 34

• Lõi: –

Lõi ARM Cortex-M4F với xung nhịp tối đa từ 84 đến 180 MHz. • Bộ nhớ: – RAM tĩnh từ 128 đến

384 KB.

*
4 KB được hỗ trợ bởi pin, 80 byte được hỗ trợ bởi pin với chức năng xóa phát hiện giả mạo.

– Bộ nhớ ghép lõi 64 KB (CCM).

– Flash từ 256 đến 2048 KB.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết bị ngoại

vi: – Mỗi thiết

bị sê-ri F4 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem

Bảng 8 để biết tổng quan nhanh).

• Bộ tạo dao động bao gồm RC bên trong (16 MHz, 32 kHz), HSE bên ngoài tùy chọn (4 đến 26 MHz), LSE (32,768 đến

1000 kHz). • Gói IC:

BGA, LQFP, TFBGA, UFBGA, UFQFPN, WLCSP (xem Bảng 8 để biết thêm về

cái này).

• Dải điện áp hoạt động là 1,8V đến 3,6V.

1.3.6 F7

Bảng 9: Các tính năng của STM32F7


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 35

Sê-ri STM32F7 là MCU hiệu năng cực cao mới nhất trong phân khúc Hiệu suất cao và đây là MCU dựa trên Cortex-M7
đầu tiên được giới thiệu trên thị trường. Nhờ có Bộ gia tốc ARTTM của ST cũng như bộ nhớ đệm L1, các thiết bị

STM32F7 mang lại hiệu suất lý thuyết tối đa của Cortex M7 bất kể mã được thực thi từ flash nhúng hay bộ nhớ

ngoài: 1082 CoreMark/462 DMIPS ở 216 MHz. STM32F7 được nhắm mục tiêu rõ ràng cho các ứng dụng nhúng đa phương

tiện nặng.

Nhờ chương trình tuổi thọ STM32 (10 năm), có thể phát triển các ứng dụng nhúng mạnh mẽ mà không phải lo lắng về

tính khả dụng của MCU trên thị trường trong tương lai xa. Cortex M7 tương thích ngược với tập lệnh Cortex-M4 và

sê-ri STM32F7 tương thích từng chân với sê-ri STM32F4.

Các tính năng quan trọng nhất của loạt bài này là:

• Lõi: –
Lõi ARM Cortex-M7 với xung nhịp tối đa là 216 MHz.

• Bộ nhớ: –
RAM tĩnh lên tới 512 KB với kiến trúc phân tán.

– Bộ nhớ đệm L1 (I/D lên tới 16 KB + 16 KB).


– Flash từ 512 đến 2048 KB.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết bị
ngoại vi: – Mỗi
thiết bị dòng F7 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem

Bảng 9 để biết tổng quan nhanh).


• Bộ tạo dao động bao gồm RC bên trong (16 MHz, 32 kHz), HSE bên ngoài tùy chọn (4 đến 26 MHz), LSE (32,768

đến 1000 kHz). • Các

gói IC: LQFP, TFBGA, UFBGA, WLCSP (xem Bảng 9 để biết thêm về điều này). • Dải điện áp hoạt

động là 1,7V đến 3,6V.

1.3.7 H7

Bảng 10: Các tính năng của STM32H7


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 36

ST đã công bố vào tháng 10 năm 2016 một dòng MCU STM32 mới: STM32H7. Đây là Cortex-M7 được sản xuất với quy trình

40nm, có thể chạy lên đến 400MHz. Nó cũng cung cấp một SRAM 1 MB với cùng một kiến trúc phân tán được tìm thấy

trong STM32F7-series. Theo tác giả này, dòng MCU STM32 này sẽ mở ra cánh cửa cho các MCU STM32 lõi kép, đưa đến

quy trình sản xuất 40nm.

Tại thời điểm hoàn thiện cuốn sách, đây là thông số kỹ thuật của sê-ri STM32H7:

• Lõi: –
Lõi ARM Cortex-M7 với xung nhịp tối đa là 400 MHz.

• Bộ nhớ: –
RAM tĩnh lên tới 1024 KB với kiến trúc phân tán.

– Bộ nhớ đệm L1 (I/D lên tới 16 KB + 16 KB).


– Flash từ 512 đến 2048 KB.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết bị
ngoại vi: – Một
số thiết bị ngoại vi mới như ADC 14-bit và SAI mới.
• Gói IC: LQFP, TFBGA • Pin-to-pin

tương thích với STM32F7-series.

Cuốn sách này không bao gồm STM32H7.

1.3.8 L0

Bảng 11: Các tính năng của STM32L0

Dòng STM32L0 là giải pháp hiệu quả về chi phí của phân khúc Công suất cực thấp. Sự kết hợp giữa lõi ARM Cortex-

M0+ và các tính năng tiêu thụ năng lượng cực thấp giúp STM32L0 phù hợp nhất cho các ứng dụng hoạt động bằng pin

hoặc được cung cấp năng lượng nhờ thu hoạch năng lượng, mang đến mức tiêu thụ điện năng thấp nhất thế giới ở

125°C. STM32L0 cung cấp khả năng mở rộng điện áp động, bộ dao động xung nhịp cực thấp, giao diện LCD, bộ so sánh,

DAC và mã hóa phần cứng. Giá trị tham chiếu tiêu thụ hiện tại:
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 37

• Chế độ chạy động: xuống tới 87 μA/MHz. • Chế

độ năng lượng cực thấp + RAM đầy đủ + hẹn giờ năng lượng thấp: 440 nA (16 dòng đánh thức). •

Chế độ năng lượng cực thấp + thanh ghi dự phòng: 250 nA (3 dòng đánh thức).

• Thời gian đánh thức: 3,5 µs.

Các tính năng quan trọng nhất của loạt bài này là:

• Lõi: –

Lõi ARM Cortex-M0+ với tốc độ xung nhịp tối đa là 32 MHz.

• Ký ức:
– RAM tĩnh 8 KB.

* Pin hỗ trợ 20 byte với chức năng xóa phát hiện giả mạo.
– Flash từ 32 đến 64 KB.

– EEPROM lên đến 2 KB (với ECC).

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết bị

ngoại vi: – Mỗi

dòng L0 có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem Bảng 11 để biết tổng quan nhanh). •

Bộ tạo dao động bao gồm

RC bên trong (16 MHz, 37 kHz), HSE bên ngoài tùy chọn (1 đến 24 MHz), LSE
(32,768kHz).

• Các gói IC là LQFP, TFBGA, UFQFPN, WLCSP (xem Bảng 11 để biết thêm về điều này). • Dải điện áp

hoạt động là 1,65V đến 3,6V.

1.3.9 L1

Bảng 12: Tính năng STM32L1


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 38

Dòng STM32L1 là giải pháp tầm trung của phân khúc Công suất cực thấp. Sự kết hợp giữa lõi ARM Cortex-M3 với FPU và các

tính năng tiêu thụ điện năng cực thấp làm cho STM32L1 trở nên tối ưu cho các ứng dụng hoạt động bằng pin cũng yêu cầu

đủ năng lượng tính toán. Giống như dòng L0, STM32L1 cung cấp khả năng mở rộng điện áp động, bộ dao động xung nhịp cực

thấp, giao diện LCD, bộ so sánh, DAC và mã hóa phần cứng.

Giá trị tham chiếu tiêu thụ hiện tại:

• Chế độ năng lượng cực thấp: 280 nA với các thanh ghi dự phòng (3 chân đánh thức) •

Chế độ năng lượng cực thấp + RTC: 900 nA với các thanh ghi dự phòng (3 chân đánh thức) • Chế

độ chạy năng lượng thấp: xuống tới 9 μA • Chế

độ chạy động: xuống tới 177 μA/MHz

STM32L1 tương thích pin-to-pin với một số MCU từ sê-ri STM32F. Các tính năng quan trọng nhất của loạt bài này là:

• Cốt lõi:

– Lõi ARM Cortex-M3 với FPU ở tốc độ xung nhịp tối đa là 32 MHz.

• Bộ nhớ: –

RAM tĩnh từ 4 đến 80 KB.


*
20 byte được hỗ trợ bởi pin với tính năng xóa phát hiện giả mạo.

– Flash từ 32 đến 512 KB.

– EEPROM lên đến 2 KB (với ECC).

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết bị ngoại

vi: – Mỗi thiết

bị sê-ri L1 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem

Bảng 12 để biết tổng quan nhanh).

• Bộ tạo dao động bao gồm RC bên trong (16 MHz, 37 kHz), HSE bên ngoài tùy chọn (1 đến 24 MHz), LSE

(32,768kHz).

• Các gói IC là LQFP, TFBGA, UFBGA, UFQFPN, WLCSP (xem Bảng 12 để biết thêm về điều này). • Dải điện áp hoạt động

là 1,65V đến 3,6V, bao gồm bộ phát hiện mất điện có thể lập trình.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 39

1.3.10 L4

Bảng 13: Các tính năng của STM32L4

Sê-ri STM32L4 là một trong những sê-ri MCU tốt nhất trong phân khúc Công suất cực thấp.

Sự kết hợp giữa lõi ARM Cortex-M4 với FPU và các tính năng tiêu thụ năng lượng cực thấp giúp STM32L4 phù hợp

nhất cho các ứng dụng đòi hỏi hiệu suất cao khi hoạt động bằng pin hoặc được cấp nguồn bằng cách thu hoạch

năng lượng. Giống như dòng L1, STM32L4 cung cấp khả năng mở rộng điện áp động và bộ tạo dao động xung nhịp

cực thấp.

Giá trị tham chiếu tiêu thụ hiện tại:

• Chế độ năng lượng cực thấp: 30 nA với các thanh ghi dự phòng không có

RTC. • Chế độ năng lượng cực thấp + RTC: 330 nA với các thanh ghi dự phòng (5 dòng đánh
thức). • Chế độ tiêu thụ điện năng cực thấp + 32 Kbyte RAM:

360 nA. • Chế độ tiêu thụ điện năng cực thấp + 32 Kbyte RAM + RTC:
660 nA. • Chế độ chạy động: xuống tới 100 μA/MHz.

• Thời gian đánh thức: 5 μs.

STM32L4 tương thích pin-to-pin với một số MCU từ sê-ri STM32F. Các tính năng quan trọng nhất của loạt bài này
là:
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 40

• Cốt lõi:

– Lõi ARM Cortex-M4F với FPU ở tốc độ xung nhịp tối đa là 80 MHz.

• Bộ nhớ: –

RAM tĩnh lên tới 320 KB. 20


*
byte được hỗ trợ bởi pin với tính năng xóa phát hiện giả mạo.
– Kích thước flash từ 256 đến 1024 KB.

– Hỗ trợ giao diện SDDMC và FSMC.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết

bị ngoại vi: –

Mỗi thiết bị sê-ri L4 đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem

Bảng 13 để biết tổng quan nhanh).

• Bộ tạo dao động bao gồm RC bên trong (16 MHz, 37 kHz), HSE bên ngoài tùy chọn (1 đến 24 MHz), LSE
(32,768kHz).

• Các gói IC là LQFP, UFBGA, WLCSP (xem Bảng 13 để biết thêm về điều này). • Dải

điện áp hoạt động là 1,7V đến 3,6V.

1.3.11 L4+

Bảng 14: Các tính năng của STM32L4+

Dòng STM32L4+, được giới thiệu trên thị trường vào cuối năm 2017, là dòng MCU mới tốt nhất trong phân khúc

Công suất cực thấp. Dòng STM32L4+ phá vỡ khả năng xử lý


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 41

giới hạn trong thế giới năng lượng cực thấp bằng cách cung cấp 150 điểm DMIPS/409 CoreMark trong khi thực thi

từ bộ nhớ Flash bên trong và bằng cách nhúng 640 Kbyte SRAM cho phép các ứng dụng và thiết bị tiêu thụ năng

lượng thấp trong công nghiệp, y tế và tiêu dùng tiên tiến hơn. Bộ vi điều khiển STM32L4+ cung cấp khả năng mở

rộng điện áp động để cân bằng mức tiêu thụ điện năng với nhu cầu xử lý, thiết bị ngoại vi công suất thấp (LP

UART, bộ hẹn giờ LP) có sẵn ở chế độ Dừng, tính năng an toàn và bảo mật, thiết bị ngoại vi thông minh và

nhiều thiết bị ngoại vi tương tự tiên tiến và công suất thấp như op bộ khuếch đại, bộ so sánh, DAC 12 bit và

ADC 16 bit (lấy mẫu quá mức phần cứng). Sê-ri STM32L4+ mới cũng nhúng các tính năng đồ họa nâng cao cho phép

giao diện người dùng đồ họa hiện đại. Chrom‐ART Ac celerator™, bộ tăng tốc đồ họa phần cứng 2D độc quyền của

ST, xử lý hiệu quả các hoạt động đồ họa lặp đi lặp lại, giải phóng các khả năng của CPU chính để xử lý thời

gian thực hoặc thậm chí là các hoạt động đồ họa nâng cao hơn. Bộ tăng tốc Chrom‐ART được kết hợp với SRAM

tích hợp lớn, trình tối ưu hóa bộ nhớ hiển thị hình tròn Chrom‐GRC™, giao diện Octo-SPI thông lượng cao và bộ

điều khiển TFT và DSI tiên tiến, cho phép bạn đạt được đồ họa 'giống điện thoại thông minh' giao diện người

dùng trong một chip đơn và một giải pháp năng lượng cực thấp.

Giá trị tham chiếu tiêu thụ hiện tại:

• Chế độ năng lượng cực thấp: 20 nA với các thanh ghi dự phòng không có

RTC. • Chế độ năng lượng cực thấp + RTC: 200 nA với các thanh ghi dự phòng (5 dòng đánh

thức). • Chế độ tiêu thụ điện năng cực thấp + 64 Kbyte RAM:

800 nA. • Chế độ tiêu thụ điện năng cực thấp + 64 Kbyte RAM +

RTC: 1 μA. • Chế độ chạy động: xuống tới 43 μA/

MHz. • Thời gian đánh thức: 5 μs.

STM32L4+ tương thích kiểu pin-to-pin với một số MCU thuộc dòng STM32F. Các tính năng quan trọng nhất của loạt
bài này là:

• Cốt lõi:

– Lõi ARM Cortex-M4F với FPU ở tốc độ xung nhịp tối đa là 120 MHz.

• Bộ nhớ: –

RAM tĩnh lên tới 640 KB. 64


*
byte được hỗ trợ bởi pin với tính năng xóa phát hiện giả mạo.
– Kích thước flash từ 1024 đến 2048 KB.

– Hỗ trợ giao diện SDDMC và FSMC.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Thiết

bị ngoại vi: –

Mỗi thiết bị sê-ri L4+ đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem

Bảng 14 để biết tổng quan nhanh).

• Bộ tạo dao động bao gồm RC bên trong (16 MHz, 37 kHz), HSE bên ngoài tùy chọn (1 đến 24 MHz), LSE
(32,768kHz).

• Các gói IC là LQFP, UFBGA, WLCSP (xem Bảng 14 để biết thêm về điều này). • Dải điện

áp hoạt động là 1,7V đến 3,6V.


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 42

1.3.12 STM32WB

Bảng 15: Các tính năng của STM32WB

Dòng STM32WB được giới thiệu trên thị trường vào đầu năm 2018 là dòng MCU mới trong phân khúc Wireless. STM32WB là dòng

vi điều khiển STM32 lõi kép tích hợp tần số vô tuyến 2,4 GHz phù hợp cho các ứng dụng không dây và Bluetooth 5.0. Các MCU

này có lõi Cortex-M0+ chạy ở tốc độ 32 MHz (có tên là Bộ xử lý mạng) dành riêng cho việc quản lý vô tuyến (ngăn xếp BLE

5.0 đồng hành cũng được cung cấp bởi ST) và lõi Cortex-M4 có thể lập trình cho người dùng chạy ở tốc độ 64 MHz (có tên là

Ứng dụng Bộ xử lý) cho ứng dụng nhúng chính.

Nền tảng STM32WB là sự phát triển của dòng MCU công suất thấp STM32L4Ultra. Nó cung cấp các thiết bị ngoại vi tương tự và

kỹ thuật số phù hợp cho các ứng dụng yêu cầu thời lượng pin kéo dài và các chức năng phức tạp. STM32WB tích hợp một số

thiết bị ngoại vi giao tiếp, giao diện USB2.0 FS không pha lê thuận tiện, hỗ trợ âm thanh, trình điều khiển LCD, lên đến

72 GPIO, SMPS tích hợp để tối ưu hóa mức tiêu thụ điện năng và nhiều chế độ năng lượng thấp để tối đa hóa thời lượng pin.

Ngoài các tính năng không dây và tiêu thụ ít năng lượng, một trọng tâm cụ thể được đặt vào việc nhúng các chức năng phần

cứng bảo mật như AES 256-bit, PCROP, JTAG Fuse, PKA (công cụ mã hóa đường cong elip) và Dịch vụ bảo mật gốc (RSS). RSS cho

phép xác thực thông tin liên lạc OTA, bất kể ngăn xếp radio hoặc ứng dụng.

STM32WB55 là thiết bị được chứng nhận Bluetooth 5.0 và nó cung cấp hỗ trợ phần mềm Lưới 1.0, nhiều cấu hình và tính linh

hoạt để tích hợp các ngăn xếp BLE độc quyền. Ngăn xếp phần mềm được chứng nhận OpenThread cũng có sẵn. Đài cũng có thể

chạy đồng thời các giao thức BLE/OpenThread. MAC chung được nhúng cho phép sử dụng các ngăn xếp độc quyền khác của IEEE

802.15.4 như ZigBee® hoặc các giao thức độc quyền, thậm chí còn cung cấp nhiều tùy chọn hơn để kết nối các thiết bị với

Internet of Things (IoT).

• Cốt lõi:

– Lõi ARM Cortex-M4F với FPU ở tốc độ xung nhịp tối đa là 64 MHz (Bộ xử lý ứng dụng). * Lõi ARM Cortex-M0+ có

tốc độ xung nhịp tối đa là 32 MHz (Bộ xử lý mạng). • Bộ nhớ: – RAM tĩnh lên tới 256 KB.

– Kích thước flash lên tới 1024 KB.


Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 43

– Hỗ trợ giao diện Quad-SPI.

– Mỗi chip có một số nhận dạng thiết bị duy nhất 96-bit do nhà máy lập trình. • Đài:

– Giao diện người dùng và ngăn xếp radio tương thích với BLE 5.0.

– Giao diện người dùng vô tuyến tương thích IEEE 802.15.4.

– Khả năng nâng cấp chương trình cơ sở qua mạng.

– Hỗ trợ cho Bộ khuếch đại công suất bên ngoài. •

Thiết bị ngoại

vi: – Mỗi thiết bị sê-ri WB đều có một loạt thiết bị ngoại vi khác nhau giữa các dòng (xem

Bảng 15 để biết tổng quan nhanh).

• Bộ tạo dao động bao gồm một số RC bên trong (16 MHz, 32 kHz), HSE bên ngoài tùy chọn (1 đến 24 MHz), LSE

(32,768kHz). • Các gói IC

là WLCSP, UFQFPN, VFQFPN (xem Bảng 15 để biết thêm về điều này). • Dải điện áp hoạt động là

1,7V đến 3,6V.

Tại thời điểm viết chương này (tháng 5 năm 2018) ST vẫn chưa phát hành CubeHAL dành riêng cho dòng STM32WB. Hơn

nữa, một bảng Nucleo cụ thể dự kiến sẽ được phát hành vào tháng 6 năm 2018.

1.3.13 Làm cách nào để chọn MCU phù hợp với bạn?

Chọn một bộ vi điều khiển cho một dự án mới không bao giờ là một nhiệm vụ tầm thường, trừ khi bạn đang sử dụng lại

một thiết kế trước đó. Trước hết, có hàng chục nhà sản xuất MCU trên thị trường, mỗi nhà sản xuất đều có thị phần

và đối tượng riêng. ST, Microchip, TI, Atmel, Renesas, NXP, v.v.²² . Trong trường hợp của chúng tôi, chúng tôi rất

may mắn: chúng tôi đã chọn được một thương hiệu.

Như chúng ta đã thấy trong các đoạn trước, STM32 thực sự là một danh mục đầu tư phong phú. Chúng tôi có thể chọn

một MCU từ hơn 500 thiết bị (nếu chúng tôi cũng xem xét các biến thể của gói). Vì vậy, bắt đầu từ đâu?

Trong một thế giới lý tưởng, bước đầu tiên của quá trình lựa chọn liên quan đến sự hiểu biết về sức mạnh tính toán

cần thiết. Nếu chúng ta định phát triển một ứng dụng chuyên sâu về CPU, tập trung vào các ứng dụng đồ họa và đa

phương tiện, thì chúng ta phải chuyển sự chú ý sang nhóm vi điều khiển STM32 Hiệu suất cao. Mặt khác, nếu khả năng

tính toán không phải là yêu cầu chính đối với thiết bị điện tử của chúng ta, thì chúng ta có thể tập trung vào phân

khúc Dòng chính, xem xét kỹ dòng STM32F1 mang đến nhiều lựa chọn phong phú nhất.

Bước tiếp theo là về các yêu cầu kết nối. Nếu chúng ta cần tương tác với thế giới bên ngoài thông qua kết nối

Ethernet hoặc các giao thức công nghiệp khác như bus CAN và ứng dụng của chúng ta phải đáp ứng và có thể xử lý một

số Giao thức Internet, thì danh mục STM32F4 có lẽ là lựa chọn tốt nhất của bạn; nếu không thì đường kết nối

STM32F105/7 là lựa chọn tốt hơn.

²²Bạn có thể tìm thấy danh sách tốt về các nhà sản xuất MCU tại đây (http://bit.ly/1VUkN2e). Xin lưu ý rằng trong những năm qua, một số
công ty được đề cập đã sáp nhập để cố gắng tồn tại trong một thị trường đã trở nên rất đông đúc.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 44

Nếu chúng tôi định phát triển một thiết bị chạy bằng pin (có thể là sản phẩm bán chạy nhất mới trên thị trường

thiết bị đeo), thì chúng tôi phải xem xét lựa chọn STM32L, chọn giữa các dòng phụ khác nhau tùy theo sức mạnh

tính toán mà chúng tôi cần.

Như đã nêu ở đầu đoạn này, đây là quá trình lựa chọn diễn ra trong một thế giới lý tưởng. Nhưng còn thế giới

thực thì sao? Trong quá trình phát triển hàng ngày, có lẽ chúng ta phải trả lời các câu hỏi sau trước khi bắt

đầu chọn MCU phù hợp cho dự án của mình:

• Thiết bị này được nhắm mục tiêu cho thị trường đại chúng hay thị trường ngách?

Nếu bạn đang phát triển một thiết bị sẽ được sản xuất với số lượng nhỏ, thì sự khác biệt về giá giữa các

bộ vi điều khiển STM32 sẽ không ảnh hưởng quá nhiều đến dự án của bạn. Bạn cũng có thể xem xét STM32F7

hoàn toàn mới và ít chú ý đến việc tối ưu hóa phần mềm (khi xử lý các MCU hiệu suất thấp, bạn phải cố gắng

hết sức để tối ưu hóa mã của mình. Hãy nhớ rằng đây cũng là chi phí làm tăng khoản đầu tư cuối cùng). Mặt

khác, nếu bạn định chế tạo một thiết bị dành cho thị trường đại chúng, thì giá của một IC duy nhất thực sự

quan trọng: bạn sẽ tiết kiệm được bao nhiêu trong quá trình sản xuất thường cao hơn khoản đầu tư ban đầu.

• Ngân sách cho phép cho tổng BOM là bao nhiêu?

Đây là một hệ quả của điểm trước đó. Nếu bạn đã có giá mục tiêu cho bảng của mình, thì bạn phải cẩn thận

chọn đúng MCU trong giai đoạn đầu.

• Còn những hạn chế về không gian thì sao? Bo mạch của bạn có phải vừa với thiết bị đeo được mới nhất hay

bạn có đủ chỗ để sử dụng gói IC mà bạn thích không? Câu trả lời cho câu hỏi này ảnh hưởng sâu sắc đến quá

trình lựa chọn MCU và những gì chúng ta có thể yêu cầu về hiệu suất và khả năng của thiết bị ngoại vi. •

Công nghệ sản xuất nào công ty

tôi có thể mua được?

Đây là một câu hỏi không tầm thường khác. Các gói LQFP vẫn thực sự phổ biến trên thị trường MCU nhờ thực

tế là chúng không đòi hỏi chi phí sản xuất phức tạp và chúng có thể dễ dàng lắp ráp ngay cả trên dây chuyền

sản xuất cũ. Các gói BGA và WLCSP yêu cầu thiết bị kiểm tra X-Ray và có thể ảnh hưởng đến quá trình lựa

chọn của bạn. • Thời gian đưa sản phẩm ra thị trường có

quan trọng đối với bạn không?

Thời gian đưa sản phẩm ra thị trường luôn là yếu tố then chốt đối với bất kỳ ai kinh doanh, nhưng đôi khi

bạn được yêu cầu chuẩn bị sẵn chương trình cơ sở vào ngày trước khi bắt đầu quá trình phát triển. Điều này

có thể dẫn đến phần sụn không được tối ưu hóa, ít nhất là ở giai đoạn đầu. Điều này có nghĩa là một MCU có

nhiều sức mạnh tính toán hơn có thể là lựa chọn tốt nhất cho bạn. •

Bạn có thể sử dụng lại bố cục bảng hoặc mã không?

Mọi nhà phát triển nhúng đều có danh mục thư viện và IC nổi tiếng. Phát triển phần mềm là một nhiệm vụ

phức tạp bao gồm nhiều giai đoạn trước khi chúng tôi có thể coi phần sụn của mình ổn định và sẵn sàng để

sản xuất. Đôi khi (điều này đang xảy ra rất thường xuyên hiện nay), bạn phải xử lý các lỗi phần cứng không

có giấy tờ hoặc ít nhất là với hành vi không thể đoán trước của chúng.

Điều này ngụ ý rằng bạn phải thực sự cẩn thận khi quyết định chuyển sang một kiến trúc khác hoặc thậm chí
là một MCU khác trong cùng series.

Một trong những tính năng chính của nền tảng STM32 có thể giúp ích rất nhiều trong quá trình lựa chọn: khả năng

tương thích pin-to-pin. Điều này cho phép bạn chọn một MCU mạnh hơn (hoặc rẻ hơn) trong quá trình
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 45

quá trình lựa chọn, cho phép bạn tự do thay đổi nó ở giai đoạn phát triển nâng cao hơn.
Ví dụ, đối với một bo mạch mà tôi đã phát triển gần đây, tôi đã bắt đầu bằng cách chọn một MCU
STM32F1, nhưng tôi đã hạ cấp nó xuống một STM32F0 rẻ hơn khi tôi đi đến kết luận rằng nó sẽ đáp
ứng các yêu cầu của tôi. Tuy nhiên, hãy nhớ rằng quá trình này luôn liên quan đến việc điều chỉnh
mã cho các họ con khác nhau.

Hình 17: Công cụ lựa chọn STM32 có sẵn trên trang web của ST

ST cung cấp hai công cụ thuận tiện để giúp bạn trong quá trình lựa chọn MCU. Công cụ đầu tiên có
sẵn trên trang web ST²³, trong phần STM32: một công cụ tìm kiếm tham số cho phép bạn chọn các tính
năng mà bạn quan tâm. Công cụ này tự động lọc kết quả để hiển thị các MCU phù hợp với yêu cầu của
bạn.
²³http://www.st.com/web/en/catalog/mmc/FM141/SC1169
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 46

Hình 18: Ứng dụng MCU Finder cho Android OS

Công cụ thứ hai là một ứng dụng di động hữu ích có sẵn cho iOS²⁴, Android²⁵ và Windows Mobile²⁶.

1.4 Ban phát triển hạt nhân

Mỗi văn bản thực tế về một thiết bị điện tử đều yêu cầu một bảng phát triển (còn được gọi là bộ công
cụ) để bắt đầu làm việc với nó. Trong thế giới STM32, bo mạch phát triển phổ biến nhất là STM32
Discovery. ST đã phát triển hơn 20 bảng khám phá khác nhau hữu ích để kiểm tra các MCU STM32 và khả
năng của chúng.

Hình 19: Bộ Discovery STM32L0538 được ST giới thiệu năm 2015

Ví dụ, bảng STM32L0538DISCOVERY mới (Hình 19) cho phép kiểm tra cả STM32L053 MCU và màn hình e-paper.
Bạn có thể tìm thấy rất nhiều hướng dẫn trên Internet bao gồm các bảng từ dòng Discovery.

²⁴http://apple.co/Uf20WR
²⁵http://bit.ly/1Pvo8EV
²⁶http://bit.ly/1Gf4YBd
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 47

ST gần đây đã giới thiệu một loạt bo mạch phát triển hoàn toàn mới: Nucleo. Dòng Nucleo được chia
thành ba nhóm chính: Nucleo-32, Nucleo-64 và Nucleo-144 (xem Hình 20). Tên của mỗi nhóm xuất phát
từ loại gói MCU được sử dụng: Nucleo-32 sử dụng STM32 trong gói LQFP-32; Nucleo-64 sử dụng
LQFP-64; Nucleo-144 và LQFP-144. Nucleo-64 là dòng đầu tiên được giới thiệu ra thị trường và có
16 bo mạch khác nhau²⁷, mỗi bo mạch có một bộ vi điều khiển STM32 nhất định. Nucleo-144 đã được
giới thiệu vào tháng 1 năm 2016 và đây là bộ giá rẻ đầu tiên trang bị cho STM32F746 mạnh mẽ. Nó
cũng cung cấp một phyther²⁸ Ethernet và một cổng LAN. Vì Nucleo-64 là phạm vi đầy đủ nhất nên
cuốn sách này sẽ chỉ đề cập đến loại bảng này. Trong các phần còn lại của cuốn sách này, chúng
tôi đề cập đến Nucleo-64 đơn giản bằng thuật ngữ “Nucleo”.

Nucleo bao gồm hai phần, như thể hiện trong Hình 21. Phần có đầu nối mini-USB là trình gỡ lỗi tích
hợp ST-LINK 2.1, được sử dụng để tải chương trình cơ sở lên MCU đích và thực hiện từng bước gỡ
lỗi. Giao diện ST-LINK cũng cung cấp Cổng COM ảo (VCP), có thể được sử dụng để trao đổi dữ liệu
và tin nhắn với PC chủ. Một tính năng chính của bảng Nucleo là giao diện ST-LINK có thể dễ dàng
tách khỏi phần còn lại của bảng (hai cái kéo màu đỏ trong Hình 21 cho biết vị trí bị gãy). Bằng
cách này, nó có thể được sử dụng như một bộ lập trình ST-LINK độc lập (một bộ lập trình ST-LINK
độc lập có giá khoảng 25 đô la). Tuy nhiên, ST-LINK cung cấp một giao diện SWD tùy chọn có thể
được sử dụng để lập trình một bo mạch khác mà không cần tách giao diện ST-LINK khỏi Nucleo (như
đã xảy ra với các bo mạch Discovery) bằng cách loại bỏ hai nút nhảy có nhãn ST LINK. Phần còn
lại của bảng chứa MCU đích (bộ vi điều khiển mà chúng tôi sẽ sử dụng để phát triển các ứng dụng
của mình), nút ĐẶT LẠI, nút xúc giác có thể lập trình của người dùng và đèn LED. Bo mạch cũng
chứa một miếng đệm để gắn tinh thể tốc độ cao bên ngoài (HSE). Tất cả các bo mạch Nucleo gần đây
đều đã cung cấp tinh thể tốc độ thấp. Cuối cùng, bảng có một số tiêu đề ghim mà chúng ta sẽ xem xét sau một thời g

Hình 20: Một bo mạch phát triển Nucleo

Lý do tại sao ST giới thiệu bộ công cụ mới này không rõ ràng, vì các bảng Discovery không chỉ là
công cụ phát triển hợp lệ. Tôi nghĩ rằng lý do chính là để thu hút mọi người từ thế giới Arduino.
²⁷Vào cuối năm 2017, ST đã giới thiệu thêm hai bo mạch Nucleo-64, có tên là Nucleo-L452RE-P và Nucleo-L433RC-P. Hai bo mạch bổ sung này
giới thiệu một biến thể so với mười sáu bo mạch Nucleo-64 hiện có: chúng bổ sung một SMPS tích hợp để thể hiện thêm khả năng sử dụng ít năng
lượng của hai MCU đó. Cuốn sách này đã được hoàn thiện trước khi thương mại hóa hai bảng đó và nó hoàn toàn không đề cập đến chúng.
²⁸Ethernet phyther (còn gọi là Ethernet PHY ) là một thiết bị dịch các thông báo được trao đổi qua mạng LAN thành tín hiệu điện.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 48

Trên thực tế, các bo mạch Nucleo cung cấp các đầu chân cắm để chấp nhận các tấm chắn Arduino, các bo mạch mở

rộng được xây dựng đặc biệt để mở rộng Arduino UNO và tất cả các bo mạch Arduino khác. Hình 22²⁹ hiển thị các

thiết bị ngoại vi STM32 và GPIO được liên kết với đầu nối tương thích với Arduino.

Hình 21: Các bộ phận liên quan của bảng Nucleo

Thành thật mà nói, bảng Nucleo có những ưu điểm thú vị khác so với bảng Discovery.

Trước hết, ST bán chúng với giá rất cao (có lẽ vì những lý do đã nói ở trên). Một Nucleo có giá từ 10 đô la

đến 15 đô la, tùy thuộc vào nơi bạn mua nó và nếu bạn nghĩ về những gì bạn có thể làm với kiến trúc này, bạn

phải đồng ý rằng nó thực sự bị định giá thấp so với một bo mạch Arduino DUE (cũng được trang bị một bộ xử lý

32-bit của Atmel). Một tính năng thú vị khác là các bo mạch Nucleo được thiết kế để tương thích giữa các chân

với nhau. Điều này có nghĩa là bạn có thể phát triển phần sụn cho bo mạch STM32Nucleo-F103RB (được trang bị

MCU STM32F103 phổ biến) và sau đó điều chỉnh nó thành Nucleo mạnh hơn (ví dụ: STM32Nucleo-F401RE) nếu bạn cần

thêm sức mạnh máy tính.

²⁹Hình 22 và 22 được lấy từ trang web mbed.org và chúng đề cập đến bảng Nucleo-F401RE. Vui lòng tham khảo Phụ lục C để biết
chốt bên phải bo mạch Nucleo của bạn.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 49

Hình 22: Các thiết bị ngoại vi và GPIO được liên kết với các tiêu đề Arduino

Ngoài các đầu cắm pin tương thích với Arduino, Nucleo còn cung cấp các đầu nối mở rộng của riêng nó.
Chúng là hai đầu cắm nam có kích thước 2x19, cách nhau 2,54mm. Chúng được gọi là đầu nối Morpho và
là một cách thuận tiện để truy cập hầu hết các chân MCU. Hình 23 cho thấy các thiết bị ngoại vi STM32
và GPIO được liên kết với đầu nối Morpho.

Hình 23: Thiết bị ngoại vi và GPIO liên kết với tiêu đề Morpho

Theo như tôi biết thì chưa có bảng mở rộng nào sử dụng đầu nối Morpho. Ngay cả ST cũng đang phát hành
một số lá chắn mở rộng cho Nucleo chỉ tương thích với Arduino UNO.
Ví dụ: Hình 24 hiển thị một bo mạch Nucleo với một bo mạch mở rộng X-NUCLEO-IDB04A1, một
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 50

lá chắn có Bộ xử lý mạng Bluetooth Low Energy 4.0 nguyên khối BlueNRG.

Hình 24: Tấm chắn mở rộng BlueNRG

Có mười sáu bảng Nucleo tại thời điểm viết chương này (tháng 9 năm 2015). Bảng 16 tóm tắt các
tính năng chính của chúng, cùng với những tính năng chung cho tất cả các bảng Nucleo.
Machine Translated by Google

Giới thiệu về danh mục đầu tư MCU STM32 51

Bảng 16: Danh sách các bảng Nucleo hiện có và tính năng của chúng

Tại sao lại sử dụng Nucleo làm bảng ví dụ cho cuốn sách này?
Các câu trả lời cho câu hỏi này hầu hết đều có trong các đoạn trước. Trước hết, bảng Nucleo có giá rẻ và

cho phép bạn bắt đầu tìm hiểu nền tảng STM32 mà gần như không mất phí. Thứ hai, chúng đơn giản hóa rất

nhiều các hướng dẫn và ví dụ trong cuốn sách này.

Bạn hoàn toàn tự do sử dụng Nucleo mà bạn thích. Cuốn sách sẽ chỉ ra tất cả các bước cần thiết để dễ dàng

điều chỉnh các ví dụ cho Nucleo cụ thể của bạn. Lý do thứ ba đến từ tuyên bố trước đó: tác giả đã mua tất

cả các bảng Nucleo-64 để chạy thử nghiệm và anh ấy đã không đầu tư nhiều tiền :-)

Hãy nhớ rằng toàn bộ cuốn sách được thiết kế để cung cấp cho người đọc tất cả các công cụ cần thiết để

bắt đầu làm việc với bất kỳ bảng nào, kể cả bảng tùy chỉnh. Sẽ thực sự dễ dàng để điều chỉnh các ví dụ

theo nhu cầu của bạn.


Machine Translated by Google

2. Thiết lập chuỗi công cụ


Trước khi chúng tôi có thể bắt đầu phát triển các ứng dụng cho nền tảng STM32, chúng tôi cần một chuỗi công cụ hoàn chỉnh.

Chuỗi công cụ là một tập hợp các chương trình, trình biên dịch và công cụ cho phép chúng tôi:

• để viết mã của chúng tôi và điều hướng bên trong các tệp nguồn của ứng dụng của chúng tôi; • để

điều hướng bên trong mã ứng dụng, cho phép chúng tôi kiểm tra các biến, định nghĩa hàm

s/khai báo, v.v.; • để biên

dịch mã nguồn bằng trình biên dịch đa nền tảng; • để tải lên và gỡ lỗi ứng

dụng của chúng tôi trên bảng phát triển mục tiêu (hoặc bảng tùy chỉnh mà chúng tôi

đã làm).

Để hoàn thành các hoạt động này, về cơ bản chúng ta cần:

• một IDE với trình chỉnh sửa nguồn và trình điều hướng tích hợp;

• trình biên dịch đa nền tảng có thể biên dịch mã nguồn cho nền tảng ARM Cortex-M; • trình gỡ lỗi cho phép

chúng tôi thực hiện từng bước gỡ lỗi phần sụn trên bảng mục tiêu; • một công cụ cho phép tương tác với trình gỡ lỗi

phần cứng tích hợp trong bo mạch Nucleo của chúng tôi (giao diện ST-LINK) hoặc bộ lập trình chuyên dụng (ví dụ: bộ

điều hợp JTAG).

Có một số chuỗi công cụ hoàn chỉnh cho dòng STM32 Cortex-M, cả miễn phí và thương mại.
IAR cho Cortex-M¹ và Keil² là hai trong số các chuỗi công cụ thương mại được sử dụng nhiều nhất cho bộ vi điều khiển Cortex-

M. Chúng là một giải pháp hoàn chỉnh để phát triển ứng dụng cho nền tảng STM32, nhưng là sản phẩm thương mại, chúng có giá

bán ngoài thị trường có thể quá cao đối với các công ty quy mô nhỏ hoặc sinh viên (chúng có thể có giá hơn 5.000 đô la tùy

theo các tính năng bạn cần). Tuy nhiên, cuốn sách này không đề cập đến các IDE thương mại và nếu bạn đã có giấy phép cho

một trong những môi trường này, bạn có thể bỏ qua chương này, nhưng bạn sẽ cần sắp xếp các hướng dẫn trong cuốn sách này

theo chuỗi công cụ của mình.

CooCox³ và System Workbench cho STM32⁴ (viết tắt là SW4STM32) là hai môi trường phát triển miễn phí cho nền tảng STM32.

Các IDE này về cơ bản dựa trên Eclipse và GCC. Họ làm rất tốt việc cố gắng cung cấp hỗ trợ cho dòng STM32 và họ làm việc

vượt trội trong hầu hết các trường hợp. Tuy nhiên, có một số điều cần xem xét khi đánh giá các công cụ này. Trước hết,

CooCox IDE hiện chỉ hỗ trợ Windows; thay vào đó, SWSTM32 cũng cung cấp hỗ trợ cho Linux và MacOS, nhưng nó thiếu một số

tính năng bổ sung có trong chuỗi công cụ được mô tả trong cuốn sách này.

Hơn nữa, chúng đã đi kèm với tất cả các công cụ cần thiết được cài đặt sẵn và định cấu hình. Trong khi điều này có thể được

¹http://bit.ly/
1Qxtkql ²http://www.keil.com/arm/
mdk.asp ³http://
www.coocox.org/ ⁴http://www.openstm32.org/
Machine Translated by Google

Thiết lập chuỗi công cụ 53

một lợi thế nếu bạn hoàn toàn mới đối với quy trình phát triển bộ xử lý Cortex-M, nó có thể là một hạn chế lớn nếu

bạn muốn thực hiện công việc nghiêm túc. Điều thực sự quan trọng là có toàn quyền kiểm soát các công cụ cần thiết

để phát triển chương trình cơ sở của bạn, đặc biệt là khi xử lý phần mềm Nguồn mở. Vì vậy, sự lựa chọn tốt nhất là

thiết lập một chuỗi công cụ hoàn chỉnh từ đầu. Điều này cho phép bạn làm quen với các chương trình và quy trình

cấu hình của chúng, mang lại toàn quyền kiểm soát môi trường phát triển của bạn. Điều này có thể gây khó chịu đặc

biệt là ở lần đầu tiên, nhưng đó là cách duy nhất để biết phần mềm nào tham gia vào một giai đoạn phát triển nhất

định.

Trong chương này, tôi sẽ trình bày các bước cần thiết để thiết lập chuỗi công cụ hoàn chỉnh cho nền tảng STM32

trên Windows, Mac OSX và Linux. Chuỗi công cụ này dựa trên hai công cụ chính là Eclipse và GCC, cộng với một loạt

các công cụ bên ngoài và các trình cắm thêm của Eclipse cho phép bạn xây dựng các chương trình STM32 một cách hiệu quả.

Mặc dù các hướng dẫn về cơ bản là giống nhau cho ba nền tảng, nhưng tôi sẽ điều chỉnh chúng cho từng HĐH, hiển thị

các lệnh và ảnh chụp màn hình chuyên dụng. Điều này sẽ đơn giản hóa quy trình cài đặt và sẽ cho phép bạn thiết lập

một chuỗi công cụ hoàn chỉnh trong thời gian ngắn hơn. Điều này cũng sẽ cho chúng tôi cơ hội nghiên cứu chi tiết

mọi thành phần trong chuỗi công cụ của chúng tôi. Trong chương tiếp theo, tôi sẽ chỉ cho bạn cách thiết lập một

ứng dụng tối thiểu (đèn LED nhấp nháy - ứng dụng Hello World trong điện tử), ứng dụng này sẽ cho phép chúng tôi
kiểm tra chuỗi công cụ của mình.

2.1 Tại sao chọn Eclipse/GCC làm Chuỗi công cụ cho STM32

Trước khi chúng tôi bắt đầu thiết lập chuỗi công cụ của mình, có một câu hỏi thực sự phổ biến cần trả lời: chuỗi

công cụ nào là tốt nhất để phát triển ứng dụng cho nền tảng STM32? Thật không may, câu hỏi không đơn giản để trả

lời. Có lẽ câu trả lời tốt nhất là nó phụ thuộc vào loại ứng dụng. Trước hết, khán giả nên được phân chia giữa các

chuyên gia và những người yêu thích. Các công ty thường thích sử dụng các IDE thương mại có phí hàng năm cho phép

nhận hỗ trợ kỹ thuật. Bạn phải nhận ra rằng trong thời gian kinh doanh đồng nghĩa với tiền bạc và đôi khi, IDE

thương mại có thể giảm thời gian học tập (đặc biệt nếu bạn cho rằng ST hỗ trợ rõ ràng cho các môi trường này). Tuy

nhiên, tôi nghĩ rằng ngay cả các công ty (đặc biệt là các tổ chức nhỏ) cũng có thể tận dụng lợi thế lớn khi sử

dụng chuỗi công cụ nguồn mở.

Tôi nghĩ rằng đây là những lý do quan trọng nhất để sử dụng chuỗi công cụ Eclipse/GCC để phát triển nhúng với các

MCU STM32:

• Nó dựa trên GCC: GCC có lẽ là trình biên dịch tốt nhất trên trái đất và nó cho kết quả xuất sắc ngay cả với

bộ xử lý dựa trên ARM. ARM ngày nay là kiến trúc phổ biến nhất (nhờ các hệ thống nhúng trở nên phổ biến

trong những năm gần đây) và nhiều nhà sản xuất phần cứng và phần mềm sử dụng GCC làm công cụ cơ sở cho nền

tảng của họ. • Đa nền tảng: nếu bạn có PC Windows, máy Mac mới nhất hoặc máy

chủ Linux, bạn sẽ có thể phát triển, biên dịch và tải chương trình cơ sở lên bảng phát triển của mình thành

công mà không có sự khác biệt. Ngày nay, đây là một yêu cầu bắt buộc. • Truyền bá Eclipse: rất nhiều IDE

thương mại cho STM32 (như TrueSTUDIO và các IDE khác) cũng dựa trên

Eclipse, đã trở thành một loại tiêu chuẩn. Có rất nhiều plug-in hữu ích cho Eclipse mà bạn có thể tải xuống

chỉ bằng một cú nhấp chuột. Và nó là một sản phẩm phát triển từng ngày.
Machine Translated by Google

54
Thiết lập chuỗi công cụ

• Nó là mã nguồn mở: ok. Tôi đồng ý. Đối với những phần mềm khổng lồ như vậy, thật khó để cố gắng hiểu phần bên trong

của chúng và sửa đổi mã, đặc biệt nếu bạn là một kỹ sư phần cứng cam kết quản lý bóng bán dẫn và ngắt. Nhưng nếu bạn

gặp rắc rối với công cụ của mình, thì việc cố gắng hiểu vấn đề xảy ra với một công cụ nguồn mở sẽ đơn giản hơn là một

công cụ đóng. • Cộng đồng lớn và đang phát triển: những công cụ này hiện có một cộng đồng quốc tế tuyệt vời, liên tục

phát triển các tính năng mới và sửa lỗi. Bạn sẽ tìm thấy rất nhiều ví dụ và blog có thể giúp ích cho bạn trong quá trình

làm việc. Hơn nữa, nhiều công ty đã sử dụng phần mềm này làm công cụ chính thức, đóng góp kinh tế cho sự phát triển

chính. Điều này đảm bảo rằng phần mềm sẽ không đột ngột biến mất.

• Miễn phí: Yep. Tôi đặt đây là điểm cuối cùng, nhưng nó không phải là điểm cuối cùng. Như đã nói trước đây, một IDE

thương mại có thể tiêu tốn rất nhiều tiền đối với một công ty nhỏ hoặc một người có sở thích/sinh viên. Và sự sẵn có

của các công cụ miễn phí là một trong những lợi thế chính của nền tảng STM32.

2.1.1 Đôi lời về Nhật thực…

Eclipse⁵ là một Mã nguồn mở và một IDE dựa trên Java miễn phí. Bất chấp thực tế này (thật không may, các chương trình Java

có xu hướng ngốn nhiều tài nguyên máy và làm chậm PC của bạn), Eclipse là một trong những môi trường phát triển phổ biến và

đầy đủ nhất. Eclipse có nhiều phiên bản được cấu hình sẵn, được tùy chỉnh cho các mục đích sử dụng cụ thể. Ví dụ: IDE Eclipse

dành cho Nhà phát triển Java được cấu hình sẵn để hoạt động với Java và với tất cả các công cụ được sử dụng trong nền tảng

phát triển này (Ant, Maven, v.v.). Trong trường hợp của chúng tôi, IDE Eclipse dành cho Nhà phát triển C/C++ phù hợp với nhu

cầu của chúng tôi.

Eclipse được thiết kế để có thể mở rộng nhờ các plug-in. Có một số plug-in có sẵn trong Eclipse Marketplace thực sự hữu ích

cho việc phát triển phần mềm cho các hệ thống nhúng. Chúng tôi sẽ cài đặt và sử dụng hầu hết chúng trong cuốn sách này. Hơn

nữa, Eclipse có khả năng tùy biến cao. Tôi thực sự khuyên bạn nên xem các cài đặt của nó, cho phép bạn điều chỉnh nó theo

nhu cầu và sở thích của mình.

2.1.2 … và GCC

Bộ sưu tập trình biên dịch GNU⁶ (GCC) là một bộ trình biên dịch hoàn chỉnh và phổ biến. Đây là công cụ phát triển duy nhất

có thể biên dịch một số ngôn ngữ lập trình (giao diện người dùng) thành hàng chục kiến trúc phần cứng có nhiều biến thể. GCC

là một phần mềm thực sự phức tạp. Nó cung cấp một số công cụ để hoàn thành nhiệm vụ biên dịch. Chúng bao gồm, ngoài bản thân

trình biên dịch, trình hợp dịch mã, trình liên kết, trình gỡ lỗi (được gọi là Trình gỡ lỗi GNU - GDB), một số công cụ để

kiểm tra, tháo gỡ và tối ưu hóa tệp nhị phân. Hơn nữa, GCC cũng được trang bị môi trường thời gian chạy cho ngôn ngữ C, được

tùy chỉnh cho kiến trúc mục tiêu.

Trong những năm gần đây, một số công ty, ngay cả trong thế giới nhúng, đã sử dụng GCC làm trình biên dịch chính thức của họ.

Ví dụ: ATMEL sử dụng GCC làm trình biên dịch chéo cho môi trường phát triển AVR Studio của mình.

⁵http://www.eclipse.org
⁶https://gcc.gnu.org/
Machine Translated by Google

Thiết lập chuỗi công cụ 55

Trình biên dịch chéo là gì?

Chúng tôi thường đề cập đến thuật ngữ trình biên dịch như một công cụ có thể tạo mã máy cho bộ
xử lý trong PC của chúng tôi. Trình biên dịch chỉ là một “trình dịch ngôn ngữ” từ một ngôn ngữ
lập trình nhất định (C trong trường hợp của chúng tôi) sang ngôn ngữ máy cấp thấp, còn được gọi
là hợp ngữ. Ví dụ: nếu chúng tôi đang làm việc trên máy Intel x86, chúng tôi sử dụng trình biên
dịch để tạo mã hợp ngữ x86 từ ngôn ngữ lập trình C. Để cho đầy đủ, chúng ta phải nói rằng ngày
nay trình biên dịch là một công cụ phức tạp hơn giải quyết cả bộ xử lý phần cứng mục tiêu cụ
thể và Hệ điều hành mà chúng ta đang sử dụng (ví dụ: Windows 7).

Trình biên dịch đa nền tảng là trình biên dịch có thể tạo mã máy cho máy phần cứng khác với máy
chúng tôi đang sử dụng để phát triển ứng dụng của mình. Trong trường hợp của chúng tôi, trình
biên dịch GCC ARM Embedded tạo mã máy cho bộ xử lý Cortex-M trong khi biên dịch trên máy x86 có
HĐH nhất định (ví dụ: Windows hoặc Mac OSX).

Trong thế giới ARM, GCC là trình biên dịch được sử dụng nhiều nhất, đặc biệt là do nó được sử dụng
làm công cụ phát triển chính cho Hệ điều hành dựa trên Linux cho bộ xử lý ARM Cortex-A (bộ vi điều
khiển ARM trang bị cho hầu hết mọi thiết bị di động). Các kỹ sư ARM tích cực hợp tác để phát triển
ARM GCC. ST Microelectronics không cung cấp môi trường phát triển của nó, nhưng hỗ trợ rõ ràng các
chuỗi công cụ dựa trên GCC. Vì lý do này, việc thiết lập một chuỗi công cụ hoàn chỉnh và đang hoạt
động để phát triển các ứng dụng nhúng với GCC là tương đối đơn giản.

Ba đoạn tiếp theo và các đoạn phụ của chúng hầu như giống hệt nhau. Chúng chỉ khác nhau ở những
phần dành riêng cho HĐH nhất định (Windows, Linux hoặc Mac OS). Vì vậy, hãy chuyển đến đoạn bạn
quan tâm và bỏ qua những đoạn còn lại.

2.2 Windows - Cài đặt chuỗi công cụ

Toàn bộ quy trình cài đặt giả định các yêu cầu sau:

• Máy tính chạy Windows có đủ tài nguyên phần cứng (tôi khuyên bạn nên có ít nhất 4Gb RAM và 5Gb
dung lượng trống trên Đĩa cứng); ảnh chụp màn hình trong phần này dựa trên Windows 7, nhưng
các hướng dẫn đã được thử nghiệm thành công trên Windows XP, 7, 8.1 và Windows 10 mới nhất.

• Java SE 8 Cập nhật 121 trở lên. Nếu bạn chưa có phiên bản này, bạn có thể tải xuống miễn phí
từ trang hỗ trợ Java SE chính thức⁷.

Xin lưu ý rằng nếu bạn có máy Windows 64 bit, bạn cần cài đặt Máy ảo Java (JVM) 64 bit. Ngay cả
khi hoàn toàn có thể sử dụng JVM 32-bit trên máy 64-bit, Eclipse yêu cầu bạn phải có Java 64-bit
nếu sử dụng máy 64-bit.

⁷http://bit.ly/2k5ppYR
Machine Translated by Google

Thiết lập chuỗi công cụ 56

Chọn thư mục chuỗi công cụ Một tính năng

thú vị của Eclipse là nó không bắt buộc phải được cài đặt trong một đường dẫn cụ thể trên
đĩa cứng. Điều này cho phép người dùng quyết định nơi đặt toàn bộ chuỗi công cụ và nếu muốn,
di chuyển nó đến nơi khác hoặc sao chép nó trên một máy khác bằng ổ USB (điều này thực sự
hữu ích nếu bạn có nhiều máy cần bảo trì).

Trong cuốn sách này, chúng tôi sẽ giả định rằng toàn bộ chuỗi công cụ được cài đặt bên trong thư

mục C:\STM32Toolchain trên Đĩa cứng. Bạn có thể tự do đặt nó ở nơi khác, nhưng hãy sắp xếp lại
các đường dẫn trong hướng dẫn cho phù hợp.

2.2.1 Windows - Cài đặt Eclipse

Bước đầu tiên là cài đặt Eclipse IDE. Như đã nói trước đây, chúng tôi quan tâm đến phiên bản Eclipse dành cho

các nhà phát triển C/C++. Phiên bản mới nhất tại thời điểm sửa đổi chương này (tháng 8 năm 2018) là Photon

(Eclipse v4.8). Tuy nhiên, chúng tôi thực sự khuyên bạn nên sử dụng bản phát hành trước, đó là Oxygen.3a

(Eclipse v4.7.3a), vì bản mới nhất vẫn chưa được hỗ trợ bởi bộ phần bổ trợ GNU MCU Eclipse và bởi một số công

cụ khác được sử dụng trong bản phát hành này sách. Nó có thể được tải xuống từ trang tải xuống chính thức⁸ như

trong Hình 1⁹.

Hình 1: Trang tải về Eclipse

Chọn bản phát hành (32bit hoặc 64bit) cho PC của bạn.

⁸https://www.eclipse.org/downloads/packages/release/oxygen/3a/ ⁹Một
số ảnh chụp màn hình có thể xuất hiện khác với những ảnh chụp được báo cáo trong cuốn sách này. Điều này xảy ra vì IDE Eclipse được cập nhật
thường xuyên. Đừng lo lắng về điều đó: hướng dẫn cài đặt sẽ hoạt động trong mọi trường hợp.
Machine Translated by Google

Thiết lập chuỗi công cụ 57

IDE Eclipse được phân phối dưới dạng kho lưu trữ ZIP. Trích xuất nội dung của kho lưu trữ bên trong thư mục C:

\STM32Toolchain. Khi kết thúc quá trình, bạn sẽ tìm thấy thư mục C:\STM32Toolchain\eclipse chứa toàn bộ IDE.

Bây giờ chúng ta có thể thực thi IDE Eclipse lần đầu tiên. Vào bên trong thư mục C:\STM32Toolchain\eclipse và

chạy tệp Eclipse.exe . Sau một thời gian, Eclipse sẽ hỏi bạn về thư mục ưu tiên nơi tất cả các dự án Eclipse

được lưu trữ (thư mục này được gọi là không gian làm việc), như thể hiện trong Hình 2.

Hình 2: Thiết lập không gian làm việc của Eclipse

Bạn có thể tự do chọn thư mục mình thích hoặc để lại thư mục được đề xuất. Trong cuốn sách này, chúng ta sẽ

giả định rằng không gian làm việc của Eclipse được đặt bên trong thư mục C:\STM32Toolchain\projects . Sắp xếp

các hướng dẫn cho phù hợp nếu bạn chọn một vị trí khác.

2.2.2 Windows - Cài đặt Trình cắm thêm Eclipse

Khi Eclipse được khởi động, chúng ta có thể tiến hành cài đặt một số trình cắm thêm có liên quan.

Trình cắm là gì?

Trình cắm thêm là một mô-đun phần mềm bên ngoài giúp mở rộng các chức năng của Eclipse. Một trình cắm thêm

phải tuân thủ một API tiêu chuẩn do các nhà phát triển Eclipse xác định. Bằng cách này, các nhà phát triển

bên thứ ba có thể thêm các tính năng vào IDE mà không cần thay đổi mã nguồn chính. Chúng tôi sẽ cài đặt một

số trình cắm thêm trong cuốn sách này để điều chỉnh Eclipse theo nhu cầu của chúng tôi.

Plug-in đầu tiên chúng ta cần cài đặt là SDK công cụ phát triển C/C++, còn được gọi là CDT Eclipse, hoặc đơn

giản là CDT. CDT cung cấp Môi trường phát triển tích hợp (IDE) C và C++ đầy đủ chức năng dựa trên nền tảng

Eclipse. Các tính năng bao gồm: hỗ trợ tạo dự án và bản dựng được quản lý cho các chuỗi công cụ khác nhau,

bản dựng tiêu chuẩn, điều hướng nguồn, nhiều công cụ kiến thức nguồn khác nhau, chẳng hạn như phân cấp kiểu,

biểu đồ cuộc gọi, bao gồm trình duyệt, trình duyệt định nghĩa macro, trình chỉnh sửa mã có đánh dấu cú pháp,

gấp và điều hướng siêu liên kết, tái cấu trúc mã nguồn và tạo mã, các công cụ sửa lỗi trực quan, bao gồm bộ

nhớ, thanh ghi và trình xem tháo gỡ.


Machine Translated by Google

Thiết lập chuỗi công cụ 58

Để cài đặt CDT, chúng ta phải làm theo quy trình này. Vào Help->Install new software… như thể hiện
trong Hình 3.

Hình 3: Menu cài đặt plug-in Eclipse

Trong cửa sổ cài đặt plug-in, chúng ta cần kích hoạt các kho plug-in khác bằng cách nhấp vào nút
Manage…. Trong cửa sổ Preferences, chọn mục “Install/Update->Available Software Sites” ở bên trái và
sau đó kiểm tra mục “CDT” như trong Hình 4. Nhấp vào nút OK.
Machine Translated by Google

Thiết lập chuỗi công cụ 59

Hình 4: Lựa chọn kho lưu trữ plug-in của Eclipse

Bây giờ, từ trình đơn thả xuống “làm việc với”, chọn kho lưu trữ “CDT”, như thể hiện trong Hình 5,
sau đó chọn “Tính năng chính của CDT->Công cụ phát triển C/C++” và “Tính năng tùy chọn của CDT-
>Phần cứng C/C++ GDB Debugging”, như thể hiện trong Hình 6. Nhấp vào nút “Next” và làm theo hướng
dẫn để cài đặt plug-in. Khi kết thúc quá trình cài đặt (quá trình cài đặt mất một lúc tùy thuộc
vào tốc độ kết nối Internet của bạn), hãy khởi động lại Eclipse khi được yêu cầu.
Machine Translated by Google

Thiết lập chuỗi công cụ 60

Hình 5: Lựa chọn kho CDT


Machine Translated by Google

Thiết lập chuỗi công cụ 61

Hình 6: Lựa chọn plug-in CDT

Bây giờ chúng ta phải cài đặt các trình cắm GNU MCU cho Eclipse¹⁰. Các plug-in này thêm một tập hợp các
tính năng phong phú vào Eclipse CDT để giao tiếp với chuỗi công cụ GCC ARM. Hơn nữa, chúng cung cấp các
chức năng cụ thể cho nền tảng STM32. Các phần bổ trợ được phát triển và duy trì bởi Liviu Ionescu,
người đã thực sự xuất sắc trong việc cung cấp hỗ trợ cho chuỗi công cụ GCC ARM. Nếu không có các plug-
in này thì gần như không thể phát triển và chạy mã với Eclipse cho nền tảng STM32.

Để cài đặt các trình cắm GCC ARM, hãy chuyển đến Trợ giúp-> Cài đặt phần mềm mới…. Trong cửa sổ Cài
đặt, nhấp vào nút Thêm… và điền vào các trường theo cách sau (xem Hình 7):

Tên: Trình cắm thêm GNU MCU Eclipse


Vị trí: http://gnu-mcu-eclipse.netlify.com/v4-neon-updates

Bấm vào nút OK. Bây giờ, từ trình đơn thả xuống “làm việc với”, hãy chọn kho lưu trữ “Trình cắm thêm
GNU MCU Eclipse”. Một danh sách các gói có thể cài đặt xuất hiện. Kiểm tra các gói để cài đặt theo Hình
8.

¹⁰https://gnu-mcu-eclipse.github.io/
Machine Translated by Google

Thiết lập chuỗi công cụ 62

Hình 7: Cài đặt plug-in GNU MCU

Hình 8: Lựa chọn plug-in GNU MCU

Bấm vào nút “Next >” và làm theo hướng dẫn để cài đặt plug-in. Khi kết thúc quá trình cài đặt, hãy
khởi động lại Eclipse khi được yêu cầu. anh ta kết thúc quá trình cài đặt, khởi động lại Eclipse
khi được yêu cầu.

Đọc cẩn thận

Nếu bạn gặp sự cố trong quá trình cài đặt trình cắm (lỗi bắt tay, lỗi cung cấp
hoặc lỗi tương tự), vui lòng tham khảo phần khắc phục sự cố.
Machine Translated by Google

Thiết lập chuỗi công cụ 63

Giờ đây, Eclipse về cơ bản đã được cấu hình để bắt đầu phát triển các ứng dụng STM32. Bây giờ chúng ta
cần bộ biên dịch chéo để tạo phần sụn cho họ STM32.

2.2.3 Windows - Cài đặt nhúng GCC ARM

Bước tiếp theo trong cấu hình chuỗi công cụ là cài đặt bộ GCC cho bộ vi điều khiển ARM Cortex-M và Cortex-
R. Đây là một bộ công cụ (bộ tiền xử lý macro, trình biên dịch, trình biên dịch mã, trình liên kết và
trình gỡ lỗi) được thiết kế để biên dịch chéo mã mà chúng ta sẽ tạo cho nền tảng STM32.

Bạn có thể tải xuống bản phát hành ARM GCC mới nhất từ Nhà phát triển ARM¹¹. Tại thời điểm viết chương
này, phiên bản mới nhất hiện có là 6.0. Có thể tải xuống Trình cài đặt Windows từ phần tải xuống¹².

Sau khi tải xuống hoàn tất, hãy chạy trình cài đặt. Khi trình cài đặt yêu cầu thư mục đích, hãy chọn C:
\STM32Toolchain\gcc-arm rồi nhấp vào nút “Cài đặt”, như thể hiện trong Hình 9.

Hình 9: Lựa chọn thư mục đích GCC

Theo mặc định, trình cài đặt đề xuất một thư mục đích có liên quan đến phiên bản GCC mà chúng
tôi sẽ cài đặt (6.0 2017q2). Điều này không thuận tiện, vì khi GCC được cập nhật lên phiên bản
mới hơn, chúng tôi cần thay đổi cài đặt cho từng dự án Eclipse mà chúng tôi đã thực hiện.

Sau khi cài đặt hoàn tất, trình cài đặt sẽ hiển thị cho chúng tôi một biểu mẫu với bốn hộp kiểm khác nhau.
Nếu chỉ có một GCC được cài đặt trên hệ thống của bạn hoặc bạn không biết, hãy đánh dấu vào mục Thêm
đường dẫn đến biến môi trường và Thêm thông tin đăng ký (hai hộp kiểm), như trong Hình 10.

¹¹https://developer.arm.com/open-source/gnu-toolchain/gnu-rm
¹²https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
Machine Translated by Google

Thiết lập chuỗi công cụ 64

Hình 10: Các tùy chọn cài đặt GCC cuối cùng

Nếu bạn đã cài đặt nhiều bản sao GCC trong hệ thống của mình, thì tôi khuyên bạn nên
bỏ chọn hai tùy chọn đó và xử lý biến môi trường PATH bằng Eclipse. Tham khảo Phụ
lục khắc phục sự cố (đoạn có tên “Eclipse không thể định vị trình biên dịch”) trong
đó giải thích cách định cấu hình đường dẫn GCC trong Eclipse.

2.2.4 Windows – Cài đặt công cụ xây dựng

Trong lịch sử, Windows thiếu một số công cụ cần có trong thế giới UNIX. Một trong số đó là make, công cụ kiểm soát quá

trình biên dịch các chương trình viết bằng C/C++. Nếu bạn đã cài đặt một sản phẩm như MinGW hoặc tương tự (và nó được

định cấu hình chính xác trong môi trường PATH của bạn), thì bạn có thể bỏ qua quy trình này. Nếu không, bạn có thể cài

đặt gói Công cụ xây dựng được tạo bởi cùng một tác giả của các phần bổ trợ GCC ARM cho Eclipse. Bạn có thể tải xuống

chương trình thiết lập từ đây¹³. Chọn phiên bản phù hợp với bản phát hành hệ điều hành của bạn (32 hoặc 64 bit). Tại

thời điểm viết chương này, phiên bản cuối cùng có sẵn
là 2,8.

Khi được hỏi, hãy cài đặt các công cụ trong thư mục này: C:\STM32Toolchain\Build Tools. Khởi động lại Eclipse nếu nó

đang chạy.

2.2.5 Windows – Cài đặt OpenOCD

OpenOCD¹⁴ là công cụ cho phép tải chương trình cơ sở lên bảng Nucleo và thực hiện gỡ lỗi từng bước. Ban đầu được bắt

đầu bởi Dominic Rath, OpenOCD hiện được duy trì tích cực bởi cộng đồng và một số công ty, bao gồm cả STM. Chúng ta sẽ

thảo luận sâu về nó trong Chương 5, chương này dành riêng cho việc gỡ lỗi. Nhưng chúng ta sẽ cài đặt nó trong chương

này, vì quy trình thay đổi giữa ba nền tảng khác nhau (Windows, Linux và Mac OS). Bản phát hành chính thức mới nhất tại

thời điểm viết cuốn sách này là 0.10.

Biên dịch một công cụ như OpenOCD, được thiết kế rõ ràng để biên dịch trên các hệ thống giống như UNIX, không phải là

một nhiệm vụ tầm thường. Nó yêu cầu một chuỗi công cụ UNIX C hoàn chỉnh như MinGW hoặc Cygwin. May mắn thay, Liviu

¹³http://bit.ly/2g2bu5R
¹⁴http://openocd.org/
Machine Translated by Google

Thiết lập chuỗi công cụ 65

Ionescu đã làm công việc bẩn thỉu đó cho chúng ta. Bạn có thể tải xuống phiên bản phát triển mới nhất của
OpenOCD (0.10.0-5-20171110-* tại thời điểm viết chương này) từ kho lưu trữ chính thức của GNU MCU Eclipse¹⁵.
Chọn gói .exe cho nền tảng Windows của bạn (32 hoặc 64 bit). Khi được hỏi, hãy cài đặt các tệp bên trong
thư mục C:\STM32Toolchain\openocd (chú ý ghi nguyên trạng openocd ).

Một lần nữa, điều này đảm bảo với chúng ta rằng chúng ta không nên thay đổi cài đặt Eclipse
khi một bản phát hành OpenOCD mới được phát hành, nhưng chúng ta chỉ cần thay thế nội dung bên
trong thư mục C:\STM32Toolchain\openocd bằng bản phát hành phần mềm mới.

2.2.6 Windows – Cài đặt công cụ và trình điều khiển ST

ST cung cấp một số công cụ hữu ích để phát triển các ứng dụng dựa trên STM32. Chúng ta sẽ cài đặt chúng trong chương

này, và chúng ta sẽ thảo luận về việc sử dụng chúng ở phần sau của cuốn sách này.

STM32CubeMX là một công cụ đồ họa được sử dụng để tạo các tệp thiết lập bằng ngôn ngữ lập trình C cho STM32
MCU, theo cấu hình phần cứng của bo mạch của chúng tôi. Ví dụ: nếu chúng tôi có Nucleo-F401RE, dựa trên
MCU STM32F401RE và chúng tôi muốn sử dụng đèn LED người dùng của nó (được đánh dấu là LD2 trên bảng), thì

STM32CubeMX sẽ tự động tạo tất cả các tệp nguồn chứa mã C cần thiết để định cấu hình MCU (đồng hồ, cổng
ngoại vi, v.v.) và GPIO được kết nối với đèn LED (cổng GPIO 5 trên cổng A trên hầu hết tất cả các bo mạch
Nucleo). Bạn có thể tải xuống STM32CubeMX từ trang web chính thức của ST¹⁶¹⁷ (liên kết tải xuống ở cuối
trang) và làm theo hướng dẫn cài đặt.

Một công cụ quan trọng khác là STM32CubeProgrammer¹⁸. Đây là một phần mềm tải lên chương trình cơ sở trên
MCU bằng giao diện ST-LINK của Nucleo của chúng tôi hoặc một lập trình viên ST-LINK chuyên dụng.
Chúng ta sẽ sử dụng nó trong chương tiếp theo. Gói cài đặt STM32CubeProgrammer cũng cung cấp các trình
điều khiển cần thiết để giao tiếp các bảng phát triển ST với Windows. Bạn có thể tải xuống
STM32CubeProgrammer từ trang ST chính thức¹⁹ (liên kết tải xuống ở cuối trang trong phần NHẬN PHẦN MỀM) và
làm theo hướng dẫn cài đặt.

2.2.6.1 Windows – Nâng cấp chương trình cơ sở ST-LINK

Cảnh báo

Đọc kỹ đoạn này. Đừng bỏ qua bước này!

Tôi đã mua một số bo mạch Nucleo và tôi thấy rằng tất cả các bo mạch đều đi kèm với chương trình cơ sở ST-
LINK cũ. Để sử dụng Nucleo với OpenOCD, chương trình cơ sở ít nhất phải được cập nhật lên phiên bản 2.29.18.

¹⁵http://bit.ly/2khxhXL
¹⁶http://bit.ly/1RLCa4G
¹⁷Để tải xuống phần mềm, bạn cần đăng ký trên trang web ST cung cấp email hợp lệ.
¹⁸http://bit.ly/2CK4aFa
¹⁹http://bit.ly/2CK4aFa
Machine Translated by Google

Thiết lập chuỗi công cụ 66

Sau khi trình điều khiển ST-LINK được cài đặt, chúng tôi có thể tải xuống bản cập nhật chương trình cơ sở ST-

LINK mới nhất từ trang web ST²⁰. Phần sụn được phân phối dưới dạng tệp ZIP. Trích xuất nó ở một nơi thuận

tiện. Kết nối bo mạch Nucleo của bạn bằng cáp USB và vào bên trong thư mục con Windows và thực thi tệp ST-
LINKUpgrade. Nhấp vào nút Kết nối thiết bị.

Hình 12: Chương trình Nâng cấp ST-LINK

Sau một thời gian, Nâng cấp ST-LINK sẽ hiển thị nếu chương trình cơ sở Nucleo của bạn cần được cập nhật (chỉ

ra một phiên bản khác, như thể hiện trong Hình 12). Nếu vậy, hãy nhấp vào nút Yes >>>> và làm theo hướng dẫn.

chúc mừng. Chuỗi công cụ hiện đã hoàn tất và bạn có thể chuyển sang chương tiếp theo.

2.3 Linux - Cài đặt chuỗi công cụ

Toàn bộ quy trình cài đặt sẽ đảm nhận các yêu cầu sau:

• Một PC chạy Ubuntu Linux 14.04 LTS Desktop (hay còn gọi là Trusty Tahr) có đủ tài nguyên phần cứng (tôi

khuyên bạn nên có ít nhất 4Gb RAM và 5Gb dung lượng trống trên Đĩa cứng); các hướng dẫn nên được sắp

xếp dễ dàng cho các bản phân phối Linux khác.


• Java 8 Cập nhật 121 trở lên. Đọc đoạn tiếp theo dành riêng cho cài đặt Java nếu chưa

cài đặt chưa.

Chọn thư mục chuỗi công cụ

Một tính năng thú vị của Eclipse là nó không bắt buộc phải được cài đặt trong một đường dẫn cụ
thể trên Đĩa cứng. Điều này cho phép người dùng quyết định nơi đặt toàn bộ chuỗi công cụ và nếu
muốn, di chuyển nó đến nơi khác hoặc sao chép nó trên một máy khác (điều này thực sự hữu ích nếu
bạn có nhiều máy Linux cần bảo trì).

Trong cuốn sách này, chúng tôi sẽ giả định rằng toàn bộ chuỗi công cụ được cài đặt bên trong thư

mục /STM32Toolchain trên Đĩa cứng (nghĩa là thư mục STM32Toolchain bên trong thư mục Trang chủ
của bạn). Bạn có thể tự do đặt nó ở nơi khác, nhưng hãy sắp xếp lại các đường dẫn trong hướng
dẫn cho phù hợp.

²⁰http://bit.ly/1RLDp3H
Machine Translated by Google

Thiết lập chuỗi công cụ 67

2.3.1 Linux - Cài đặt Thư viện thời gian chạy i386 trên Ubuntu 64 bit

Nếu Ubuntu của bạn là bản phát hành 64 bit, thì bạn cần cài đặt một số thư viện tương thích cho phép chạy các ứng

dụng 32 bit. Để làm như vậy, chỉ cần chạy các lệnh sau trong bảng điều khiển Linux:

$ sudo dpkg –-add-architecture i386 $ sudo


apt-get update $ sudo apt-
get install libc6:i386 libncurses5:i386 libstdc++6:i386

Nếu nghi ngờ về bản phát hành Ubuntu của mình, thì bạn có thể chạy lệnh sau trên bảng điều khiển Linux:

$ uname -i

Nếu kết quả là x86_64 thì bạn có máy 64 bit, nếu không thì máy 32 bit.

2.3.2 Linux - Cài đặt Java

Cài đặt Java 8 trong Ubuntu Linux yêu cầu phân tích chuyên sâu. Bạn nên cài đặt bản phân phối Java chính thức của

Oracle, như được hiển thị ở đây.

Trước tiên, chúng ta cần thêm kho lưu trữ webupd8team Java PPA trong hệ thống của mình và cài đặt Oracle Java 8 bằng

cách sử dụng bộ lệnh sau trong bảng điều khiển Linux:

$ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-


get update $ sudo apt-get
cài đặt oracle-java8-installer

Sau khi cài đặt thành công JDK, hãy kiểm tra xem tất cả có hoạt động tốt không khi chạy lệnh java -version tại dòng
lệnh:

phiên bản java $


phiên bản java "1.8.0_60"
Môi trường thời gian chạy Java(TM) SE (bản dựng 1.8.0_60-b27)
Máy ảo máy chủ 64 bit Java HotSpot(TM) (bản dựng 25.60-b23, chế độ hỗn hợp)

2.3.3 Linux - Cài đặt Eclipse

Bước đầu tiên là cài đặt Eclipse IDE. Như đã nói trước đây, chúng tôi quan tâm đến phiên bản Eclipse dành cho các

nhà phát triển C/C++. Phiên bản mới nhất tại thời điểm sửa đổi chương này (tháng 8 năm 2018) là Photon (Eclipse

v4.8). Tuy nhiên, bạn nên sử dụng bản phát hành trước đó, đó là Oxygen.3a (Eclipse v4.7.3a), vì bản mới nhất vẫn

chưa được hỗ trợ bởi bộ trình cắm GNU MCU Eclipse


Machine Translated by Google

Thiết lập chuỗi công cụ 68

và bằng một số công cụ khác được sử dụng trong cuốn sách này. Nó có thể được tải xuống từ trang tải xuống
chính thức²¹ như trong Hình 13²².

Hình 13: Trang tải về Eclipse

IDE Eclipse được phân phối dưới dạng kho lưu trữ .tar.gz . Trích xuất nội dung của kho lưu trữ nguyên
trạng bên trong thư mục /STM32Toolchain. Khi kết thúc quá trình, bạn sẽ tìm thấy thư mục /STM32Toolchain/
eclipse chứa toàn bộ IDE.

Bây giờ chúng ta có thể thực thi IDE Eclipse lần đầu tiên. Vào bên trong thư mục /STM32Toolchain/eclipse
và chạy tệp nhật thực . Sau một thời gian, Eclipse sẽ hỏi bạn về thư mục ưu tiên nơi lưu trữ tất cả các
dự án Eclipse (được gọi là không gian làm việc), như thể hiện trong Hình 14.

²¹https://www.eclipse.org/downloads/packages/release/oxygen/3a/ ²²Một
số ảnh chụp màn hình có thể xuất hiện khác với những ảnh chụp được báo cáo trong cuốn sách này. Điều này xảy ra vì IDE Eclipse được cập nhật
thường xuyên. Đừng lo lắng về điều đó: hướng dẫn cài đặt sẽ hoạt động trong mọi trường hợp.
Machine Translated by Google

Thiết lập chuỗi công cụ 69

Hình 14: Thiết lập không gian làm việc của Eclipse

Bạn có thể tự do chọn thư mục mình thích hoặc để lại thư mục được đề xuất. Trong cuốn sách này, chúng
ta sẽ giả định rằng không gian làm việc của Eclipse nằm bên trong thư mục /STM32Toolchain/projects .
Sắp xếp các hướng dẫn cho phù hợp nếu bạn chọn một vị trí khác.

2.3.4 Linux - Cài đặt trình cắm thêm Eclipse

Khi Eclipse được khởi động, chúng ta có thể tiến hành cài đặt một số trình cắm thêm có liên quan.

Trình cắm là gì?

Trình cắm thêm là một mô-đun phần mềm bên ngoài giúp mở rộng các chức năng của Eclipse. Một trình cắm thêm

phải tuân thủ một API tiêu chuẩn do các nhà phát triển Eclipse xác định. Bằng cách này, các nhà phát triển

bên thứ ba có thể thêm các tính năng vào IDE mà không cần thay đổi mã nguồn chính. Chúng tôi sẽ cài đặt một

số trình cắm thêm trong cuốn sách này để điều chỉnh Eclipse theo nhu cầu của chúng tôi.

Plug-in đầu tiên chúng ta cần cài đặt là SDK công cụ phát triển C/C++, còn được gọi là CDT Eclipse.
CDT cung cấp Môi trường phát triển tích hợp C và C++ đầy đủ chức năng dựa trên nền tảng Eclipse. Các
tính năng bao gồm: hỗ trợ tạo dự án và bản dựng được quản lý cho các chuỗi công cụ khác nhau, bản dựng
tạo tiêu chuẩn, điều hướng nguồn, nhiều công cụ kiến thức nguồn khác nhau, chẳng hạn như phân cấp kiểu,
biểu đồ cuộc gọi, bao gồm trình duyệt, trình duyệt định nghĩa macro, trình chỉnh sửa mã có tô sáng cú
pháp, gấp và điều hướng siêu liên kết, tái cấu trúc mã nguồn và tạo mã, các công cụ sửa lỗi trực quan,
bao gồm bộ nhớ, thanh ghi và trình xem tháo gỡ.

Để cài đặt CDT, chúng ta phải làm theo quy trình này. Vào Help->Install new software… như thể hiện trong
Hình 15.
Machine Translated by Google

Thiết lập chuỗi công cụ 70

Hình 15: Menu cài đặt plug-in Eclipse

Trong cửa sổ cài đặt plug-in, chúng ta cần bật các kho plug-in khác bằng cách nhấp vào nút
Quản lý… . Trong cửa sổ Preferences, chọn mục “Install/Update->Available Software Sites” ở
bên trái và sau đó kiểm tra mục “CDT” như trong Hình 16. Nhấp vào nút OK.
Machine Translated by Google

Thiết lập chuỗi công cụ 71

Hình 16: Lựa chọn kho trình cắm thêm của Eclipse

Bây giờ, từ trình đơn thả xuống “work with”, chọn kho “CDT”, như thể hiện trong Hình 17, sau
đó chọn “CDT Main Features->C/C++ Development Tools” và “CDT Optional Features->C/C++ GDB
Hardware Debugging”, như thể hiện trong Hình 18. Nhấp vào nút “Next” và làm theo hướng dẫn để
cài đặt plug-in. Khi kết thúc quá trình cài đặt (quá trình cài đặt mất một lúc tùy thuộc vào
tốc độ kết nối Internet của bạn), hãy khởi động lại Eclipse khi được yêu cầu.
Machine Translated by Google

Thiết lập chuỗi công cụ 72

Hình 17: Lựa chọn kho CDT


Machine Translated by Google

Thiết lập chuỗi công cụ 73

Hình 18: Lựa chọn plug-in CDT

Bây giờ chúng ta phải cài đặt các trình cắm thêm GNU MCU cho Eclipse²³. Các plug-in này thêm một tập hợp
các tính năng phong phú vào Eclipse CDT để giao tiếp với chuỗi công cụ GCC ARM. Hơn nữa, chúng cung cấp
các chức năng cụ thể cho nền tảng STM32. Các phần bổ trợ được phát triển và duy trì bởi Liviu Ionescu,
người đã thực sự xuất sắc trong việc cung cấp hỗ trợ cho chuỗi công cụ GCC ARM. Nếu không có các plug-in
này thì gần như không thể phát triển và chạy mã với Eclipse cho nền tảng STM32. +

Để cài đặt các trình cắm GCC ARM, hãy chuyển đến Trợ giúp-> Cài đặt phần mềm mới…. Trong cửa sổ Cài đặt,
nhấp vào nút Thêm… và điền vào các trường theo cách sau (xem Hình 19):

Tên: Trình cắm thêm GNU MCU Eclipse


Vị trí: http://gnu-mcu-eclipse.netlify.com/v4-neon-updates Bấm vào

nút OK. Bây giờ, từ trình đơn thả xuống “làm việc với”, hãy chọn kho lưu trữ “Trình cắm thêm GNU MCU
Eclipse”. Một danh sách các gói có thể cài đặt xuất hiện. Kiểm tra các gói để cài đặt theo Hình 20.

²³https://gnu-mcu-eclipse.github.io/
Machine Translated by Google

Thiết lập chuỗi công cụ 74

Hình 19: Cài đặt plug-in GNU MCU

Hình 20: Lựa chọn plug-in GNU MCU

Bấm vào nút “Next >” và làm theo hướng dẫn để cài đặt plug-in. Khi kết thúc quá trình cài đặt, hãy khởi
động lại Eclipse khi được yêu cầu.

Đọc cẩn thận

Nếu bạn gặp sự cố trong quá trình cài đặt trình cắm (lỗi bắt tay, lỗi cung cấp
hoặc lỗi tương tự), vui lòng tham khảo phần khắc phục sự cố.

Giờ đây, Eclipse về cơ bản đã được cấu hình để bắt đầu phát triển các ứng dụng STM32. Bây giờ chúng ta cần
Machine Translated by Google

Thiết lập chuỗi công cụ 75

bộ biên dịch chéo để tạo phần sụn cho dòng STM32.

2.3.5 Linux - Cài đặt nhúng GCC ARM

Bước tiếp theo trong cấu hình chuỗi công cụ là cài đặt bộ GCC cho bộ vi điều khiển ARM Cortex-M và Cortex-
R. Đây là một bộ công cụ (bộ tiền xử lý macro, trình biên dịch, trình biên dịch mã, trình liên kết và trình
gỡ lỗi) được thiết kế để biên dịch chéo mã mà chúng ta sẽ tạo cho nền tảng STM32.

Bạn có thể tải xuống bản phát hành ARM GCC mới nhất từ ARM Developer²⁴. Tại thời điểm viết chương này,
phiên bản mới nhất hiện có là 6.0. Có thể tải xuống tarball Linux từ phần tải xuống²⁵.

Sau khi tải xuống hoàn tất, hãy giải nén gói .tar.bz2 bên trong /STM32Toolchain

Theo mặc định, thư mục được giải nén có tên gcc-arm-none-eabi-6-2017-q2-update. Điều này không

thuận tiện, vì khi GCC được cập nhật lên phiên bản mới hơn, chúng tôi cần thay đổi cài đặt cho
từng dự án Eclipse mà chúng tôi đã thực hiện. Vì vậy, hãy đổi tên nó thành gcc-arm.

2.3.6 Linux - Cài đặt trình điều khiển Nucleo

Cảnh báo

Đọc kỹ đoạn này. Đừng bỏ qua bước này!

Trên Linux, chúng ta không cần cài đặt trình điều khiển Nucleo từ ST, nhưng chúng ta cần cài đặt libusb-1.0

bằng lệnh sau:

$ sudo apt-get cài đặt libusb-1.0

2.3.6.1 Linux – Nâng cấp chương trình cơ sở ST-LINK

Cảnh báo

Đọc kỹ đoạn này. Đừng bỏ qua bước này!

Tôi đã mua một số bo mạch Nucleo và tôi thấy rằng tất cả các bo mạch đều đi kèm với chương trình cơ sở ST-
LINK cũ. Để sử dụng Nucleo với OpenOCD, chương trình cơ sở ít nhất phải được cập nhật lên phiên bản 2.29.18.

²⁴https://developer.arm.com/open-source/gnu-toolchain/gnu-rm
²⁵https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
Machine Translated by Google

Thiết lập chuỗi công cụ 76

Chúng tôi có thể tải xuống trình điều khiển ST-LINK mới nhất từ trang web ST²⁶. Phần sụn được phân phối dưới

dạng tệp ZIP. Trích xuất nó ở một nơi thuận tiện. Kết nối bo mạch Nucleo của bạn bằng cáp USB và vào bên trong

thư mục con AllPlatforms và thực thi tệp STLinkUpgrade.jar. Nhấp vào nút Mở ở chế độ cập nhật (xem Hình 21).

Hình 21: Chương trình Nâng cấp ST-LINK

Sau một thời gian, Nâng cấp ST-LINK sẽ hiển thị nếu chương trình cơ sở Nucleo của bạn cần được cập nhật (nó hiển

thị các phiên bản khác nhau). Nếu vậy, hãy nhấp vào nút Nâng cấp và làm theo hướng dẫn.

2.3.7 Linux – Cài đặt OpenOCD

OpenOCD²⁷ là một công cụ cho phép tải chương trình cơ sở lên bảng Nucleo và thực hiện gỡ lỗi từng bước. OpenOCD

là một công cụ ban đầu được bắt đầu bởi Dominic Rath và hiện được duy trì tích cực bởi cộng đồng và một số công

ty, bao gồm cả ST. Chúng ta sẽ thảo luận sâu về vấn đề này trong chương 5, chương dành riêng cho việc gỡ lỗi.

Nhưng chúng ta sẽ cài đặt nó trong chương này, vì quy trình cài đặt thay đổi giữa ba nền tảng khác nhau (Windows,

Linux và Mac OS). Bản phát hành chính thức mới nhất tại thời điểm viết cuốn sách này là 0.10.

Giải pháp nhanh nhất để cài đặt OpenOCD là sử dụng gói được biên dịch sẵn do Liviu Ionescu cung cấp. Trên thực

tế, anh ấy đã làm công việc bẩn thỉu cho chúng tôi. Bạn có thể tải xuống phiên bản phát triển mới nhất của

OpenOCD (0.10.0-5-20171110-* tại thời điểm viết chương này) từ kho lưu trữ chính thức của GNU MCU Eclipse²⁸.

Chọn gói .tgz cho nền tảng Linux của bạn (32 hoặc 64 bit - chúng được đặt tên là debian32 hoặc debian64). Giải

nén các tập tin ở một nơi thuận tiện. Khi hoàn tất, bạn sẽ tìm thấy một thư mục có tên openocd, trong đó chứa

một thư mục có tên giống như tên của gói .tgz (ví dụ: bạn sẽ tìm thấy một thư mục có tên 0.10.0-5-20171110-1117).

Sao chép thư mục đó vào bên trong thư mục /STM32Toolchain và đổi tên nó thành openocd, sao cho đường dẫn cuối
cùng bằng /STM32Toolchain/openocd.

Một lần nữa, điều này đảm bảo rằng chúng ta không nên thay đổi cài đặt Eclipse khi bản
phát hành OpenOCD mới được phát hành, nhưng chúng ta chỉ cần thay thế nội dung của thư
mục /STM32Toolchain/openocd bằng bản phát hành phần mềm mới.

²⁶http://bit.ly/1RLDp3H
²⁷http://openocd.org/
²⁸http://bit.ly/2khxhXL
Machine Translated by Google

Thiết lập chuỗi công cụ 77

Bây giờ chúng ta cần thêm một bước nữa. Theo mặc định, Linux không cho phép người dùng không có đặc quyền
truy cập thiết bị USB bằng libusb. Vì vậy, để bắt đầu kết nối giữa OpenOCD và giao diện ST-LINK, chúng ta
cần chạy OpenOCD với quyền root. Điều này không thuận tiện, vì chúng ta sẽ gặp rắc rối với cấu hình
Eclipse. Vì vậy, chúng tôi phải định cấu hình trình quản lý thiết bị chung (còn gọi là udev) để cấp quyền
truy cập cho người dùng không có đặc quyền vào giao diện ST-LINK. Để làm như vậy, chúng ta hãy tạo một
tệp có tên stlink.rules bên trong thư mục /etc/udev/rules.d và thêm dòng này vào bên trong nó:

$ sudo cp ~/STM32Toolchain/openocd/contrib/99-openocd.rules /etc/udev/rules.d/ $ sudo điều khiển


udevadm --reload-rules

Bây giờ chúng ta đã sẵn sàng thử nghiệm bảng Nucleo của mình. Cắm nó vào PC của bạn bằng cáp USB. Sau vài
giây, gõ các lệnh sau:

$ cd ~/STM32Toolchain/openocd/scripts $ ../bin/

openocd -f board/<nucleo_conf_file>.cfg

trong đó <nucleo_conf_file>.cfg phải được thay thế bằng tệp cấu hình phù hợp với bảng Nucleo của bạn,
theo Bảng 1. Ví dụ: nếu Nucleo của bạn là Nucleo-F401RE, thì tệp cấu hình phù hợp để chuyển sang OpenOCD
là st_nucleo_f4.cfg .

Bảng 1: Tệp bảng OpenOCD tương ứng cho một Nucleo nhất định

hạt nhân P/N Tệp tập lệnh bảng OpenOCD 0.10.0

NUCLEO-F446RE st_nucleo_f4.cfg
NUCLEO-F411RE st_nucleo_f4.cfg
NUCLEO-F410RB st_nucleo_f4.cfg
NUCLEO-F401RE st_nucleo_f4.cfg
NUCLEO-F334R8 stm32f334Discovery.cfg
NUCLEO-F303RE st_nucleo_f3.cfg
NUCLEO-F302R8 st_nucleo_f3.cfg
NUCLEO-F103RB st_nucleo_f103rb.cfg
NUCLEO-F091RC st_nucleo_f0.cfg
NUCLEO-F072RB st_nucleo _f0.cfg
NUCLEO-F070RB st_nucleo_f0.cfg
NUCLEO-F030R8 st_nucleo_f0.cfg
NUCLEO-L476RG st_nucleo_l476rg.cfg
NUCLEO-L152RE st_nucleo_l1.cfg
NUCLEO-L073RZ st_nucleo_l073rz .cfg
NUCLEO-L053R8 stm32l0Discovery.cfg

Nếu mọi thứ diễn ra đúng cách, bạn sẽ thấy những thông báo này trên bảng điều khiển:
Machine Translated by Google

Thiết lập chuỗi công cụ 78

Mở Trình gỡ lỗi trên chip 0.10.0 (2015-09-09-16:32)


Được cấp phép theo GNU GPL v2

Để biết các báo cáo lỗi, hãy

đọc http://openocd.org/doc/doxygen/bugs.html Thông tin:

Quá trình vận chuyển được chọn đã chiếm quyền kiểm soát mục tiêu cấp thấp. Kết quả có thể khác so với tốc độ bộ điều hợp JTAG/SWD đơn

giản: 2000 kHz adapter_nsrst_delay:

100 không tách rời

srst_chỉ riêng srst_nogate srst_open_drain connect_deassert_srst

Thông tin : Không thể khớp tốc độ yêu cầu 2000 kHz, sử dụng 1800 kHz

Thông tin : tốc độ xung nhịp 1800 kHz


Thông tin : STLINK v2 JTAG v24 API v2 SWIM v11 VID 0x0483 PID 0x374B

Thông tin: sử dụng stlink api v2

Thông tin : Điện áp mục tiêu: 3.245850

Thông tin : stm32f4x.cpu: phần cứng có 6 điểm dừng, 4 điểm theo dõi

Đồng thời, đèn LED LD1 trên bo mạch Nucleo sẽ bắt đầu nhấp nháy luân phiên màu XANH LÁ CÂY và
ĐỎ.

Trên một số bản phân phối GNU/Linux, các định nghĩa UDEV không đủ hoặc không hiệu quả và khi cố gắng truy cập

đầu dò JTAG, sẽ xảy ra lỗi:

libusb_open không thành công: LIBUSB_ERROR_ACCESS

Nếu điều này xảy ra, trước tiên hãy thử bắt đầu openocd với sudo; nếu điều này hoạt động, đối với công việc

thông thường, bạn cũng cần cấp quyền cho người dùng của mình để sử dụng USB. Ví dụ: trên Ubuntu 15.10, bạn

cần phát hành một cái gì đó như:

sudo usermod -aG plugdev $USER

Sau đó đăng nhập lại hoặc khởi động lại. Nếu bạn vẫn gặp sự cố, hãy kiểm tra tài liệu phân phối của bạn và

khi bạn có một giải pháp chức năng, hãy đăng nó lên diễn đàn dự án.

2.3.8 Linux - Cài đặt công cụ ST

ST cung cấp một số công cụ hữu ích để phát triển các ứng dụng dựa trên STM32.

STM32CubeMX là một công cụ đồ họa được sử dụng để tạo các tệp thiết lập bằng ngôn ngữ lập trình
C cho STM32 MCU, theo cấu hình phần cứng của bo mạch của chúng tôi. Ví dụ: nếu chúng tôi có
Nucleo-F401RE, dựa trên MCU STM32F401RE và chúng tôi muốn sử dụng đèn LED người dùng của nó
(được đánh dấu là LD2 trên bảng), thì STM32CubeMX sẽ tự động tạo tất cả các tệp nguồn chứa mã
C cần thiết để định cấu hình MCU (đồng hồ, cổng ngoại vi, v.v.) và GPIO được kết nối với đèn
LED (cổng GPIO 5 trên cổng A trên hầu hết tất cả các bo mạch Nucleo). Bạn có thể tải xuống
phiên bản mới nhất của STM32CubeMX (hiện tại là 4.23) từ trang ST chính thức²⁹ (liên kết tải xuống ở dưới cùng
²⁹http://bit.ly/1RLCa4G
Machine Translated by Google

Thiết lập chuỗi công cụ 79

của trang). Tệp này là một kho lưu trữ ZIP. Sau khi giải nén, bạn sẽ tìm thấy một tệp có tên SetupSTM32CubeMX

4.23.0.linux. Tập tin này là chương trình thiết lập để cài đặt công cụ. Chương trình thiết lập cần có quyền root nếu

bạn muốn cài đặt STM32CubeMX trên toàn hệ thống (trong trường hợp này, hãy mở tệp tại dấu nhắc lệnh bằng sudo ), nếu

không, bạn chỉ cần đặt nó vào trong thư mục /STMToolchain trong thư mục chính của mình. Chúng tôi sẽ cài đặt nó

trong thư mục nhà của chúng tôi.

Vì vậy, hãy nhấp đúp chuột vào biểu tượng SetupSTM32CubeMX-4.23.0.linux . Sau một lúc, trình hướng dẫn thiết lập sẽ

xuất hiện, như thể hiện trong Hình 22.

Hình 22: Trình hướng dẫn cài đặt STM32CubeMX

Thực hiện theo các hướng dẫn thiết lập. Theo mặc định, cài đặt chương trình trong thư mục /STM32Toolchain/

STM32CubeMX . Sau khi hoàn tất thiết lập, hãy vào bên trong thư mục /STM32Toolchain/STM32CubeMX và nhấp đúp vào biểu

tượng STM32CubeMX . Sau một lúc, STM32CubeMX sẽ xuất hiện trên màn hình, như trong Hình 23.
Machine Translated by Google

Thiết lập chuỗi công cụ 80

Hình 23: Giao diện STM32CubeMX

Một công cụ quan trọng khác là STM32CubeProgrammer³⁰. Đây là một phần mềm tải lên chương trình cơ
sở trên MCU bằng giao diện ST-LINK của Nucleo của chúng tôi hoặc một lập trình viên ST-LINK chuyên
dụng. Chúng ta sẽ sử dụng nó trong chương tiếp theo. Bạn có thể tải xuống STM32CubeProgrammer từ
trang ST chính thức³¹ (liên kết tải xuống ở cuối trang trong phần NHẬN PHẦN MỀM) và làm theo hướng
dẫn cài đặt.

2.4 Mac - Cài đặt chuỗi công cụ

Toàn bộ quy trình cài đặt sẽ đảm nhận các yêu cầu sau:

• Máy Mac chạy Mac OSX 10.11 (còn gọi là El Capitan) trở lên với đủ tài nguyên phần cứng
(Tôi khuyên bạn nên có ít nhất 4Gb RAM và 5Gb dung lượng trống trên Đĩa cứng).
• Bạn đã cài đặt bản phát hành Xcode phù hợp với phiên bản Mac OSX của mình (bạn có thể tải
xuống bằng App Store) và các công cụ dòng lệnh tương ứng của nó. Bạn sẽ tìm thấy một số hướng dẫn
³⁰http://bit.ly/2CK4aFa
³¹http://bit.ly/2CK4aFa
Machine Translated by Google

Thiết lập chuỗi công cụ 81

trên trang web mô tả cách cài đặt Xcode và các công cụ dòng lệnh nếu bạn hoàn toàn chưa quen với
chủ đề này.

• Bạn đã cài đặt MacPorts³² và nâng cấp nó bằng lệnh sudo port selfupdate tại dòng lệnh đầu cuối. Bạn
có thể tự do sử dụng một trình quản lý gói khác cho Mac OSX, nhưng hãy sắp xếp các hướng dẫn sau
cho phù hợp.
• Java SE 8 Cập nhật 121 trở lên. Nếu bạn chưa có phiên bản này, bạn có thể tải xuống miễn phí
từ trang hỗ trợ Java SE chính thức³³.

Chọn thư mục chuỗi công cụ

Một tính năng thú vị của Eclipse là nó không bắt buộc phải được cài đặt trong một đường dẫn cụ thể trên

Đĩa cứng. Điều này cho phép người dùng quyết định nơi đặt toàn bộ chuỗi công cụ và nếu muốn, di chuyển

nó đến nơi khác hoặc sao chép nó trên một máy khác (điều này thực sự hữu ích nếu bạn có nhiều máy Mac

cần bảo trì).

Trong cuốn sách này, chúng tôi sẽ giả định rằng toàn bộ chuỗi công cụ được cài đặt bên trong

/STM32Toolchain trên Đĩa cứng (tức là thư mục STM32Toolchain bên trong thư mục Home của bạn). Bạn có

thể tự do đặt nó ở nơi khác, nhưng hãy sắp xếp lại các đường dẫn trong hướng dẫn cho phù hợp.

2.4.1 Mac - Cài đặt Eclipse

Bước đầu tiên là cài đặt Eclipse IDE. Như đã nói trước đây, chúng tôi quan tâm đến phiên bản Eclipse dành
cho các nhà phát triển C/C++. Phiên bản mới nhất tại thời điểm sửa đổi chương này (tháng 8 năm 2018) là
Photon (Eclipse v4.8). Tuy nhiên, chúng tôi thực sự khuyên bạn nên sử dụng bản phát hành trước, đó là
Oxygen.3a (Eclipse v4.7.3a), vì bản mới nhất vẫn chưa được hỗ trợ bởi bộ phần bổ trợ GNU MCU Eclipse và
bởi một số công cụ khác được sử dụng trong bản phát hành này sách. Nó có thể được tải xuống từ trang tải
xuống chính thức³⁴ như trong Hình 25³⁵.

³²https://www.macports.org/
³³http://bit.ly/2k5ppYR
³⁴https://www.eclipse.org/downloads/packages/release/oxygen/3a/ ³⁵Một
số ảnh chụp màn hình có thể khác với ảnh chụp được báo cáo trong Cuốn sách này. Điều này xảy ra vì IDE Eclipse được cập nhật
thường xuyên. Đừng lo lắng về điều đó: hướng dẫn cài đặt sẽ hoạt động trong mọi trường hợp.
Machine Translated by Google

Thiết lập chuỗi công cụ 82

Hình 25: Trang tải về Eclipse

IDE Eclipse được phân phối dưới dạng hình ảnh DMG. Gắn hình ảnh và kéo tệp Eclipse.app bên trong thư
mục /STM32Toolchain/eclipse.

Bây giờ chúng ta có thể thực thi IDE Eclipse lần đầu tiên. Vào bên trong thư mục /STM32Toolchain/
eclipse và chạy tệp Eclipse.app . Sau một thời gian, Eclipse sẽ hỏi bạn về thư mục ưu tiên nơi lưu trữ
tất cả các dự án Eclipse (được gọi là không gian làm việc), như thể hiện trong Hình 26.
Machine Translated by Google

Thiết lập chuỗi công cụ 83

Hình 26: Thiết lập không gian làm việc của Eclipse

Bạn có thể tự do chọn thư mục mình thích hoặc để lại thư mục được đề xuất. Trong cuốn sách này, chúng ta sẽ

giả định rằng không gian làm việc của Eclipse nằm bên trong thư mục /STM32Toolchain/projects . Sắp xếp các

hướng dẫn cho phù hợp nếu bạn chọn một vị trí khác.

2.4.2 Mac - Cài đặt trình cắm Eclipse

Khi Eclipse được khởi động, chúng ta có thể tiến hành cài đặt một số trình cắm thêm có liên quan.

Trình cắm là gì?

Trình cắm thêm là một mô-đun phần mềm bên ngoài giúp mở rộng các chức năng của Eclipse. Một trình cắm thêm

phải tuân thủ một API tiêu chuẩn do các nhà phát triển Eclipse xác định. Bằng cách này, các nhà phát triển

bên thứ ba có thể thêm các tính năng vào IDE mà không cần thay đổi mã nguồn chính. Chúng tôi sẽ cài đặt một

số trình cắm thêm trong cuốn sách này để điều chỉnh Eclipse theo nhu cầu của chúng tôi.

Plug-in đầu tiên chúng ta cần cài đặt là SDK công cụ phát triển C/C++, còn được gọi là CDT Eclipse.

CDT cung cấp Môi trường phát triển tích hợp C và C++ đầy đủ chức năng dựa trên nền tảng Eclipse. Các tính

năng bao gồm: hỗ trợ tạo dự án và bản dựng được quản lý cho các chuỗi công cụ khác nhau, bản dựng tạo tiêu

chuẩn, điều hướng nguồn, nhiều công cụ kiến thức nguồn khác nhau, chẳng hạn như phân cấp kiểu, biểu đồ cuộc

gọi, bao gồm trình duyệt, trình duyệt định nghĩa macro, trình chỉnh sửa mã có tô sáng cú pháp, gấp và điều

hướng siêu liên kết, tái cấu trúc mã nguồn và tạo mã, các công cụ sửa lỗi trực quan, bao gồm bộ nhớ, thanh

ghi và trình xem tháo gỡ.

Để cài đặt CDT, chúng ta phải làm theo quy trình này. Đi tới Trợ giúp-> Cài đặt phần mềm mới….
Machine Translated by Google

Thiết lập chuỗi công cụ 84

Hình 26: Lựa chọn kho trình cắm thêm của Eclipse

Trong cửa sổ cài đặt plug-in, chúng ta cần bật các kho plug-in khác bằng cách nhấp vào nút
Quản lý… . Trong cửa sổ Preferences, chọn mục “Install/Update->Available Software Sites” ở bên
trái và sau đó kiểm tra mục “CDT” như trong Hình 26. Nhấp vào nút OK.

Bây giờ, từ trình đơn thả xuống “work with”, chọn kho “CDT”, như thể hiện trong Hình 27, sau
đó chọn “CDT Main Features->C/C++ Development Tools” và “CDT Optional Features->C/C++ GDB
Hardware Debugging”, như thể hiện trong Hình 28. Nhấp vào nút “Next” và làm theo hướng dẫn để
cài đặt plug-in. Khi kết thúc quá trình cài đặt (quá trình cài đặt mất một lúc tùy thuộc vào
tốc độ kết nối Internet của bạn), hãy khởi động lại Eclipse khi được yêu cầu.
Machine Translated by Google

Thiết lập chuỗi công cụ 85

Hình 27: Lựa chọn kho CDT


Machine Translated by Google

Thiết lập chuỗi công cụ 86

Hình 28: Lựa chọn plug-in CDT


Machine Translated by Google

Thiết lập chuỗi công cụ 87

Bây giờ chúng ta phải cài đặt các trình cắm thêm GNU MCU cho Eclipse³⁶. Các plug-in này thêm một tập hợp
các tính năng phong phú vào Eclipse CDT để giao tiếp với chuỗi công cụ GCC ARM. Hơn nữa, chúng cung cấp
các chức năng cụ thể cho nền tảng STM32. Các phần bổ trợ được phát triển và duy trì bởi Liviu Ionescu,
người đã thực sự xuất sắc trong việc cung cấp hỗ trợ cho chuỗi công cụ GCC ARM. Nếu không có các plug-in
này thì gần như không thể phát triển và chạy mã với Eclipse cho nền tảng STM32.

Để cài đặt các trình cắm GCC ARM, hãy chuyển đến Trợ giúp-> Cài đặt phần mềm mới…. Trong cửa sổ Cài đặt,
nhấp vào nút Thêm… và điền vào các trường theo cách sau (xem Hình 29):

Tên: Trình cắm thêm GNU MCU Eclipse


Vị trí: http://gnu-mcu-eclipse.netlify.com/v4-neon-updates Bấm vào

nút OK. Bây giờ, từ trình đơn thả xuống “làm việc với”, hãy chọn kho lưu trữ “Trình cắm thêm GNU MCU
Eclipse”. Một danh sách các gói có thể cài đặt xuất hiện. Kiểm tra các gói để cài đặt theo Hình 30.

Hình 29: Cài đặt plug-in GNU MCU

³⁶https://gnu-mcu-eclipse.github.io/
Machine Translated by Google

Thiết lập chuỗi công cụ 88

Hình 30: Lựa chọn plug-in GNU MCU

Bấm vào nút “Next >” và làm theo hướng dẫn để cài đặt plug-in. Khi kết thúc quá trình cài đặt, hãy
khởi động lại Eclipse khi được yêu cầu.

Đọc cẩn thận

Nếu bạn gặp sự cố trong quá trình cài đặt trình cắm (lỗi bắt tay, lỗi cung cấp
hoặc lỗi tương tự), vui lòng tham khảo phần khắc phục sự cố.

Giờ đây, Eclipse về cơ bản đã được cấu hình để bắt đầu phát triển các ứng dụng STM32. Bây giờ chúng
ta cần bộ biên dịch chéo để tạo phần sụn cho họ STM32.

2.4.3 Mac - Cài đặt nhúng GCC ARM

Bước tiếp theo trong cấu hình chuỗi công cụ là cài đặt bộ GCC cho bộ vi điều khiển ARM Cortex-M và
Cortex-R. Đây là một bộ công cụ (bộ tiền xử lý macro, trình biên dịch, trình biên dịch mã, trình liên
kết và trình gỡ lỗi) được thiết kế để biên dịch chéo mã mà chúng ta sẽ tạo cho nền tảng STM32.

You might also like