Mục lục:

Vì vậy, bạn tải STM32duino Bootloader trong "Blue Pill" của bạn Vậy bây giờ là gì?: 7 bước
Vì vậy, bạn tải STM32duino Bootloader trong "Blue Pill" của bạn Vậy bây giờ là gì?: 7 bước

Video: Vì vậy, bạn tải STM32duino Bootloader trong "Blue Pill" của bạn Vậy bây giờ là gì?: 7 bước

Video: Vì vậy, bạn tải STM32duino Bootloader trong
Video: Lập trình STM32 bằng Arduino - 07: Cài đặt nạp code cho bo Blue Pill bằng USB bootloader 2024, Tháng bảy
Anonim
Vì vậy, bạn tải STM32duino Bootloader trong
Vì vậy, bạn tải STM32duino Bootloader trong
Vì vậy, bạn tải STM32duino Bootloader trong
Vì vậy, bạn tải STM32duino Bootloader trong

Nếu bạn đã đọc các tài liệu hướng dẫn của tôi giải thích cách tải bộ nạp khởi động STM32duino hoặc bất kỳ tài liệu tương tự nào khác, bạn hãy thử tải ví dụ về mã và…. Có thể không có gì xảy ra cả.

Vấn đề là, nhiều, nếu không phải tất cả các ví dụ cho STM32 "Chung" sẽ không hoạt động tốt. Sẽ là những thay đổi nhỏ cần thiết để sau đó hoạt động trong bảng STM32 "Blue Pill" của bạn.

Tôi sẽ chọn 4 ví dụ mã để giải thích những gì cần thay đổi và tại sao. Các mã là: "BlinkWithoutDelay", "Fading", "Dimmer" và "AnalogInSerial".

Lưu ý rằng tôi KHÔNG viết bất cứ thứ gì. Tôi chỉ đưa ra những thay đổi nhỏ trong mã được tạo bởi:

David A. Mellis và sửa đổi muộn bởi Tom Igoe, Marti Bolivar và một số trường hợp của Scott Fitzgerald

Tom Igoe và sửa đổi muộn bởi Bryan Newbold

Vì vậy, tôi thích giữ tên tác giả ngay cả trong mã tôi sửa đổi, giữ tín dụng sáng tạo.

Bước 1: Ghim và ghim…. Tại sao mã không hoạt động?

Ghim và ghim…. Tại sao mã không hoạt động?
Ghim và ghim…. Tại sao mã không hoạt động?

Chúng ta hãy xem phần ghim "Blue Pill" của STM32. Các chân ghi chú được xác định là PA1 hoặc PC2….như thế.

Nếu bạn xem ví dụ, ví dụ mã "BlinkWithoutDelay", mã pin được khai báo là "33"…. Tại sao?

Tôi nghi ngờ đó là vì ông Marti Bolivar đã chuyển mã này cho bảng MAPLE.

Tôi nghĩ rằng đó không phải là ý định của anh ấy để mã tương thích với bảng "Blue Pill".

Các chân của bảng mini Maple và Maple được khai báo bằng số, giống như Arduino, mặc dù chúng sử dụng các số như 33, 24 và một số như thế này.

Tôi nói mã không hoạt động? Lỗi của tôi. Biên dịch mã mà không có bất kỳ lỗi nào và tải lên chính xác lên "Blue Pill", vì vậy, theo ý kiến của tôi thì nó thực sự đang hoạt động, nhưng sử dụng đầu ra GPIO mà chúng tôi không mong đợi. Thậm chí có thể không có.

Vì vậy, một số thay đổi nhỏ là cần thiết trong mã để nó hoạt động như mong đợi.

Bước 2: Hãy “định nghĩa” một số Ghim…

Hãy
Hãy

Đó là một thực hành mã tốt khai báo các tài nguyên như là các biến dễ dàng xác định hoặc có nghĩa là các biến hoặc hằng số. Nó sẽ giúp bạn viết mã dễ hiểu hơn và khắc phục sự cố.

Tôi đã sử dụng khai báo các chân Arduino như thế này:

const int ledPin = 13;

…"

Nếu bạn cũng như tôi, có lẽ bạn đang tự hỏi mình: "Làm cách nào để khai báo các chân có tên như PC13 ???"

Câu trả lời là: Sử dụng câu lệnh C "#define".

Vì vậy, theo bản vẽ sơ đồ, PC13 là chân mà chúng ta có trên đèn LED trên bo mạch trong "BluePill". Để sử dụng nó, tôi sẽ khai báo như thế này, ngay sau định nghĩa thư viện (# include…) và trước bất kỳ thứ gì khác:

#define LedPin PC13

…"

Lưu ý KHÔNG có ";" kết thúc dòng, gán NOR "=".

So sánh cả hai mã. Một là ví dụ ban đầu được tải từ IDE. Thứ hai là điều tôi đã điều chỉnh để hoạt động với "BluePill".

Tôi thực sự khuyên bạn nên khai báo tất cả các chân bạn định sử dụng trong mã. Ngay cả những người có ý định sử dụng làm đầu vào ADC (sẽ nói thêm về nó ở phần sau).

Điều này sẽ làm cho cuộc sống của bạn dễ dàng.

Bước 3: PinMode ()… Bạn sẽ sử dụng các Ghim của mình như thế nào…

Trước khi tiếp tục, hãy hiểu về PinMode () funtion.

Giống như Arduino, chân STM32 có nhiều chức năng. Cách đơn giản nhất để chọn một hoặc khác là sử dụng câu lệnh pinMode ().

Arduino chỉ có sẵn 3 chế độ là INPUT, OUTPUT hoặc INPUT_PULLUP.

Mặt khác, STM32 có nhiều hương vị của pinMode (). Họ đang:

OUTPUT - Ngõ ra kỹ thuật số cơ bản: khi chân ở mức CAO, điện áp được giữ ở mức + 3.3v (Vcc) và khi ở mức THẤP, nó được kéo xuống đất

OUTPUT_OPEN_DRAIN -Trong chế độ xả mở, chân chỉ báo "thấp" bằng cách chấp nhận dòng điện xuống đất và "cao" bằng cách cung cấp trở kháng tăng lên

INPUT_ANALOG -Đây là một chế độ đặc biệt khi chân sẽ được sử dụng cho các lần đọc tương tự (không phải kỹ thuật số). Cho phép thực hiện chuyển đổi ADC trên điện áp tại chân cắm

INPUT_PULLUP - Trạng thái của chân trong chế độ này được báo cáo giống như với INPUT, nhưng điện áp chân được “kéo lên” nhẹ nhàng về phía + 3.3v

INPUT_PULLDOWN - Trạng thái của chân trong chế độ này được báo cáo giống như với INPUT, nhưng điện áp chân được “kéo xuống” nhẹ nhàng về phía 0v

INPUT_FLOATING - Từ ẩn của INPUT

PWM - Đây là một chế độ đặc biệt khi chân được sử dụng cho đầu ra PWM (một trường hợp đặc biệt của đầu ra kỹ thuật số)

PWM_OPEN_DRAIN Giống như PWM, ngoại trừ việc thay vì các chu kỳ LOW và HIGH xen kẽ, điện áp trên chân bao gồm các chu kỳ LOW và nổi (ngắt kết nối) xen kẽ

(lưu ý: được trích xuất từ https://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/latest/lang/api/pinmode.html#lang-pinmode)

Tôi chỉ mở ngoặc đơn này vì khi bạn bắt đầu tạo mã của riêng mình, hãy cẩn thận sử dụng đúng pinMode () cho nhu cầu của bạn.

Bước 4: AnalogWrite () so với PwmWrite ()… Đầu ra tương tự ở 2 hương vị

AnalogWrite () so với PwmWrite ()… Đầu ra tương tự ở 2 hương vị
AnalogWrite () so với PwmWrite ()… Đầu ra tương tự ở 2 hương vị
AnalogWrite () so với PwmWrite ()… Đầu ra tương tự ở 2 hương vị
AnalogWrite () so với PwmWrite ()… Đầu ra tương tự ở 2 hương vị

Trước khi sử dụng các chân GPIO "Blue Pill", cần phải khai báo hành vi của nó, tức là nó sẽ hoạt động như thế nào. Đó chính xác là những gì hàm pinMode () thực hiện.

Vì vậy, bây giờ chúng ta hãy tập trung vào cách thiết lập chính xác đầu ra analog. Nó có thể được khai báo là chế độ OUTPUT hoặc chế độ PWM.

Tương tự, các giá trị Analog có thể được thuộc tính cho GPIO theo 2 cách: analogWrite () hoặc pwmWrite (), NHƯNG, analogWrite () SẼ chỉ hoạt động nếu pinMode () = OUTPUT. Mặt khác, pwmWrite () SẼ chỉ hoạt động nếu pinMode () = PWM.

Hãy lấy PA0, ví dụ: nó là một ứng cử viên đầu ra tương tự / pwm.

analogWrite (): khai báo theo cách này:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <số>);

……"

trong đó số phải từ 0 đến 255, như Arduino. Trên thực tế, nó tương thích ngược với Arduino.

pwmWrite (): khai báo theo cách này:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <số.>);

…."

Trong đó số phải từ 0 ~ 65535, độ phân giải cao hơn nhiều so với Arduino.

Trong hình ảnh có thể so sánh giữa 2 mã. Bạn cũng có thể xem mã gốc.

Bước 5: Giao tiếp nối tiếp STM32

Giao tiếp nối tiếp STM32
Giao tiếp nối tiếp STM32

Hãy xem cách sắp xếp các giao diện USART trong STM32. Có, giao diện ở số nhiều…..

"Blue Pill" có 3 USART (RX / TX 1 ~ 3) và, nếu bạn đang sử dụng bộ nạp khởi động cho phép bạn sử dụng USB, thì nó không được kết nối với bất kỳ bộ nạp nào.

Tùy thuộc vào việc bạn có đang sử dụng hay không USB, bạn cần phải khai báo cổng nối tiếp theo cách này hoặc cách khác trong mã của mình.

Trường hợp 1: Sử dụng USB:

Bằng cách này, bản phác thảo được tải trực tiếp qua USB. Không cần di chuyển jumper BOOT0 đến 1 vị trí và quay lại 0.

Trong trường hợp này, bất kỳ lúc nào bạn khai báo "Serial" mà không có chỉ mục, có nghĩa là giao tiếp qua USB.

Vì vậy, Serial1, có nghĩa là TX / RX 1 (Chân PA9 và PA10); Serial2, nghĩa là TX / RX 2 (chân PA2 và PA3) và Serial 3 có nghĩa là TX / RX 3 (Chân PA10 và PA11).

Đây là cách chúng tôi đang làm việc. Tôi sẽ trình bày những thay đổi trong các ví dụ cho cách viết mã này.

Một điều nữa: "Serial USB" không cần khởi tạo. Nói cách khác, "… Serial.begin (15200);" không cần thiết.

Có thể gọi bất kỳ hàm Serial nào (Serial.read (), Serial.write (), v.v.) mà không cần bất kỳ khởi tạo nào.

Nếu vì lý do nào đó nó có trong mã, trình biên dịch sẽ bỏ qua nó.

Trường hợp 2: Sử dụng bộ chuyển đổi TTL seria sang USB:

Theo cách này, bộ nạp khởi động không hỗ trợ giao tiếp USB STM32 gốc, vì vậy bạn cần một bộ chuyển đổi USB sang nối tiếp được kết nối với TX / RX 1 (chân PA9 và PA10) để tải lên bản phác thảo.

Trong trường hợp này, bất kỳ lúc nào "Serial" không có chỉ mục là mã, có nghĩa là TX / RX1 (cổng được sử dụng để tải mã lên). Vì vậy, Serial1 đề cập đến TX / RX 2 (chân PA2 và PA3) và Serial2 đề cập đếnTX / RX 3 (Chân PA10 và PA11). Không có sẵn Serial3.

Bước 6: Truyền một giá trị cho Vi điều khiển

Chuyển một giá trị cho vi điều khiển
Chuyển một giá trị cho vi điều khiển

Ví dụ về Dimmer là một cách đơn giản để chỉ ra cách truyền một giá trị cho vi điều khiển.

Nó giả sử chuyển một giá trị từ 0 đến 255 để điều khiển độ sáng của đèn LED.

Nó sẽ KHÔNG hoạt động như mong đợi trong Blue Pill do:

  1. Để sử dụng hàm pwmWrite (), pinMode () PHẢI được khai báo là chế độ PWM.
  2. Bạn sẽ không bao giờ nhận được số nguyên 3 chữ số. Hàm Serial.read () chỉ nắm bắt nội dung đệm, là "BYTE". nếu bạn gõ "100" và nhấn "enter", chỉ "0" cuối cùng sẽ được chụp từ bộ đệm. Và giá trị của nó sẽ là "48" (giá trị ASCII thập phân cho "0"). Nếu có ý định phát hành giá trị "100", cần phải nhập "d". Vì vậy, chính xác khi nói rằng nó sẽ chuyển đổi giá trị thập phân của biểu tượng ASCII trong độ sáng của đèn LED, phải không ??…. Vâng, một loại…
  3. Vấn đề, ánh xạ giá trị trực tiếp từ hàm Serial.read () là một hành động lừa. Nó gần như chắc chắn nhận được giá trị bất ngờ. Cách tiếp cận tốt hơn là lưu trữ nội dung bộ đệm trong một biến tạm thời và THAN ánh xạ nó.

Giống như tôi đã giải thích trước đó trong mục 2, mã mà tôi giới thiệu các thay đổi sẽ cho phép nhập ký hiệu ASCII và điều này sẽ kiểm soát độ sáng của đèn LED dựa trên giá trị thập phân ASCII của nó… ví dụ: "khoảng trắng" là giá trị 32 (thực sự là ký tự in được thấp nhất mà bạn có thể nhập) và "}" có thể là giá trị cao nhất (giá trị 126). Các ký tự khác không thể in được, vì vậy thiết bị đầu cuối sẽ không hiểu hoặc chúng có thể là một tổ hợp ký tự (như "~" là một phím chết trong bàn phím của tôi và sẽ không hoạt động chính xác). Điều này có nghĩa là, ký tự ghép này, khi nhập trong terminal, sẽ gửi chính ký tự đó và một số thứ khác. Thường là một cái không in được. Và mã cuối cùng này sẽ được ghi lại. Ngoài ra, hãy nhớ rằng Terminal của bạn, trong trường hợp này, KHÔNG nên gửi cả "Vận chuyển trở lại" hay "Nguồn cấp dữ liệu hàng". Bạn phải chú ý đến điều này để mã hoạt động chính xác.

Nếu bạn rơi, nó hơi khó hiểu, nó sẽ trở nên tồi tệ nhất…..

Bước 7: Và nếu tôi muốn nhập ba chữ số…. hoặc Thậm chí nhiều hơn ??

Và nếu tôi muốn gõ ba chữ số…. hoặc Thậm chí nhiều hơn ??
Và nếu tôi muốn gõ ba chữ số…. hoặc Thậm chí nhiều hơn ??

Nhận nhiều ký tự từ một giao tiếp nối tiếp không phải là một nhiệm vụ đơn giản.

Bộ đệm nối tiếp là đống ký tự byte FIFO. Bất kỳ lúc nào hàm Serial.read () đang gọi, char đầu tiên được gửi sẽ bị xóa khỏi đống và được lưu trữ ở một số nơi khác. Thường là một biến char trong mã. Lưu ý, phụ thuộc vào phần cứng, thường có thời gian chờ để làm thế nào bộ đệm nhật ký có thể lưu giữ thông tin.

Nếu bạn định nhập nhiều hơn một chữ số qua nối tiếp, bạn sẽ phải "soạn" một ký tự chuỗi theo từng ký tự, khi chúng vào bộ đệm UART.

Điều này có nghĩa là quay vòng đọc từng ký tự đệm, lưu trữ trong một biến tạm thời, tải nó ở vị trí đầu tiên của một mảng chuỗi, di chuyển đến vị trí tiếp theo và bắt đầu lại, cho đến khi… tốt, tùy thuộc vào ứng dụng. Có 2 cách để kết thúc chu kỳ:

  1. Sử dụng một số ký tự "dấu kết thúc", như "xuống dòng trở lại" hoặc "Nguồn cấp dòng". Ngay khi tìm thấy char "end Mark", vòng lặp sẽ kết thúc.
  2. Ngoài ra, số lượng ký tự trong chuỗi chuỗi có thể bị giới hạn, số chu kỳ tương tác cũng vậy. Khi nó đạt đến giới hạn, chẳng hạn, 4, hãy tự hoàn thành quy trình.

Hãy xem một ví dụ đơn giản về cách thực hiện điều này:

  • Đặt một ký tự "kết thúc", như '\ n' (điều này có nghĩa là ký tự ASCII của nguồn cấp dữ liệu dòng).
  • lặp lại trong khi Serial.available () là đúng
  • lưu trữ Serial.read () dẫn đến một biến char tạm thời. Hãy nhớ rằng: ngay sau khi Serial.read () thực sự "đọc" bộ đệm, nó sẽ sạch và ký tự tiếp theo sẽ được tải trong đó.
  • tăng một biến chuỗi với ký tự này
  • Nếu ký tự cuối cùng là "kết thúc" thoát khỏi vòng lặp.

Thông thường, quy trình để nhận mảng ký tự nối tiếp trông giống như hình ảnh.

Nó được dựa trên một bản chuyển thể rộng rãi của mã gốc của ông David A. Mellis.

Fell miễn phí để sử dụng và thử nghiệm nó. Hãy nhớ: các giá trị PHẢI được nhập ở định dạng 3 chữ số.

Bây giờ, tôi sẽ không mở rộng bản thân mình trong các chi tiết liên lạc nối tiếp bổ sung. Nó quá phức tạp để trình bày ở đây và nó xứng đáng có Intructables của riêng nó.

Tôi hy vọng nó sẽ giúp bạn sử dụng các ví dụ trong Blue Pill và cung cấp cho bạn một số hiểu biết về cách mã chính xác cho bảng nhỏ này.

Hẹn gặp lại bạn trong những hướng dẫn khác.

Đề xuất: