Daftar Isi:

Jadi, Anda Memuat Bootloader STM32duino di "Pil Biru" AndaJadi Bagaimana Sekarang?: 7 Langkah
Jadi, Anda Memuat Bootloader STM32duino di "Pil Biru" AndaJadi Bagaimana Sekarang?: 7 Langkah

Video: Jadi, Anda Memuat Bootloader STM32duino di "Pil Biru" AndaJadi Bagaimana Sekarang?: 7 Langkah

Video: Jadi, Anda Memuat Bootloader STM32duino di
Video: Memprogram Pil Biru STM32 dengan Logika Tangga PLC LDmicro 2024, Juli
Anonim
Jadi, Anda Memuat Bootloader STM32duino di. Anda
Jadi, Anda Memuat Bootloader STM32duino di. Anda
Jadi, Anda Memuat Bootloader STM32duino di. Anda
Jadi, Anda Memuat Bootloader STM32duino di. Anda

Jika Anda sudah membaca instruksi saya yang menjelaskan bagaimana memuat bootloader STM32duino atau dokumentasi serupa lainnya, Anda mencoba memuat contoh kode dan….mungkin tidak ada yang terjadi sama sekali.

Masalahnya adalah, banyak, jika tidak semua contoh untuk STM32 "Generik" tidak akan bekerja di luar kotak. Ini akan menjadi perubahan kecil yang diperlukan untuk kemudian bekerja di papan "Blue Pill" STM32 Anda.

Saya akan memilih 4 contoh kode untuk menjelaskan apa yang perlu diubah dan mengapa. Kodenya adalah: "BlinkWithoutDelay", "Fading", "Dimmer" dan "AnalogInSerial".

Catatan saya TIDAK kode apa pun. Saya hanya mengeluarkan perubahan kecil pada kode yang dibuat oleh:

David A. Mellis dan dimodifikasi oleh Tom Igoe, Marti Bolivar dan beberapa kasus oleh Scott Fitzgerald

Tom Igoe dan almarhum dimodifikasi oleh Bryan Newbold

Jadi, saya lebih suka menyimpan nama penulis bahkan dalam kode yang saya modifikasi, menjaga kredit kreasi.

Langkah 1: Pin dan Pin…. Mengapa Kode Tidak Berfungsi?

Pin dan Pin…. Mengapa Kode Tidak Berfungsi?
Pin dan Pin…. Mengapa Kode Tidak Berfungsi?

Mari kita lihat pin "Pill Biru" STM32. Pin catatan diidentifikasi sebagai PA1 atau PC2 …. sesuatu seperti itu.

Jika Anda perhatikan, misalnya, contoh kode "BlinkWithoutDelay", pin dinyatakan sebagai "33"…. Mengapa?

Saya menduga itu karena Mr Marti Bolivar porting kode ini untuk papan MAPLE.

Saya pikir itu bukan niatnya membiarkan kode kompatibel dengan papan "Pill Biru".

Pin papan mini Maple dan Maple dinyatakan numerik, seperti Arduino, meskipun mereka menggunakan angka seperti 33, 24 dan beberapa seperti ini.

Saya mengatakan kode tidak berfungsi? Kesalahanku. Kompilasi kode tanpa kesalahan dan unggah dengan benar ke "Blue Pill", jadi, menurut saya itu memang berfungsi, tetapi menggunakan output GPIO tidak kami harapkan. Bahkan mungkin tidak tersedia.

Jadi sedikit perubahan diperlukan dalam kode agar berfungsi seperti yang diharapkan.

Langkah 2: Mari kita "mendefinisikan" Beberapa Pin…

mari kita
mari kita

Ini adalah praktik kode yang baik mendeklarasikan sumber daya sebagai identifikasi yang mudah atau variabel makna atau konstanta. Ini akan membuat Anda lebih mudah memahami dan memecahkan masalah kode.

Saya menggunakan mendeklarasikan pin Arduino seperti ini:

const int ledPin = 13;

…"

Jika Anda menyukai saya, mungkin Anda bertanya pada diri sendiri: "Bagaimana cara mendeklarasikan pin dengan nama seperti PC13???"

Jawabannya adalah: Gunakan pernyataan C "#define".

