Diketahui bahwa keluarga mikrokontroler STM32F4xx, yang memiliki inti yang cukup produktif yang cukup cocok untuk tugas “non-daging”, DSP tidak memiliki antarmuka input data yang lengkap dengan bus paralel paling sederhana dalam mode “jalur pipa” (data-clk). Setelah merokok dm00037051.pdf, saya menemukan opsi yang tidak spesifik, tetapi pada pandangan pertama, cocok - antarmuka DCMI (antarmuka kamera digital).
Tentu saja, penggunaan mikrokontroler STM32 untuk DSP klasik yang dimuat (FIR, IIR, FFT) bukanlah pilihan yang optimal, tetapi jika kartu tiba-tiba berbaring dan kemampuan mikrokontroler ini masih cukup, ditambah Anda memerlukan cukup banyak antarmuka kecepatan rendah. Tentang ini di bawah luka.
Pada salah satu proyek dengan tenggat waktu dan anggaran "panas", ada kebutuhan untuk mengimplementasikan "sepotong besi" dengan yang optimal: massa, dimensi, konsumsi. Sebagai fungsi dasar, diperlukan pemrosesan sinyal digital (penyaringan dan analisis statistik), yang berasal dari ADC dalam mode real-time lunak. Untuk pemrosesan, saya ingin memiliki floating point presisi tunggal. Sinyal dari ADC diterima pada frekuensi menengah 48 MHz. Pita sinyal 1 MHz. Untuk mengimplementasikan transfer spektrum sinyal dari frekuensi menengah ke nol, lebih disukai menggunakan subsampling dari broadband ADC. Juga, perlu untuk menerima dan mengirimkan informasi melalui Ethernet, SPI, UART, I2C dan bekerja dengan interupsi.
Tenggat waktu implementasi dan fungsi DSP tertentu tidak memungkinkan penggunaan FPGA untuk tujuan ini. Dengan prosesor sinyal keluarga Blackfin yang terkenal, Perangkat Analog yang terkenal tidak memiliki pengalaman komunikasi dan tidak ada alat debugging dan papan demo di dekat akses. Hanya ada pengalaman komunikasi yang dekat dan panjang dengan prosesor DSP unggulan ADSP-TS201 TigerSHARC yang mahal. Selain itu, Blackfin tidak memiliki implementasi perangkat keras IEEE-754. Juga, perlu untuk menerima blok data terus menerus dengan ADC 128 KB, ditambah 30 KB memproses overhead dan tanpa memori eksternal, sulit untuk mendorong semuanya menjadi sesuatu yang lebih murah.
Secara umum, hanya ada papan STM32F407 (Discovery dan kebiasaan dari Cina) yang tersedia. Seperti yang saya duga, banyak yang berurusan dengan topik terkait sekarang memiliki bantuan universal. Ada juga papan ADA-HSMC Terasic tempat AD9228 ADC dual-channel dipasang (12-bit, Fd = 65 msps, bandwidth = 315 MHz).
Opsi yang tidak spesifik, tetapi cukup cocok adalah antarmuka DCMI (antarmuka kamera digital), yang merupakan perangkat keras yang diimplementasikan dalam STM32F4.
Pengoperasian antarmuka ini dijelaskan dalam RM0090, DocID018909, p. 454/1718. Empat angka berikut diberikan dari dokumen ini.
Jadi, frekuensi input yang diklaim hingga 54 MHz. Yang cukup - tingkat sub-sampling kami adalah 10 MHz. Berikut adalah set sinyal antarmuka DCMI yang digunakan:

Catatan: D13, D14 hanya tersedia dalam paket 144-pin. Kami memiliki 100 pin, tetapi kami tidak membutuhkannya. (meskipun Perangkat Analog memiliki 14 bit ADC - AD9248 yang serupa).
Berikut ini adalah diagram waktu antarmuka secara umum:

Dan ini adalah diagram waktu antarmuka dalam mode format bingkai JPEG:

Kami akan menggunakan mode operasi ini sebagai dia cocok untuk kita.
Dalam mode ini, sinyal VSYNC ditarik ke daya. Kami akan menggunakan HSYNC sebagai sinyal eksternal untuk memungkinkan dimulainya penerimaan data melalui antarmuka.
Kami menggunakan mikrokontroler STM32F407RGT6 dalam paket LQFP100.
AD9238 ADC memiliki input untuk mode shutdown (hemat daya) dari saluran yang sesuai PDWN_A (B), dan izin keluarannya adalah OEB_A (B). Adalah logis untuk mendapatkannya dari pin pengontrol. Hasilnya, diagram koneksi pin akan terlihat seperti ini:

Karena ADC ini tidak memiliki sinyal clock output, maka perlu menggunakan multiply (clock buffer). Kami menggunakan LMK00101 dari Texas Instruments - nilai bagus untuk harga, jitter rendah, dan yang paling penting, sekali lagi - ada di tangan).
Dalam pemrosesan, kami memperhitungkan bahwa data pada bus paralel ADC muncul dengan penundaan 7 siklus per jam relatif terhadap sinyal jam input.
Kami akan menerima data (tentu saja) melalui DMA. Berikut adalah kode sumber untuk menginisialisasi DCMI dan DMA.
Kami menyalakan clocking port yang kami butuhkan, DCMI dan DMA2
GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD, ENABLE); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
Pin ini (PA5) akan mensimulasikan pembagian ke dalam frame - HSYNC. Inisialisasi saat keluar
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA, GPIO_Pin_5);
Konfigurasikan pin yang sesuai dalam mode DCMI
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);
Hal yang paling menarik di sini adalah mengkonfigurasi DCMI dalam mode yang sesuai dengan bingkai JPEG.
DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Embedded; DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising; DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_Low; DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High; DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_12b;
Pengaturan DMA
DCMI_Init(&DCMI_InitStructure); DMA_InitStructure.DMA_Channel = DMA_Channel_1; DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;
Pengaturan menyela di akhir penerimaan data dari saluran DMA yang sesuai
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Kode penangan kami, di mana kami mematikan penerimaan data DCMI dan menetapkan tanda siap data.
void EXTI1_IRQHandler() { EXTI_ClearFlag(EXTI_Line1); DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1); DMA_Cmd(DMA2_Stream1, DISABLE); DCMI_Cmd(DISABLE); dma_recv_f = 1;
Semuanya dengan pengaturan. Sekarang kita menghidupkan saluran DMA kita, blok DCMI, kita mulai menerima data DCMI dalam mode bingkai JPEG.
/* Enable DMA transfer */ DMA_Cmd(DMA2_Stream1, ENABLE); /* Enable DCMI interface */ DCMI_Cmd(ENABLE); /* Start Image capture */ DCMI_CaptureCmd(ENABLE); DCMI_JPEGCmd(ENABLE);
Siklus program utama. Di sini, polling bendera dan restart penerimaan data.
uint8_t dma_recv_f = 0;
Catatan: jika Anda perlu menerima dan memproses data dalam waktu nyata dengan buffering ganda, stm32f4 memiliki mekanisme interupsi ketika setengah buffer penuh. Dalam pengaturan DMA maka perlu mengatur mode siklus kontinu dari penerimaan data. Sebagai contoh:
Dalam interrupt handler, maka perlu untuk mereset bit akhir DMA hanya setelah mengisi seluruh buffer, dan program pengguna untuk menunjukkan jumlah buffer saat ini di mana penerimaan data telah berakhir. Sesuatu seperti ini:
if(DMA_GetITStatus(DMA2_Stream1,DMA_IT_TCIF1)){ DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF1); num_buf = 1; } else{ num_buf = 0; }
Pada dasarnya itulah yang diperlukan untuk menerima data dari ADC kami melalui DCMI.
Sayangnya, saat ini saya tidak dapat mendemonstrasikan seluruh mekanisme ini secara langsung. potongan besi sudah sekitar 3 tahun beroperasi))). Saya hanya bisa membawa data pendaftaran tes yang disimpan dari waktu-waktu itu.
Berikut adalah sinyal harmonik dari generator SMB100A pada frekuensi 48,001 MHz, sama dengan IF kami dengan offset 1 KHz:

Dan ini adalah spektrumnya:

Untuk memeriksa kinerja maksimum pada kabel papan tempat memotong roti standar dengan panjang sekitar 200 mm, yang terhubung dengan ADA-HSMC dan STM32F4 Discovery, data yang benar diterima pada frekuensi clock 40 MHz.
Pada papan "asli" yang diproduksi untuk tugas ini, melalui kabel datar sepanjang 100 mm, pada suhu kamar, ternyata menaikkan frekuensi pengambilan sampel hingga maksimum 54 MHz.
Pada frekuensi sampling 10 MHz yang diinginkan, kinerja diuji pada rentang industri: dari -40 hingga +60.
Sebenarnya semuanya. Terima kasih atas perhatian anda!