STM32F103C8T6 - langkah pertama. Mulailah membuat osiloskop

Tentang kegembiraan dan kesulitan kenalan pertama dengan STM32 setelah AVR. Ketika saya mengimplementasikan tugas yang paling sederhana - mentransfer data ke PC.


Memiliki pengalaman dengan AVR, saya ingin membandingkan pengontrol yang tiba (yang masing-masing biaya $ 1,7 / unit ) dengan yang dekat dengan mereka pada harga ATMEGA328 ( $ 1,4 / unit ).
ATMEGA328STM32F103C8T6Menang, kali
Flash, kB32642
RAM, kB2dua puluh10
Frekuensi maksimum, MHzdua puluh723.6
Kecepatan ADC, kSPSlima belas2 * 1000 (dapat di-overclock)133

Dengan latar belakang peningkatan indikator kinerja sebesar 10-100 kali, Flash hanya meningkat 2 kali. Selain itu, 64 kB ini dikonsumsi hampir lebih cepat dari 32 pada AVR. Adalah logis untuk menggunakan pengontrol seperti itu di mana kinerja tinggi diperlukan, tetapi tidak ada algoritma kode-intensif ... misalnya, osiloskop.

Penampilan papan debug: Dari kiri ke kanan:
gambar

  • Arduino UNO (ATmega328P), $ 3,59 ;
  • Papan kami, yang akan kami siksa (STM32F103C8T6), $ 4,97 ;
  • Papan debug lain di STM32F103C8T6, $ 3,92 ;
  • Arduino Nano (ATmega328P), 2,23 - $ 2,56 .


Cara memprogram


Ada banyak sekali lingkungan pemrograman STM32 - IAR, Keil, Coocox ... pada awalnya sepertinya baik dan Anda pasti akan menemukan sesuatu yang cocok. Kemudian muncul pemahaman tentang bagaimana kebun binatang dibentuk. Hanya seseorang yang membuat IDE yang tidak terlalu bagus. Yang lain melihatnya dan memutuskan apa yang bisa mereka lakukan dengan lebih baik. Dan mereka melakukannya. Dalam beberapa hal ternyata lebih baik, dalam sesuatu yang lebih buruk. Setelah membaca ulasan dan mencoba IAR, saya memutuskan menggunakan Coocox.

Ada program lain - STM32CubeMX. Faktanya adalah bahwa ada lebih banyak periferal di STM32 daripada di AVR. Inisialisasi jauh lebih sulit. STM32CubeMX memungkinkan Anda untuk memilih pengontrol, mencolek dengan mouse dan menghasilkan kode inisialisasi. Bahkan jika kami tidak ingin menggunakan kode yang dibuat ini, di STM32CubeMX akan lebih mudah untuk melihat skema pinout dan clock, pilih pembagi, faktor, dan daftarkan secara manual dalam kode Anda! Sangat merekomendasikan untuk semua pemula!

STMStudio adalah program yang memungkinkan pemantauan nilai variabel secara real-time di MK.

Sebagai seorang programmer, saya memutuskan untuk menggunakan ST-Link V2 yang murah seharga $ 2,6 .
Semuanya terhubung dengan sangat sederhana. Ambil pinout JTAG,


lihat gambar di ST-Link, dan hubungkan lead (ST-LINK -> JTAG):



  • GND -> Pin 20;
  • 3.3V -> Pin 1;
  • RST -> Pin 15;
  • SWCLC -> Pin 9;
  • SWDIO -> Pin 7.

Jalankan COIDE, tulis
Berkedip
#include "stm32f10x.h"
int main(void)
{
	RCC->APB2ENR |= RCC_APB2Periph_GPIOC; //   
	GPIOC->CRH |= (0x3 << 20); //   50 
	GPIOC->CRH &= (~(0xC << 20)); //      -
	volatile long i = 0;
	while(1)
	{
		GPIOC->BSRR = GPIO_BSRR_BR13;
		for(i = 0; i < 1000*1000*5; i++){;};
		GPIOC->BSRR = GPIO_BSRR_BS13;
		for(i = 0; i < 1000*1000*5; i++){;};
	}
}

, AVR, , 2264 Flash… , AVR .
— 2176 .
STDLIB — 1476 .

kompilasi, flash ... dan semuanya langsung bekerja! Tanpa menari dengan rebana! Bahkan debugger di dalam sirkuit berfungsi! Kami memulai STMStudio - dan berfungsi. Membangun grafik variabel selama operasi MK! Ada jumper di papan, tetapi Anda tidak perlu mengubah apa pun untuk memprogram / memulai MK! Sama seperti dengan Arduino! Yah, itu tidak bisa begitu baik ... tetapi tidak bisa.

Mulailah membuat osiloskop


Dalam mimpi saya, osiloskop harus berfungsi sebagai berikut:
Kedua ADC secara bersamaan memproses sinyal pada kecepatan 1-2 MSPS. 2 pilihan berikutnya:
  1. Semua ini ditransfer secara real time ke PC melalui USB dan ada keputusan yang dibuat tentang apa yang harus dilakukan dengannya (ingat, buat grafik, proseskan entah bagaimana, ...);
  2. . : (, , , ). .

Kedua opsi ini tidak dapat diimplementasikan.
Yang pertama adalah karena saya tidak bisa memulai USB. Sebaliknya, saya hanya bisa menghasilkan proyek di STM32CubeMX. Tetapi setelah mengekspornya ke CoIDE, perlu untuk mengganti bootloader dengan jumper untuk pemrograman / operasi, yang tidak nyaman. Karena itu, saya menolak opsi ini. Nah, di samping itu, kecepatan USB hanya 12 Mb / s. Data dengan kecepatan tinggi secara real time masih tidak cocok. Untuk mentransfer data ke komputer, saya menghubungkan konverter USB <-> UART yang dibeli saat itu untuk pemrograman Arduino Pro Mini. Opsi kedua ditutup karena pengendali interupsi berlangsung lebih lama dari ADC. Kecepatan dibatasi hanya 340-500 kSPS, yang beberapa kali lebih sedikit dari yang diharapkan.





Satu-satunya opsi berkecepatan tinggi yang bekerja ternyata adalah ini: ADC bekerja terus menerus ketika kita perlu mengukur, nyalakan DMA, tunggu buffer untuk mengisi, matikan DMA dan perlahan-lahan transfer data ke PC melalui USART. Opsi ini melampaui semua harapan. MK dapat di-overclock sehingga ternyata 9 MSPS dengan dua ADC! Itu 4,5 kali lebih banyak dari yang tertulis di dokumentasi! Pada saat yang sama, cukup nyaman untuk mengamati sinyal dengan frekuensi hingga 1 MHz. Dibandingkan dengan apa yang kami capai sebelumnya di Arduino (10 kSPS), hasilnya sangat bagus - kecepatannya meningkat 900 kali!

Namun, dengan overclocking, tidak semuanya begitu menyenangkan. Di masa depan, agar USB berfungsi, frekuensi harus dikurangi sebesar 16/9 = 1,8 kali dan kemudian hanya 5 MSPS yang akan diperoleh.

Ketika mencoba berurusan dengan USB dan periferal lain, saya menyadari kelemahan signifikan dari pengontrol ini - hanya ada sedikit informasi di Internet. Jika AVR memiliki banyak segalanya, maka ternyata tidak begitu mudah untuk menemukan contoh operasi simultan dari dua ADC dalam mode interleaved cepat .

Arduino UNO! Dipilih sebagai generator sinyal untuk uji osiloskop. Bukan karena dia baik atau apa ... hanya saja sangat cepat.
Tulis 8 baris:
 void setup() {
  pinMode(2, OUTPUT);  
  long d = 10;
  for(;;){
    PORTD = 255;
    delayMicroseconds(d);
    PORTD = 0;  
    delayMicroseconds(d);
  }
}

void loop() {
  
}


Hubungkan kabel USB + 1 (sehingga STM32 3.3-volt tidak mati dari sinyal 5-volt, sinyal diumpankan melalui resistor 2 kΩ) dan selesai!

Ternyata berikut ini (di bawah setiap gambar ada foto dari sinyal yang sama pada layar osiloskop analog): Periode sinyal 0,9 μs. 1 meter = 10 piksel. Pada osiloskop, 1 divisi = 0,5 μs. Periode sinyal 10 μs. 1 meter = 5 piksel. Pada osiloskop, 1 divisi = 2 μs. Bagian atas terpotong karena sinyal melebihi tegangan referensi ADC.









Apa berikutnya


Dalam rencana:
  1. Kalahkan USB untuk meninggalkan konverter USB <-> USART;
  2. Selesai bagian analog sehingga rentang tegangan input tidak 0 - 3.3 V, tetapi lebih baik;
  3. Buat mode multi-channel;
  4. Terapkan kontrol dari PC;
  5. Buat perangkat jadi dalam case.


Sebagai kesimpulan, saya menarik perhatian pada dua kelemahan STM32 yang terungkap dibandingkan dengan AVR:
  1. Peningkatan konsumsi memori Flash;
  2. Inisialisasi kompleks pinggiran, yang diperburuk oleh kurangnya bahan.


Saya tidak tahu caranya, tetapi untuk tugas yang begitu sederhana, dibutuhkan 31 kB Flash.
Sirkuit papan debug (tidak mudah ditemukan).

Bagian kedua artikel.

Source: https://habr.com/ru/post/id384723/


All Articles