Jadi, menurut undian pinout, PC13 adalah pin yang kami miliki di papan LED di "BluePill". Untuk menggunakannya, saya akan mendeklarasikan seperti ini, tepat setelah definisi perpustakaan (#include…) dan sebelum yang lainnya:

#definisikan LedPin PC13

…"

Perhatikan TIDAK ADA ";" penghentian baris, NOR "=" tugas.

Bandingkan kedua kode. Salah satunya adalah contoh asli yang diambil dari IDE. Kedua adalah yang saya lakukan beberapa penyesuaian untuk bekerja dengan "BluePill".

Saya sangat menyarankan untuk mendeklarasikan semua pin yang ingin Anda gunakan dalam kode. Bahkan mereka berniat untuk digunakan sebagai input ADC (lebih lanjut nanti).

Ini akan membuat hidup Anda mudah.

Langkah 3: PinMode()…Bagaimana Anda Akan Menggunakan Pin Anda…

Sebelum melanjutkan, mari kita pahami fungsi PinMode().

Seperti Arduino, pin STM32 memiliki banyak fungsi. Cara paling sederhana untuk memilih satu atau lainnya adalah menggunakan pernyataan pinMode().

Arduino hanya memiliki 3 mode yang tersedia, INPUT, OUTPUT, atau INPUT_PULLUP.

STM32, di sisi lain memiliki banyak rasa pinMode(). Mereka:

OUTPUT -Keluaran digital dasar: ketika pin HIGH, tegangan ditahan pada +3,3v (Vcc) dan ketika LOW, ditarik ke ground

OUTPUT_OPEN_DRAIN -Dalam mode pembuangan terbuka, pin menunjukkan "rendah" dengan menerima aliran arus ke tanah dan "tinggi" dengan memberikan peningkatan impedansi

INPUT_ANALOG -Ini adalah mode khusus ketika pin akan digunakan untuk pembacaan analog (bukan digital). Memungkinkan konversi ADC dilakukan pada tegangan pada pin

INPUT_PULLUP -Keadaan pin dalam mode ini dilaporkan dengan cara yang sama seperti pada INPUT, tetapi tegangan pin secara perlahan “ditarik ke atas” menuju +3.3v

INPUT_PULLDOWN -Keadaan pin dalam mode ini dilaporkan dengan cara yang sama seperti pada INPUT, tetapi tegangan pin secara perlahan "ditarik ke bawah" menuju 0v

INPUT_FLOATING -Sinonim untuk INPUT

PWM -Ini adalah mode khusus ketika pin akan digunakan untuk output PWM (kasus khusus untuk output digital)

PWM_OPEN_DRAIN -Seperti PWM, kecuali bahwa alih-alih siklus LOW dan HIGH bergantian, tegangan pada pin terdiri dari siklus LOW dan floating bolak-balik (terputus)

(catatan: diekstrak dari

Saya baru saja membuka kurung ini karena ketika Anda mulai membuat kode Anda sendiri, berhati-hatilah untuk menggunakan pinMode() yang benar untuk kebutuhan Anda.

Langkah 4: AnalogWrite() Versus PwmWrite()…Output Analog dalam 2 Rasa

AnalogWrite() Versus PwmWrite()…Output Analog dalam 2 Rasa
AnalogWrite() Versus PwmWrite()…Output Analog dalam 2 Rasa
AnalogWrite() Versus PwmWrite()…Output Analog dalam 2 Rasa
AnalogWrite() Versus PwmWrite()…Output Analog dalam 2 Rasa

Sebelum menggunakan pin GPIO "Pill Biru", perlu mendeklarasikan perilakunya, yaitu cara kerjanya. Itulah tepatnya fungsi pinMode().

Jadi, mari kita fokus sekarang bagaimana mengatur output analog dengan benar. Itu dapat dideklarasikan sebagai mode OUTPUT atau mode PWM.

Dengan cara yang sama, nilai Analog dapat diatribusikan ke GPIO dengan 2 cara: analogWrite() atau pwmWrite(), TAPI, analogWrite() hanya akan berfungsi jika pinMode()= OUTPUT. Di sisi lain, pwmWrite() hanya AKAN bekerja jika pinMode()=PWM.

Mari kita ambil PA0, misalnya: ini adalah kandidat keluaran analog/pwm.

analogWrite(): ini mendeklarasikan dengan cara ini:

….

#tentukan ledPin PA0

pinMode(ledPin, OUTPUT);

analogWrite(pin led, < angka >);

……"

di mana angka harus antara 0 dan 255, seperti Arduino. Sebenarnya, ini kompatibel dengan Arduino.

pwmWrite(): deklarasikan dengan cara ini:

#tentukan ledPin PA0

pinMode (ledPin, PWM);

pwmWrite(ledPin, < nomor.>);

…."

Dimana angka harus antara 0~65535, resolusi yang jauh lebih tinggi dari Arduino.

Dalam gambar dimungkinkan untuk membandingkan antara 2 kode. Anda juga dapat melihat kode asli.

Langkah 5: Komunikasi Serial STM32

Komunikasi Serial STM32
Komunikasi Serial STM32

Mari kita lihat bagaimana susunan antarmuka USART di STM32. Ya, antarmuka dalam bentuk jamak…..

"Blue Pill" memiliki 3 USART (RX/ TX 1~3), dan, jika Anda menggunakan bootloader memungkinkan Anda menggunakan USB, USB tidak terhubung ke salah satu dari itu.

Tergantung Anda menggunakan atau tidak USB, Anda perlu mendeklarasikan port serial dengan satu atau cara lain dalam kode Anda.

Kasus 1: Menggunakan USB:

Dengan cara ini, sketsa diunduh langsung melalui USB. Tidak perlu memindahkan jumper BOOT0 ke posisi 1 dan kembali ke 0.

Dalam hal ini, setiap kali Anda mendeklarasikan "Serial" tanpa indeks, berarti komunikasi melalui USB.

Jadi, Serial1, berarti TX/ RX 1 (Pin PA9 dan PA10); Serial2, berarti TX/ RX 2 (pin PA2 dan PA3) dan Serial 3 berarti TX/ RX 3 (Pin PA10 dan PA11).

Ini adalah cara kami bekerja. Saya akan menyajikan perubahan dalam contoh untuk cara pengkodean ini.

Hal lain: "Serial USB" tidak perlu diinisialisasi. Dengan kata lain, "…Serial.begin(15200);" tidak perlu.

Dimungkinkan untuk memanggil fungsi Serial apa pun (Serial.read(), Serial.write(), dll) tanpa inisialisasi apa pun.

Jika karena alasan tertentu ada dalam kode, kompiler akan mengabaikannya.

Kasus 2: Menggunakan TTL seria ke adaptor USB:

Dengan cara ini, bootloader tidak mendukung komunikasi USB STM32 asli, jadi Anda memerlukan adaptor USB ke serial yang terhubung ke TX/ RX 1 (pin PA9 dan PA10) untuk mengunggah sketsa.

Dalam hal ini, setiap kali "Serial" tanpa indeks adalah kode, berarti TX/ RX1 (port yang digunakan untuk mengunggah kode). Selanjutnya, Serial1 mengacu pada TX/ RX 2 (pin PA2 dan PA3) dan Serial2 mengacu padaTX/ RX 3 (Pin PA10 dan PA11). Tidak ada Serial3 yang tersedia.

Langkah 6: Melewati Nilai ke Mikrokontroler

Melewati Nilai ke Mikrokontroler
Melewati Nilai ke Mikrokontroler

Contoh dimmer adalah cara sederhana untuk menunjukkan bagaimana melewatkan nilai ke mikrokontroler.

Seharusnya melewati nilai dari 0 hingga 255 untuk mengontrol kecerahan LED.

Ini TIDAK akan berfungsi seperti yang diharapkan di Blue Pill karena:

  1. Untuk menggunakan fungsi pwmWrite(), pinMode() HARUS dideklarasikan sebagai mode PWM.
  2. Anda tidak akan pernah mendapatkan bilangan bulat 3 digit. Fungsi Serial.read() hanya menangkap konten buffer, yang merupakan "BYTE". jika Anda mengetik "100" dan menekan "enter", hanya "0" terakhir yang akan diambil dari buffer. Dan nilainya akan menjadi "48" (nilai ASCII desimal untuk "0"). Jika berniat untuk mengeluarkan nilai "100", maka perlu mengetik "d". Jadi, benar untuk mengatakan itu akan mengubah nilai desimal simbol ASCII dalam kecerahan LED, kan??…. Yah, semacam…
  3. Soal, nilai peta langsung dari fungsi Serial.read() adalah tindakan trik. Hampir pasti mendapatkan nilai yang tidak terduga. Pendekatan yang lebih baik adalah menyimpan konten buffer dalam variabel sementara dan daripada memetakannya.

Seperti yang saya jelaskan sebelumnya di item 2, kode yang saya perkenalkan perubahan akan memungkinkan memasukkan simbol ASCII dan ini akan mengontrol kecerahan LED berdasarkan nilai desimal ASCII … misalnya, "spasi" adalah nilai 32 (sebenarnya adalah karakter cetak terendah yang dapat Anda masukkan) dan "}" mungkin yang tertinggi (nilai 126). Karakter lain tidak dapat dicetak, jadi terminal tidak akan mengerti atau mungkin karakter gabungan (seperti "~" adalah kunci mati di keyboard saya dan tidak akan berfungsi dengan benar). Artinya, karakter majemuk ini, ketika masuk di terminal, akan mengirim karakter itu sendiri dan sesuatu yang lain. Biasanya yang tidak dapat dicetak. Dan apakah kode terakhir ini akan ditangkap. Juga, ingatlah Terminal Anda, dalam hal ini, TIDAK boleh mengirim "Carriage Return" atau "Line Feed". Anda harus memperhatikan ini agar kode berfungsi dengan benar.

Jika Anda jatuh itu sedikit membingungkan, itu menjadi lebih buruk…..

Langkah 7: Dan Jika Saya Ingin Mengetik Tiga Digit…. atau Bahkan Lebih??

Dan Jika Saya Ingin Mengetik Tiga Digit…. atau Bahkan Lebih??
Dan Jika Saya Ingin Mengetik Tiga Digit…. atau Bahkan Lebih??

Menerima banyak karakter dari komunikasi serial bukanlah tugas yang mudah.

Buffer serial adalah tumpukan karakter FIFO byte. Setiap kali fungsi Serial.read() dipanggil, karakter pertama yang dikirim akan dihapus dari tumpukan dan disimpan di tempat lain. Biasanya variabel char dalam kode. Catatan, tergantung pada perangkat keras, biasanya ada batas waktu bagaimana buffer log dapat menyimpan informasi.

Jika Anda bermaksud memasukkan lebih dari satu digit melalui serial, Anda harus "menyusun" string karakter demi karakter, saat mereka masuk ke buffer UART.

Ini berarti bersepeda membaca setiap buffer char, menyimpannya dalam variabel temp, memuatnya di posisi pertama array string, pindah ke posisi berikutnya dan memulai dari awal, sampai… yah, tergantung aplikasi. Ada 2 cara untuk mengakhiri siklus:

  1. Menggunakan beberapa karakter "tanda akhir", seperti "carriage Return" atau "Line Feed". Segera setelah char "end Mark" ditemukan, loop berakhir.
  2. Atau, jumlah karakter dalam rantai string dapat dibatasi, begitu juga jumlah siklus interaktif. Ketika mencapai batas, katakanlah, 4, dapatkan penyelesaian rutin dengan sendirinya.

Mari kita lihat dalam contoh sederhana bagaimana melakukan ini:

  • Tetapkan karakter "akhir", seperti '\n' (ini berarti karakter ASCII umpan baris).
  • perulangan sementara Serial.available() benar
  • menyimpan Serial.read() menghasilkan variabel char sementara. Ingat: segera Serial.read() benar-benar "membaca" buffer, buffer itu bersih dan karakter berikutnya dimuat di dalamnya.
  • menambah variabel string dengan karakter ini
  • Jika karakter terakhir adalah "akhir" keluar dari loop.

Biasanya, rutin untuk mendapatkan array karakter serial terlihat seperti gambar.

Itu didasarkan pada adaptasi ekstensif dari kode asli Mr. David A. Mellis.

Jatuh bebas untuk menggunakan dan mengujinya. Ingat: nilai HARUS dimasukkan dalam format 3 digit.

Ini untuk saat ini. Saya tidak akan menjelaskan detail komunikasi serial tambahan. Itu terlalu rumit untuk dibahas di sini dan itu layak memiliki Intructables sendiri.

Saya harap ini membantu Anda menggunakan contoh di Blue Pill dan memberi Anda pencerahan bagaimana kode yang benar untuk papan kecil ini.

Sampai jumpa di instruksi lainnya.

Direkomendasikan: