Isi kandungan:

Jadi, Anda Memuatkan Bootloader STM32duino di "Blue Pill" Jadi Apa Sekarang ?: 7 Langkah
Jadi, Anda Memuatkan Bootloader STM32duino di "Blue Pill" Jadi Apa Sekarang ?: 7 Langkah

Video: Jadi, Anda Memuatkan Bootloader STM32duino di "Blue Pill" Jadi Apa Sekarang ?: 7 Langkah

Video: Jadi, Anda Memuatkan Bootloader STM32duino di
Video: ОГНЕМЁТ ПРОТИВ СЛЕПОГО ОХОТНИКА! ТЕСТ ОГНЕМЁТА НА БОССЕ – Last Day on Earth: Survival 2024, Jun
Anonim
Jadi, Anda Memuatkan Bootloader STM32duino di dalam Anda
Jadi, Anda Memuatkan Bootloader STM32duino di dalam Anda
Jadi, Anda Memuatkan Bootloader STM32duino di dalam Anda
Jadi, Anda Memuatkan Bootloader STM32duino di dalam Anda

Sekiranya anda sudah membaca arahan saya yang menerangkan bagaimana memuatkan bootloader STM32duino atau dokumentasi lain yang serupa, anda cuba memuatkan contoh kod dan….mungkin tidak ada yang berlaku sama sekali.

Masalahnya, banyak, jika tidak semua contoh untuk "Generik" STM32 tidak akan berfungsi dengan baik. Perlu dilakukan perubahan kecil untuk kemudian bekerja di papan STM32 "Blue Pill" anda.

Saya akan memilih 4 contoh kod untuk menerangkan apa yang perlu diubah dan mengapa. Kodnya adalah: "BlinkWithoutDelay", "Fading", "Dimmer" dan "AnalogInSerial".

Nota saya TIDAK mengekodkan apa-apa. Saya hanya mengeluarkan sedikit perubahan dalam kod yang dibuat oleh:

David A. Mellis dan lewat diubah suai oleh Tom Igoe, Marti Bolivar dan beberapa kes oleh Scott Fitzgerald

Tom Igoe dan lewat diubah suai oleh Bryan Newbold

Oleh itu, saya lebih suka menyimpan nama pengarang walaupun dalam kod yang saya ubah suai, mengekalkan kredit penciptaan.

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

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

Mari kita lihat di pin STM32 "Blue Pill". Pin nota dikenali sebagai PA1 atau PC2….seperti itu.

Sekiranya anda melihat, misalnya, contoh kod "BlinkWithoutDelay", pin dinyatakan sebagai "33" …. Mengapa?

Saya mengesyaki itu kerana Mr. Marti Bolivar memasukkan kod ini untuk papan MAPLE.

Saya rasa bukan niatnya membiarkan kod sesuai dengan papan "Blue Pill".

Pin papan mini Maple dan Maple dinyatakan secara berangka, seperti Arduino, walaupun mereka menggunakan nombor seperti 33, 24 dan beberapa seperti ini.

Saya kata kod tidak berfungsi? Salah saya. Menyusun kod tanpa ralat dan memuat naik dengan betul ke "Blue Pill", jadi, menurut saya ia memang berfungsi, tetapi tidak menggunakan jangkaan output GPIO. Mungkin juga tidak ada.

Oleh itu, sedikit perubahan yang diperlukan dalam kod berfungsi seperti yang diharapkan.

Langkah 2: Mari "tentukan" Beberapa Pin…

Mari
Mari

Amalan kod yang baik menyatakan sumber sebagai pengenal pasti mudah atau bermaksud pemboleh ubah atau pemalar. Ini akan membolehkan kod anda lebih mudah difahami dan menyelesaikan masalah.

Saya pernah menggunakan pin Arduino seperti ini:

const int ledPin = 13;

…"

Sekiranya anda menyukai saya, mungkin anda bertanya pada diri sendiri: "Bagaimana saya boleh menyatakan pin dengan nama seperti PC13 ???"

Jawapannya: Gunakan pernyataan C # #define.

Jadi, menurut undian pinout, PC13 adalah pin yang kami ada di papan LED dalam "BluePill". Untuk menggunakannya, saya akan menyatakan seperti ini, tepat selepas definisi perpustakaan (# termasuk…) dan sebelum perkara lain:

#define LedPin PC13

…"

Perhatikan tidak ada ";" penamatan talian, tugasan NOR "=".

Bandingkan kedua-dua kod tersebut. Salah satunya adalah contoh asal yang dimuatkan dari IDE. Kedua adalah yang saya lakukan untuk menyesuaikan diri dengan "BluePill".

Saya sangat mengesyorkan menyatakan semua pin yang ingin anda gunakan dalam kod. Bahkan mereka berhasrat untuk digunakan sebagai input ADC (lebih lanjut mengenainya kemudian).

Ini akan memudahkan hidup anda.

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

Sebelum meneruskan, mari fahami fungsi PinMode ().

Seperti Arduino, pin STM32 mempunyai pelbagai fungsi. Cara paling mudah untuk memilih satu atau yang lain adalah dengan menggunakan pernyataan pinMode ().

Arduino hanya mempunyai 3 mod yang tersedia, INPUT, OUTPUT, atau INPUT_PULLUP.

STM32, sebaliknya mempunyai banyak rasa pinMode (). Mereka adalah:

OUTPUT-Output digital asas: apabila pin TINGGI, voltan dipegang pada + 3.3v (Vcc) dan ketika RENDAH, ia ditarik ke bawah

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

INPUT_ANALOG -Ini adalah mod khas untuk bila pin akan digunakan untuk bacaan analog (bukan digital). Membolehkan penukaran ADC dilakukan pada voltan pada pin

INPUT_PULLUP -Keadaan pin dalam mod ini dilaporkan sama seperti INPUT, tetapi voltan pin perlahan-lahan "ditarik" ke arah + 3.3v

INPUT_PULLDOWN -Keadaan pin dalam mod ini dilaporkan sama seperti INPUT, tetapi voltan pin perlahan-lahan "diturunkan" ke arah 0v

INPUT_FLOATING -Sinonim untuk INPUT

PWM -Ini adalah mod khas untuk bila pin akan digunakan untuk output PWM (casing khas output digital)

PWM_OPEN_DRAIN -Seperti PWM, kecuali bahawa daripada kitaran bergantian RENDAH dan TINGGI, voltan pada pin terdiri daripada kitaran seli LOW dan terapung (terputus)

(nota: diekstrak dari

Saya hanya membuka kurungan ini kerana apabila anda mula membuat kod anda sendiri, berhati-hatilah menggunakan pinMode () yang betul untuk keperluan 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 "Pil Biru" perlu menyatakan kelakuannya, iaitu bagaimana ia berfungsi. Itulah fungsi fungsi pinMode ().

Oleh itu, mari fokus sekarang bagaimana betul menetapkan output analog. Ia boleh dinyatakan sebagai mod OUTPUT atau mod PWM.

Dengan cara yang sama, nilai Analog boleh dikaitkan dengan GPIO dalam 2 cara: analogWrite () atau pwmWrite (), TAPI, analogWrite () AKAN hanya berfungsi jika pinMode () = OUTPUT. Sebaliknya, pwmWrite () AKAN hanya berfungsi jika pinMode () = PWM.

Mari kita ambil PA0, sebagai contoh: ia adalah calon output analog / pwm.

analogWrite (): ini menyatakan dengan cara ini:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <nombor>);

……"

di mana nombor mesti antara 0 dan 255, seperti Arduino. Sebenarnya, ia serasi dengan Arduino.

pwmWrite (): nyatakan dengan cara ini:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <number.>);

…."

Di mana nombor mesti antara 0 ~ 65535, resolusi jauh lebih tinggi daripada Arduino.

Dalam gambar adalah mungkin untuk membandingkan antara 2 kod. Anda juga dapat melihat kod asal.

Langkah 5: Komunikasi Bersiri STM32

Komunikasi Bersiri STM32
Komunikasi Bersiri STM32

Mari lihat bagaimana susunan antara muka USART di STM32. Ya, antara muka dalam bentuk jamak…..

"Blue Pill" mempunyai 3 USART (RX / TX 1 ~ 3), dan, jika anda menggunakan bootloader membolehkan anda menggunakan USB, ia tidak akan disambungkan ke mana pun.

Bergantung pada anda menggunakan atau tidak USB, anda perlu menyatakan port bersiri dengan satu atau lain cara dalam kod anda.

Kes 1: Menggunakan USB:

Dengan cara ini, lakaran dimuat turun terus melalui USB. Tidak perlu memindahkan jumper BOOT0 ke 1 kedudukan dan kembali ke 0.

Dalam kes ini, bila-bila masa anda menyatakan "Serial" tanpa indeks, bermaksud komunikasi melalui USB.

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

Ini adalah cara yang kita bekerjasama. Saya akan mengemukakan perubahan contoh untuk kaedah pengekodan ini.

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

Ada kemungkinan memanggil sebarang fungsi Serial (Serial.read (), Serial.write (), dan lain-lain) tanpa inisialisasi.

Sekiranya oleh sebab tertentu terdapat dalam kod, penyusun akan mengabaikannya.

Kes 2: Menggunakan penyesuai TTL seria ke USB:

Dengan cara ini, bootloader tidak menyokong komunikasi USB STM32 asli, jadi anda memerlukan penyesuai USB ke siri yang disambungkan ke TX / RX 1 (pin PA9 dan PA10) untuk memuat naik sketsa.

Dalam kes ini, bila-bila masa "Serial" tanpa indeks adalah kod, bermaksud TX / RX1 (port yang digunakan untuk memuat naik kod). Jadi, Serial1 merujuk kepada TX / RX 2 (pin PA2 dan PA3) dan Serial2 merujuk kepada TX / RX 3 (Pin PA10 dan PA11). Tiada Serial3 tersedia.

Langkah 6: Memberi Nilai kepada Pengawal Mikro

Memberi Nilai kepada Mikrokontroler
Memberi Nilai kepada Mikrokontroler

Contoh redup adalah cara mudah untuk menunjukkan bagaimana menyampaikan nilai ke mikrokontroler.

Ia sepatutnya memberikan nilai dari 0 hingga 255 untuk mengawal kecerahan LED.

TIDAK akan berfungsi seperti yang diharapkan dalam Blue Pill kerana:

  1. Untuk menggunakan fungsi pwmWrite (), pinMode () HARUS dinyatakan sebagai mod PWM.
  2. Anda tidak akan mendapat nombor 3 digit keseluruhan. Fungsi Serial.read () menangkap kandungan buffer, yang merupakan "BYTE". jika anda mengetik "100" dan tekan "enter", hanya "0" terakhir yang akan diambil dari buffer. Dan nilainya akan menjadi "48" (nilai ASCII perpuluhan untuk "0"). Sekiranya bermaksud mengeluarkan nilai "100", perlu menaip "d". Jadi, adalah betul untuk mengatakan bahawa ia akan menukar nilai perpuluhan simbol ASCII dalam kecerahan LED, kan ?? …. Nah, semacam…
  3. Masalahnya, nilai peta secara langsung dari fungsi Serial.read () adalah tindakan muslihat. Ini hampir pasti mendapat nilai yang tidak dijangka. Pendekatan yang lebih baik adalah kandungan buffer penyimpanan dalam pemboleh ubah sementara dan TERIMA memetakannya.

Seperti yang saya jelaskan sebelumnya dalam item 2, kod yang saya perkenalkan perubahan akan membenarkan memasukkan simbol ASCII dan ini akan mengawal kecerahan LED berdasarkan nilai perpuluhan ASCIInya … sebagai contoh, "ruang" adalah nilai 32 (sebenarnya adalah watak dicetak paling rendah yang boleh anda masukkan) dan "}" mungkin yang tertinggi (nilai 126). Karakter lain tidak boleh dicetak, jadi terminal tidak akan memahami atau mereka mungkin sebilangan watak (seperti "~" adalah kunci mati di papan kekunci saya dan tidak akan berfungsi dengan betul). Ini bermaksud, watak majmuk ini, apabila memasuki terminal, akan menghantar watak itu sendiri dan sesuatu yang lain. Biasanya yang tidak boleh dicetak. Dan adakah kod terakhir ini akan ditangkap. Juga, ingat Terminal anda, dalam kes ini, TIDAK boleh menghantar "Carriage Return" atau "Line Feed". Anda mesti memperhatikan ini agar kod berfungsi dengan betul.

Sekiranya anda jatuh ia sedikit membingungkan, ia menjadi lebih teruk…..

Langkah 7: Dan Sekiranya Saya Ingin Menaip Tiga Digit…. atau Lebih Banyak lagi ??

Dan Sekiranya Saya Ingin Menaip Tiga Digit…. atau Lebih Banyak lagi ??
Dan Sekiranya Saya Ingin Menaip Tiga Digit…. atau Lebih Banyak lagi ??

Menerima pelbagai watak dari komunikasi bersiri bukanlah tugas yang mudah.

Serial buffer ialah timbunan bait FIFO bars. Bila-bila masa fungsi Serial.read () memanggil, char pertama yang dihantar dikeluarkan dari timbunan dan disimpan di tempat lain. Biasanya pemboleh ubah char dalam kod. Perhatikan, bergantung pada perkakasan, biasanya ada batas waktu bagaimana penyangga log dapat menyimpan maklumat.

Sekiranya anda bermaksud memasukkan lebih dari satu digit melalui siri, anda mesti "menyusun" rentetan watak mengikut watak, ketika mereka masuk ke penyangga UART.

Ini bermaksud berbasikal membaca setiap buffer char, menyimpan dalam variabel temp, memuatkannya di posisi pertama dari array string, pindah ke posisi berikutnya dan mulai dari awal, hingga… baik, tergantung aplikasi. Terdapat 2 cara untuk mengakhiri kitaran:

  1. Menggunakan beberapa watak "tanda akhir", seperti "carriage Return" atau "Line Feed". Sebaik sahaja "akhir Mark" char dijumpai, gelung berakhir.
  2. Sebagai alternatif, bilangan watak dalam rantai rentetan boleh dibatasi, begitu juga dengan bilangan kitaran interaktif. Apabila mencapai batas, katakanlah, 4, dapatkan penyelesaian rutin sendiri.

Mari kita lihat dalam contoh mudah bagaimana melakukannya:

  • Tetapkan char "end", seperti '\ n' (ini bermaksud char ASCII feed line).
  • gelung sementara Serial.available () adalah benar
  • menyimpan Serial.read () menghasilkan pemboleh ubah char sementara. Ingat: sebaik sahaja Serial.read () benar-benar "membaca" penyangga, itu bersih dan watak seterusnya dimuat di dalamnya.
  • tambah pemboleh ubah rentetan dengan char ini
  • Sekiranya char terakhir adalah "akhir" keluar dari gelung.

Biasanya, rutin untuk mendapatkan susunan watak bersiri seperti gambar.

Ini berdasarkan penyesuaian luas kod asal Encik David A. Mellis.

Bebas untuk digunakan dan mengujinya. Ingat: nilai HARUS dimasukkan dalam format 3 digit.

Ini buat masa ini. Saya tidak akan memaparkan maklumat komunikasi bersiri tambahan. Ia terlalu rumit untuk dilindungi di sini dan wajar dimiliki oleh Intructables.

Saya harap ia dapat membantu anda menggunakan contoh dalam Blue Pill dan memberi anda pencerahan bagaimana kod yang betul untuk papan kecil ini.

Jumpa anda dalam pengajaran lain.

Disyorkan: