Kami membuat contoh untuk STM32, dikumpulkan di lingkungan pengembangan yang berbeda

Seperti yang telah saya sebutkan beberapa kali di artikel sebelumnya, saya adalah salah satu pengembang layanan Semua Perangkat Keras, di mana siapa pun dapat bekerja dari jarak jauh dengan berbagai papan debug yang dipasang oleh produsen mikrokontroler di sana. Secara default, aplikasi demo sampel dimuat ke setiap papan. Proyek perakitan mandiri aplikasi ini dapat diunduh untuk memulai eksperimen dari awal. Semuanya akan baik-baik saja, tetapi pengguna yang berbeda lebih memilih lingkungan pengembangan yang berbeda. Tentu saja, tidak mungkin untuk mencakup semua keragaman, tetapi setidaknya Eclipse, yang berarti GNU secara umum (dalam kasus STM32, ini lebih merupakan rakitan khusus dari STM32 Cube IDE) dan Keil dengan IAR, sangat berharga. Sebenarnya, saya diinstruksikan untuk membuat setidaknya beberapa penyatuan proyek demo untuk papan STM32. Pada artikel ini, pertama-tama saya akan memberi tahu Anda cara menjadi pengguna sederhana,yang pergi ke layanan dan mengunduh contoh. Apa yang perlu dilakukan untuk mengumpulkannya. Nah, dan baru kemudian, akan ada beberapa memoar yang membenarkan keputusan yang dipilih, serta hanya menggambarkan kesan dari karya tersebut.







1. Jenis aplikasi apa



Pertama mari kita lihat aplikasi apa yang ditawarkan. Kami memasuki situs https://all-hw.com/ .



Anda harus masuk ke sana (pendaftaran gratis). Setelah itu, daftar papan yang tersedia akan ditampilkan. Yang pertama tidak memiliki layar, sehingga merepotkan sebagai ilustrasi untuk artikel. Yang kedua adalah dangkal, setiap orang memilikinya, hanya saja tidak menarik untuk membicarakannya. Saya akan memilih yang ketiga - Penemuan STM32F469I . Setelah melalui beberapa langkah, saya menemukan diri saya di halaman berikut: Sebenarnya, di sebelah kiri kita melihat papan yang dihapus kamera. Dan aplikasi itu bekerja di sana. Penghitungnya hanya berdetak. Dan jika Anda memasukkan satu baris di terminal di sebelah kanan, itu akan ditampilkan di layar, karena terminal terhubung ke port debug UART. Nah, disini saya masuk Just Test.



























Tampaknya aplikasi untuk pengontrol untuk mengimplementasikan fungsi ini tidak rumit, tetapi ... Tapi ... Tapi saya ulangi, kami mengambil jumlah jenis papan ST dan mengalikannya dengan setidaknya tiga. Dan sekali lagi, kondisi yang sangat penting: waktu pengembangan aplikasi ini tidak boleh lama. Kami perlu mengembangkannya secepat mungkin. Dan itu harus dikompilasi oleh setidaknya tiga kompiler.



2. Kemungkinan cara



Hal pertama yang terlintas dalam pikiran adalah mengembangkan aplikasi khas di STM32Cube MX. Di sana, Anda dapat menghasilkan semuanya untuk tiga lingkungan pengembangan, dan dengan cepat menambahkan perangkat standar. Begitulah adanya, tapi:



  1. Jika Anda melihat contoh bekerja dengan aplikasi yang dibuat melalui CubeMX, Anda dapat melihat bahwa di sana, setelah pembuatan otomatis, Anda masih perlu memperbaiki banyak hal dengan file. Artinya, meski sudah dihemat waktu masih belum maksimal.
  2. , .
  3. Cube MX STemWin, ( , , , ST STemWin TouchGFX, – ).


Sebenarnya, ini cukup untuk menunda opsi seperti itu sebagai cadangan dan melihat apakah ada solusi yang lebih sederhana ... Ternyata ada, dan mereka juga terkait dengan Cube MX. Siapa pun yang telah bekerja dengan lingkungan ini tahu bahwa itu terdiri dari kode inti dan paket yang melayani keluarga pengontrol tertentu. Apa paketnya? Ini adalah file ZIP. Mari unduh dan buka kemasannya. Ambil, katakanlah, paket untuk STM32H747 yang baru. Saya memiliki file ini en.stm32cubeh7_v1-8-0.zip.



Dan kami melihat kekayaan yang luar biasa di dalamnya:







Ini adalah solusi umum untuk berbagai prototipe papan dengan jenis pengontrol ini. Baik. Kami memasukkan katalog kami STM32H747I-DISCO... Ada aplikasi siap pakai yang terpisah dan secara terpisah - contoh untuk bekerja dengan blok pengontrol. Bagi yang hanya ingin membuat contoh, tidak ada yang menarik di sini, tetapi pengembang aplikasi demo yang khas sebaiknya mempelajari isi direktori UART.







Dan dari aplikasi, ya, tentu saja, STemWin. Dan yang paling sederhana. Halo Dunia. Direktori tempatnya akan menarik bagi semua pengguna.







Kami akan membuat contoh kami berdasarkan aplikasi ini. Mengapa? Kami masuk ke direktori STemWin_HelloWorld dan melihat:







Programer ST melakukan segalanya untuk kami. Mereka telah membuat sumber yang dapat dikompilasi dari Keil, dari IAR dan dari Eclipse (yang sebenarnya adalah Cube-IDE). Jadi, cukup mengoreksi sumber-sumber ini, dan tugas akan diselesaikan tanpa mengedit file yang bergantung pada lingkungan pengembangan! Nah, dan proyek Hello World, ini juga menampilkan teks di layar. Cukup menambahkan dukungan UART ke dalamnya, dan semuanya akan berfungsi. Itu sebabnya saya catat di atas bahwa contoh UART juga berguna untuk pengembang.



Dan dalam kasus khusus ini, saya menginjak tenggorokan lagu saya sendiri. Jika ada yang membaca artikel saya sebelumnya, mereka tahu bahwa saya benci HAL. HAL dan optimasi adalah dua hal yang tidak cocok. Dalam proyek nyata, saya menggunakan pekerjaan langsung dengan perangkat keras, atau driver Konstantin Chizhov (perpustakaan mcucpp). Tetapi dalam kasus khusus ini, ini sama sekali bukan kasusnya. Kami baru saja membuat program yang menampilkan teks dan bekerja dengan port COM. Pada pengontrol dengan frekuensi clock ratusan megahertz. Sejujurnya, pada saat Ona, BK-shka biasa mengatasi hal ini, prosesornya bekerja pada frekuensi 3 MHz. Selain itu, BK-shki tidak memiliki perintah RISC, bahkan tidak ada jalur pipa. Tapi ada bus multipleks (yaitu, beberapa jam per siklus) dan DRAM asinkron tanpa caching. Pendeknya,kinerjanya hanya 300 ribu operasi register-register per detik. Dan ini cukup untuk menyelesaikan masalah keluaran teks dan bekerja dengan UART (melalui blok IRPS). Artinya, optimalitas kode HAL untuk tugas ini pada STM32 modern juga cukup untuk tugas yang ada. Tetapi kecepatan pengembangan saat menggunakan HAL akan menjadi yang tertinggi.



Papan baru akan muncul, pasti akan memiliki HAL dengan panggilan terpadu yang menyertainya. Kami akan memperbaiki inisialisasi dalam contoh tipikal, sesuai dengan contoh UART terlampir, dan pekerjaannya, itu akan selalu sama. Kecepatan pengembangan puluhan menit. Bahkan tidak ada jam tangan. Artinya, untuk mengatasi masalah ini, yang terbaik adalah menggunakan HAL, meskipun saya tidak suka untuk kasus pertempuran.



Semua. Minimal teori, yang tanpanya tidak mungkin melanjutkan ke praktik, kataku. Saya akan memberi tahu Anda hal-hal teoretis yang lebih rinci setelah pekerjaan laboratorium. Jadi mari kita lanjutkan ke eksperimen.



3. Apa yang harus dilakukan pengguna akhir



3.1 Unduh paket



Begitu. Anda tidak akan langsung membuat sesuatu sendiri, tetapi pertama-tama Anda ingin bermain dengan contoh yang sudah jadi yang diambil dari situs web All-Hardware. Apa yang Anda butuhkan untuk membangun dan menjalankannya? Pertama, Anda perlu mengunduh perpustakaan untuk papan tertentu. Bekerja dengan solusi Open Source, saya telah menemukan fakta bahwa mengunduh proyek saja tidak cukup. Kami masih perlu menginstal 100.500 alat dan mengunduh 100.500 pustaka pihak ketiga. Di sini Anda hanya perlu mengunduh dan membongkar satu file. Benar, ukurannya sangat besar. Tapi isinya bagus. Begitu. Kami membutuhkan paket untuk STM32 CubeMX. Sekarang tautan langsung ke repositori mereka terlihat seperti ini:



www.st.com/en/development-tools/stm32cubemx.html#tools-software



Paket mana yang harus diunduh ditunjukkan pada tabel di bawah.

Membayar Paket
Penemuan STM32F429I STM32CubeF4
Penemuan STM32F469I STM32CubeF4
STM32G474RE DPOW1 Discovery (tanpa layar) STM32CubeG4
Penemuan STM32F746G STM32CubeF7
Penemuan STM32H747I STM32CubeH7


3.2 Menyalin proyek dan mulai bekerja



Struktur paket di dalamnya sama, jadi kita pergi ke direktori dengan hierarki berikut:

<Package name> \ Projects \ <Board name> \ Applications \ STemWin.



Salin direktori dengan contoh di sana. Kami mendapatkan sesuatu seperti ini:





Lokasi direktori penting karena jalur ke perpustakaan ditulis dalam format relatif. Jika proyek tidak dibangun karena banyaknya jumlah file yang hilang, Anda tidak dapat menebak dengan lokasinya di hierarki direktori.
Kami memasuki katalog, memilih varian proyek untuk salah satu lingkungan pengembangan, membuka proyek, bekerja dengannya ... Akhir instruksi!







3.3 Fitur papan Penemuan STM32G474RE DPOW1



Papan ini tidak memiliki layar, yang berarti tidak ada katalog STemWin dalam paket kepemilikannya. Oleh karena itu, proyek harus ditempatkan di tingkat berikutnya:



\ STM32Cube_FW_G4_V1.3.0 \ Projects \ B-G474E-DPOW1 \ Contoh \ UART



4. Bagaimana proyek dibuat



Betapa mudahnya mengumpulkan contoh sudah jelas. Sekarang mari kita lihat bagaimana contoh-contoh ini dilakukan. Mungkin informasi ini berguna bagi mereka yang ingin melakukan sesuatu selain hanya menampilkan teks di layar. Nah, ketika dalam beberapa bulan akan perlu untuk memperkenalkan papan berikutnya, dan saya sudah melupakan semuanya, saya sendiri akan membuka artikel ini untuk menyegarkan instruksi dalam ingatan saya.



4.1 Menambahkan dan Menginisialisasi UART



Contoh khas STemWin Hello World sepertinya tidak memiliki UART. Itu harus ditambahkan. Tampaknya kami mengambil kode sampel dan menambahkannya. Sayangnya, hidup ini lebih rumit. Dalam fungsi kerja, kami melakukannya dengan cara ini. Tetapi ada beberapa nuansa selama inisialisasi. Untuk memulainya, papan prototyping yang berbeda memiliki port berbeda yang terhubung ke adaptor USB-UART yang terpasang pada adaptor JTAG. Yang mana yang terhubung, Anda perlu melihat di deskripsi papan. Biasanya, tentu saja, USART1, tetapi lebih baik memeriksa ulang.



Selanjutnya, keragaman diperkenalkan oleh fakta bahwa seiring berkembangnya pengontrol, berbagai fungsi yang berguna ditambahkan ke peralatan UART. Mereka juga perlu diinisialisasi di HAL papan baru. Secara khusus, bekerja dengan FIFO.



Oleh karena itu, saya menyarankan langkah-langkah khas berikut:



  1. Tambahkan pegangan port.
  2. Tambahkan inisialisasi perangkat keras UART.
  3. Tambahkan inisialisasi pin UART.
  4. Tambahkan penangan interupsi UART.


Dengan pegangannya, semuanya jelas dan universal. Ini akan terlihat seperti ini:



UART_HandleTypeDef huart1;


Lihat sisanya dalam contoh direktori mereka \ <Package Name> \ Projects \ <Board Name> \ Example \ UART .



Misalnya, proyek \ STM32Cube_FW_H7_V1.8.0 \ Projects \ STM32H747I-DISCO \ Contoh \ UART \ UART_WakeUpFromStopUsingFIFO .



Di fungsi main () ada inisialisasi UART itu sendiri (Anda hanya perlu memastikan bahwa kecepatannya 9600, jika tidak, masukkan). Koneksi dengan kaki dikonfigurasi di file lain, dalam fungsi

kosong HAL_UART_MspInit (UART_HandleTypeDef * huart) .



Saya lebih suka menempatkan semuanya dalam satu fungsi. Karena waktu terbatas, saya tidak melihat kompilasi fungsi seperti itu dari materi ini, menempatkannya di file main.c dan tidak lupa memanggilnya dari fungsi main ().



static void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */
	  GPIO_InitTypeDef  GPIO_InitStruct;


  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

//	__HAL_RCC_LPUART1_CLK_ENABLE();
	__HAL_RCC_USART1_CLK_ENABLE();

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_EnableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

  /* Enable the UART RX FIFO threshold interrupt */
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXFT);

  /* Enable the UART wakeup from stop mode interrupt */
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_WUF);

  /* USER CODE BEGIN USART3_Init 2 */
	__HAL_RCC_GPIOA_CLK_ENABLE();

  /*##-2- Configure peripheral GPIO ##########################################*/
  /* UART TX GPIO pin configuration  */
  GPIO_InitStruct.Pin       = GPIO_PIN_9;
  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull      = GPIO_PULLUP;
  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* UART RX GPIO pin configuration  */
  GPIO_InitStruct.Pin = GPIO_PIN_10;
  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  
  /* NVIC for USART */
  HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(USART1_IRQn);
	

  /* USER CODE END USART1_Init 2 */

}




, , JTAG. . β€” , JTAG , . .
Nah, interupsi itu sederhana. Kami mencari file dengan akhiran _it.c pada contoh dan mentransfer baris UART ke file dengan akhiran _it proyek kami.



Dalam hal ini, dari file

\ STM32Cube_FW_H7_V1.8.0 \ Projects \ STM32H747I-DISCO \ Contoh \ UART \ UART_WakeUpFromStopUsingFIFO \ CM7 \ Src \ stm32h7xx_it.c



ke file

\ STM32H747I -DISCO \ Contoh \ UART \ UART_WakeUpFromStopUsingFIFO \ CM7 \ Src \ stm32h7xx_it.c ke file \ STM32H747I-DISCO \ STemWin \ Demo_H747 \ CM7 \ Core \ Src \ stm32h7xx_it.c



transfer fragmen:



extern UART_HandleTypeDef huart1;
…
void USART1_IRQHandler(void)
{
 HAL_UART_IRQHandler(&huart1);
}


Semua.



4.2 Mengedit fungsi pekerjaan utama



Dengan fungsi kerja utama, pada prinsipnya semuanya lebih sederhana. Meskipun, tidak pada prinsipnya, dan secara khusus - tidak seluruhnya, tetapi kami akan membicarakannya di bawah ini. Untuk saat ini, mari kita lihat fungsi mana yang dipanggil di akhir fungsi utama. Dalam hal ini, ini adalah:



  MainTask();


Artinya pekerjaan utama sudah selesai di dalamnya. Kami hanya mengganti tubuhnya dengan contoh khas yang diambil dari situs kami.



4.3 Selanjutnya apa?



Selanjutnya - Anda dapat menarik contoh peralatan lain, seperti yang baru saja kita lakukan dengan peralatan UART. Benar, kontrol pengoperasian peralatan ini berada di luar cakupan artikel ini. Seperti yang Anda lihat, kontrol umum pada halaman WEB hanya untuk gambar dan untuk satu UART. Sisanya diteruskan sedikit lebih sulit. Namun demikian, saya tidak dapat membantu tetapi memberi tahu Anda bagaimana saya pernah diperintahkan untuk membuat generator kode Morse berdasarkan papan Penemuan STM32G474RE DPOW1 dalam satu malam . Suatu malam untuk mengembangkan dari awal pada papan yang tidak biasa tidak mengharuskan Anda untuk membaca ratusan halaman dokumentasi. Jika proyek itu dilakukan selama berabad-abad, saya akan mulai membuktikan kepada manajemen bahwa itu tidak benar dan bahwa segala sesuatu harus dipelajari dengan cermat. Tetapi proyek itu juga dengan siklus hidup yang pendek. Jadi saya memutuskan untuk mengambil contoh.



Jadi, untuk kode Morse, Anda membutuhkan sinus dengan frekuensi 1 KHz ... Dengan gerakan tangan yang biasa, buka file en.stm32cubeg4_v1-3-0.zip dan periksa direktori D: \ tmp \ STM32Cube_FW_G4_V1.3.0 \ Projects \ B-G474E-DPOW1 \ Contoh ... Dan tidak ada yang baik di sana tidak ditemukan ...







Tidak ada yang berguna di direktori DAC.







Apakah itu akhirnya? Tidak juga. Mari kita lihat contoh dari papan lain dengan kristal yang sama (meskipun dalam paket lain) ... Dan inilah keindahan yang kami temukan untuk papan Nukleo!







Keindahannya adalah di dalam file main.c ada tabel untuk menghasilkan sinus:



/* Sine wave values for a complete symbol */
uint16_t sinewave[60] = {
0x07ff,0x08cb,0x0994,0x0a5a,0x0b18,0x0bce,0x0c79,0x0d18,0x0da8,0x0e29,0x0e98,0x0ef4,0x0f3e,0x0f72,0x0f92,0x0f9d,
0x0f92,0x0f72,0x0f3e,0x0ef4,0x0e98,0x0e29,0x0da8,0x0d18,0x0c79,0x0bce,0x0b18,0x0a5a,0x0994,0x08cb,0x07ff,0x0733,
0x066a,0x05a4,0x04e6,0x0430,0x0385,0x02e6,0x0256,0x01d5,0x0166,0x010a,0x00c0,0x008c,0x006c,0x0061,0x006c,0x008c,
0x00c0,0x010a,0x0166,0x01d5,0x0256,0x02e6,0x0385,0x0430,0x04e6,0x05a4,0x066a,0x0733};


Kami memeriksa dan memastikan bahwa ya. Contoh ini menghasilkan sinus atau segitiga pada output DAC. Dan hanya dengan frekuensi 1 KHz. Jadi itu bagus! Karena waktu terbatas, saya bahkan tidak perlu repot-repot membaca teori apapun. Saya hanya memastikan bahwa semua formasi terjadi di tingkat perangkat keras dengan melihat kode sekilas. Setelah itu, dalam proyek, saya mengganti pengontrol dengan yang ada di papan yang diperlukan, merakit, mengisi, memulainya dan, setelah menjalankan probe osiloskop di sepanjang kaki, menemukan yang di mana sinus itu ada. Kemudian saya menghubungkannya ke input speaker, mengganti generasi sinus atau segitiga dengan generasi sinus atau keheningan (ya, saya membuat tabel lain hanya dari nol) ... Nah, menulis bagian yang diterapkan dengan kode Morse semudah mengupas buah pir. Saya ingat masa muda saya, departemen militer, Kolonel Pavlov ...



Secara umum, teknik "temukan contoh, masukkan ke dalam kode Anda" cukup efektif. Dan pendekatan "untuk membuat contoh yang khas - mengunduh perpustakaan besar" berkontribusi untuk ini, karena semua contoh bermerek ini adalah bagian darinya.



5. Masalah dalam penyatuan



Seorang rekan saya suka mengutip pernyataan filosofis berikut:



β€œSecara teori, tidak ada perbedaan antara teori dan praktek. Dalam praktiknya, itu benar. "



Saat bekerja dengan banyak STM32 yang berbeda, saya secara teratur mengingatnya. Saya telah mengatakan tentang UART yang pasti berbeda, tetapi tampaknya StemWin yang bersatu seharusnya tidak menghadirkan kejutan ... Disajikan!



5.1 STM32H747



Caption Hello World digambar. Tetapi ketika saya mentransfer kode kerja, saya melihat layar biru. Hanya saja pertama kita menggambar layar merah sebentar, lalu layar hijau sebentar, lalu layar biru sebentar, lalu pekerjaan dimulai. Jika Anda meletakkan breakpoint segera setelah inisialisasi, bahkan sebelum gambar apa pun, ketika dipicu, pembacaan timer dari awal terakhir terlihat di layar. Kemudian mereka ditimpa oleh layar biru yang sama. Apa?



Saya menghapus keluaran tiga warna per detik, dan segera menambahkan pekerjaan. Ini berfungsi, tetapi dengan cepat membeku selamanya. Secara bertahap saya mencari tahu apa yang membeku setelah 37 milidetik. Waktu ajaib macam apa ini? Satu milidetik jelas. Sistem centang. Tapi 37. Ya, setidaknya sesuatu yang bulat, dekat ...



Berapa lama, pendek, tapi saya menemukan bahwa semuanya ditampilkan di pawang interupsiHAL_DSI_IRQHandler (DSI_HandleTypeDef * hdsi) . Disebut, semuanya ditampilkan, setelah itu panggilannya diakhiri. Semuanya terbentuk di buffer, tetapi tidak muncul di layar. Lebih tepatnya, semuanya menyentuh layar dua kali selama masa aktif program. Saat inisialisasi (artefak yang sama dari kehidupan lampau) dan setelah 37 ms. Segala sesuatu yang ada di antara, tidak ada yang akan melihat.



Dalam pikiran - Anda perlu mempelajari dokumentasi dan mencari tahu apa. Namun nyatanya - waktu untuk tugas itu tidak sedikit, tapi sangat sedikit. Jelas interupsi harus diprovokasi, tapi bagaimana caranya? Sejujurnya saya mencoba memanggil GUI_Exec (), meskipun GUI_Delay () tetap dipanggil di sana ... Tidak membantu.



Contohnya sudah mati. Sebaliknya, di sana lucu. Hello World adalah keluaran seperti pada 37ms pertama. Dan kemudian - contoh mati. Oke, saya akan mengambil contoh dengan animasi dari katalog yang sama. Dia bekerja. Secara bertahap saya mencari tahu apa yang perlu diseret agar contoh kita berfungsi ... Beginilah tampilan kode khas kita:



  	GUI_SetBkColor(GUI_RED);
        GUI_Clear();
  	GUI_Delay(1000);
  	GUI_SetBkColor(GUI_GREEN);
  	GUI_Clear();
  	GUI_Delay(1000);
  	GUI_SetBkColor(GUI_BLUE);
  	GUI_Clear();
  	GUI_Delay(1000);


Nah, itu logis! Dan berhasil! .. Di papan lain ... Tapi setelah diedit, entah bagaimana pindah ke H747:







Teks yang sama.
	GUI_MULTIBUF_Begin();
  	GUI_SetBkColor(GUI_RED);
        GUI_Clear();
	GUI_MULTIBUF_End();
  	GUI_Delay(1000);
	GUI_MULTIBUF_Begin();
  	GUI_SetBkColor(GUI_GREEN);
  	GUI_Clear();
	GUI_MULTIBUF_End();
  	GUI_Delay(1000);
	GUI_MULTIBUF_Begin();
  	GUI_SetBkColor(GUI_BLUE);
  	GUI_Clear();
	GUI_MULTIBUF_End();
  	GUI_Delay(1000);




Tetapi secara umum, ini berfungsi, dan khususnya - layar merah dan hijau berlangsung sebentar, dan yang biru berkedip dan layar kerja segera muncul. Setelah sejumlah kecil percobaan, ternyata semuanya mulai bekerja sepenuhnya dalam bentuk ini:



	GUI_MULTIBUF_Begin();
  	GUI_SetBkColor(GUI_RED);
        GUI_Clear();
	GUI_MULTIBUF_End();
	GUI_MULTIBUF_Begin();
	GUI_MULTIBUF_End();
	GUI_MULTIBUF_Begin();
	GUI_MULTIBUF_End();
  	GUI_Delay(1000);
	GUI_MULTIBUF_Begin();
  	GUI_SetBkColor(GUI_GREEN);
  	GUI_Clear();
	GUI_MULTIBUF_End();
	GUI_MULTIBUF_Begin();
	GUI_MULTIBUF_End();
	GUI_MULTIBUF_Begin();
	GUI_MULTIBUF_End();
  	GUI_Delay(1000);
	GUI_MULTIBUF_Begin();
  	GUI_SetBkColor(GUI_BLUE);
  	GUI_Clear();
	GUI_MULTIBUF_End();
	GUI_MULTIBUF_Begin();
	GUI_MULTIBUF_End();
	GUI_MULTIBUF_Begin();
	GUI_MULTIBUF_End();
  	GUI_Delay(1000);


Begitu banyak untuk penyatuan ... Ada kecurigaan bahwa pengaturan itu harus disalahkan:



/* Define the number of buffers to use (minimum 1) */
#define NUM_BUFFERS  3


Tetapi percobaan dengan mengoreksinya tidak memberikan hasil yang ideal, dan waktu tidak memungkinkan untuk mempelajari detailnya. Mungkin seseorang di komentar akan memberi tahu Anda bagaimana bertindak dengan benar, dan bagian ini menunjukkan bagaimana Anda dapat bertindak dalam waktu terbatas untuk pengembangan. Sementara itu, kode tersebut tetap dalam kondisi yang sangat buruk. Untungnya, ini bukan tutorial, tetapi hanya contoh kode kerja.



5.2 STM32F429



Papan ini sudah tua, apa yang salah dengan itu? Dasar! Di papan lama, hasil yang ada, tetapi sudah lama berhenti bekerja, keluar. Jalankan contoh Hello World dan lihat:







Gambar diputar 90 derajat relatif terhadap gambar biasanya. Apa bisa lebih mudah? Kembali pada tahun 2016, sambil menyeret firmware printer MZ3D 3D dari Arduinka ke STM32F429, saya secara pribadi membalik gambar dengan pengaturan sederhana. Ayolah. Bagaimana kabarnya di sini? Dan inilah pengaturannya!



#define LCD_SWAP_XY  1 
#define LCD_MIRROR_Y 1


Mencoba mengubahnya, itu tidak membantu. Memeriksa di mana mereka digunakan ... Tapi tidak di mana-mana! Mereka baru saja diumumkan. Saya curiga mereka tidak lagi diproses ketika DMA2D diterapkan, tetapi saya tidak akan menjamin. Namun, ada fungsi yang sama. Berikut saran dari lusinan forum. Saya menggunakan fungsi ini pada tahun 2016:



GUI_SetOrientation(GUI_SWAP_XY)


Beberapa masih menambahkan konstanta pencerminan ... Tapi bukan itu intinya. Fungsi ini tidak berfungsi pada tahun 2020! Tidak berfungsi dan hanya itu! Dan pustaka dikirim dalam bentuk objek, mengapa tidak berfungsi - tidak ada yang akan tahu.



Oke, saya masih paham layar. Saya pergi ke file \ STM32F429-DISC1 \ Drivers \ BSP \ Components \ ili9341 \ ili9341.c (ya, ini dilindungi dari penulisan, tetapi dapat dengan mudah dihapus). Chip grafis dikonfigurasi di sana. Kita berubah.







Teks yang sama.
  ili9341_WriteReg(LCD_MAC);
  ili9341_WriteData(0xC8);




di





Teks yang sama.
  ili9341_WriteReg(LCD_MAC);
  ili9341_WriteData(0x48|0x20);




Gambar, tentu saja, berputar ... Tetapi buffer jelas dikonfigurasi agak salah:







Berikut adalah dimensinya:



#define XSIZE_PHYS 240
#define YSIZE_PHYS 320


juga tidak mempengaruhi pekerjaan dengan cara apapun. Hal yang sama berlaku untuk situs ini:



#define  ILI9341_LCD_PIXEL_WIDTH    ((uint16_t)240)
#define  ILI9341_LCD_PIXEL_HEIGHT   ((uint16_t)320)


Tapi situsnya lebih menarik:



  if (LCD_GetSwapXYEx(0)) {
    LCD_SetSizeEx (0, YSIZE_PHYS, XSIZE_PHYS);
    LCD_SetVSizeEx(0, YSIZE_PHYS * NUM_VSCREENS, XSIZE_PHYS);
  } else {
    LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
    LCD_SetVSizeEx(0, XSIZE_PHYS, YSIZE_PHYS * NUM_VSCREENS);
  }


Saya menambahkan negasi untuk bersenang-senang:







Teks yang sama.
  if (!LCD_GetSwapXYEx(0)) {
    LCD_SetSizeEx (0, YSIZE_PHYS, XSIZE_PHYS);
    LCD_SetVSizeEx(0, YSIZE_PHYS * NUM_VSCREENS, XSIZE_PHYS);
  } else {
    LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
    LCD_SetVSizeEx(0, XSIZE_PHYS, YSIZE_PHYS * NUM_VSCREENS);
  }




Saya mendapatkan keindahan ini.







Saya mendapatkan keindahan yang serupa, tetapi tidak persis sama dalam eksperimen lain, saya tidak ingat lagi ... Singkatnya, kita semua sampai pada kesimpulan mengecewakan yang sama. Kami harus duduk dan menyelesaikannya ... Tapi tidak ada waktu yang dialokasikan untuk persidangan. Apa yang harus dilakukan? Untungnya, saya berhasil mendapatkan jawaban atas pertanyaan ini dari Google. Hasilnya, kode tipikal dalam aplikasi demo terlihat seperti ini:



  GUI_DispStringHCenterAt("www.all-hw.com",   xSize / 2, 20);


Dan untuk F429 harus direduksi menjadi bentuk ini:

  GUI_RECT Rect = {20-10, 0, 20+10, xSize};		
  GUI_DispStringInRectEx("www.all-hw.com", &Rect, 
      GUI_TA_HCENTER | GUI_TA_VCENTER,
      20, GUI_ROTATE_CCW);	


Fungsi mengeluarkan teks yang diputar digunakan. Benar, untuk ini Anda harus menambahkan entitas "persegi panjang". Nah, apa yang bisa kamu lakukan. Dan penghitung harus ditampilkan bukan dengan fungsi mencetak angka, tetapi pertama dengan membentuk string, dan baru kemudian dengan menampilkannya dalam bentuk yang diputar. Tapi sebaliknya, semuanya berubah hampir secara universal. Bahkan dimungkinkan, sebaliknya, untuk menampilkan teks di mana-mana dengan cara ini, tetapi tidak di semua tempat menunjukkan bendera rotasi. Tetapi bagi saya tampaknya ini sudah menjadi penyimpangan.



6. Kesimpulan



Kami memeriksa metodologi untuk mengembangkan program tipikal untuk berbagai papan STM32, baik dari sudut pandang pengembang maupun dari sudut pandang pengguna yang hanya mengunduh aplikasi demo untuk papannya dan hanya ingin membangunnya tanpa memikirkan fisika. Kami juga melihat contoh yang menunjukkan bahwa, sayangnya, tingkat penyatuan kode tinggi, tetapi tidak mencapai seratus persen. Pengetahuan yang diperoleh dapat diperiksa dengan bekerja secara bergantian dengan papan yang berbeda melalui layanan Semua Perangkat Keras, tanpa mengeluarkan uang untuk pembelian mereka.



Artikel tersebut menunjukkan cara menyelesaikan masalah dengan agak dangkal. Ini memungkinkan Anda dengan cepat menguasai papan tertentu. Namun, tentunya semakin lama Anda menghadapinya, semakin mendalam ilmu yang akan Anda dapatkan. Saat memecahkan masalah nyata, ini sangat penting, karena program yang kompleks, di mana penulis tidak memahami fisika proses, adalah jalan menuju kesalahan dalam algoritme. Saya berharap semua orang menguasai segalanya dengan cukup dalam. Ya, menggunakan perangkat keras dari layanan Semua Perangkat Keras.



All Articles