Kelanjutan dari artikel selanjutnya: STM32 untuk pemula. Antarmuka

Posting sebelumnya: " Artikel lain - STM32 untuk pemula "



Dan bagaimana Anda menggunakannya?



Di artikel sebelumnya, kami membuat kelas untuk bekerja dengan port I / O, dicentang. Jadi, selanjutnya apa? Mengapa memasukkan semua ini ke dalam kelas?



Mari kita ambil polling tombol sederhana sebagai contoh:





Untuk skema ini, dalam kasus yang paling sederhana, survei akan terlihat seperti ini:



int GetKey()
{
  volatile uint32_t* addr = reinterpret_cast<uint32_t*>(GPIOA_IDR);
  uint32_t ret_val = *addr;
  return ret_val & 0x0F;
}


Tetapi, jika Anda mengubah port yang terhubung ke tombol-tombol di sirkuit, Anda harus mengubah fungsi polling. Dan di setiap proyek. Ini tidak selalu nyaman. Saya ingin menulis, menguji, dan menggunakan sekali.



Mari tulis ulang fungsi ini di bawah kelas yang dibuat sebelumnya:



int GetKey(Pin* p0, Pin* p1, Pin* p2, Pin* p3)
{
  int ret_val = p0->Get() + (p1->Get() << 1) + (p2->Get() << 2) + (p3->Get() << 3);
  return ret_val;
}


Itu tetap di program utama untuk menginisialisasi port dan meneruskannya ke fungsi:



...
using namespace STM32F1xx;
Pin key0('a', 0);
Pin key1('a', 1);
Pin key2('a', 2);
Pin key3('a', 3);
...
int main()
{
  key0.ModeInput();
  key1.ModeInput();
  key2.ModeInput();
  key3.ModeInput();
  int key_code = GetKey(&key0, &key1, &key2, &key3);
...
  return 0;
}


Dimana interface-nya?



Dan sekarang mari kita bayangkan bahwa pengontrol seri f10x telah habis, tetapi ada banyak f030. Dari segi performa dan jumlah pin saja sudah cukup, Anda hanya perlu mengganti header untuk fungsi GetKey atau gunakan ... #ifdef. Buat file header global, di mana jenis pengontrol yang digunakan (seperti #define STM32F030) dan susun banyak definisi. Tidak, ini bukanlah alasan mengapa bahasa tingkat tinggi dibuat membingungkan di makro!



Ayo pergi ke arah lain. Mari buat kelas di mana kita membuat daftar metode virtual yang kita butuhkan dalam hidup untuk bekerja dengan port:



iPin.h
#pragma once

class iPin
{
public:
  virtual void ModeInput()              = 0;
  virtual void ModeAnalogInput()        = 0;
  virtual void ModeInputPulled()        = 0;
  virtual void ModeOutput()             = 0;
  virtual void ModeOutputOpenDrain()    = 0;

  virtual void Set(bool st) = 0;
  virtual bool Get() = 0;

  virtual void Reverse() { Set(!Get());}

  void On()              { Set(true);  }
  void Off()             { Set(false); }
};




(metode yang sama dengan 0 harus didefinisikan di kelas turunan!)

dan kita akan menggunakannya sebagai basis di kelas Pin:



...
#include "iPin.h"
...
class Pin : public iPin
...


maka fungsi GetKey akan sedikit berubah:



int GetKey(iPin* p0, iPin* p1, iPin* p2, iPin* p3)
{
  int ret_val = p0->Get() + (p1->Get() << 1) + (p2->Get() << 2) + (p3->Get() << 3);
  return ret_val;
}


Sekarang kami tidak peduli dengan pengontrol apa pun! Bahkan jika itu adalah bus expander yang bekerja di atas SPI atau I2C. Kami akan mempertimbangkan antarmuka serial di artikel berikutnya.



Jadi, selanjutnya apa?



Selanjutnya, Anda perlu mendesain kelas untuk bekerja dengan timer sistem. Tapi ini sudah ada di publikasi berikutnya.



All Articles