Perpustakaan Periferi Standard. Di sana lagi: USB dengan penimbalan berganda. Menggunakan coretan dalam perkembangan anda sendiri

Apabila mencipta aplikasi pertama anda pada mikropengawal STM32, anda boleh menggunakan beberapa cara. Yang pertama, klasik, kami mengambil huraian tepat pengawal di laman web www.st.com, yang muncul di bawah nama "Manual Rujukan" dan membaca perihalan daftar persisian. Kemudian kami cuba merakamnya dan melihat cara peranti berfungsi. Membaca dokumen ini sangat berguna, tetapi pada peringkat pertama menguasai mikropengawal, anda boleh menolak ini, pelik kerana ia mungkin kelihatan. Jurutera STMicroelectronics telah menulis perpustakaan pemandu persisian standard. Lebih-lebih lagi, mereka telah menulis banyak contoh penggunaan pemacu ini, yang boleh mengurangkan pengaturcaraan aplikasi anda kepada menekan kekunci Ctrl+C dan Ctrl+V, diikuti dengan pengeditan sedikit contoh menggunakan pemacu untuk memenuhi keperluan anda. Oleh itu, menyambungkan perpustakaan pemacu persisian ke projek anda ialah kaedah kedua untuk membina aplikasi. Sebagai tambahan kepada kelajuan menulis, terdapat kelebihan lain kaedah ini: kesejagatan kod dan penggunaan perpustakaan proprietari lain, seperti USB, Ethernet, kawalan pemacu, dll., yang disediakan dalam kod sumber dan penggunaan pemacu persisian standard. Terdapat juga kelemahan kaedah ini: Di ​​mana anda boleh bertahan dengan satu baris kod, pemacu persisian STM32 standard akan menulis 10. Pustaka persisian itu sendiri juga disediakan dalam bentuk fail sumber, jadi anda boleh mengesan bit yang mana daftar diubah oleh fungsi ini atau itu. Jika anda mahu, anda boleh beralih daripada kaedah kedua untuk menulis atur cara kepada yang pertama dengan mengulas sebahagian daripada kod yang menggunakan perpustakaan standard dengan anda sendiri, yang secara langsung mengawal daftar persisian. Hasil daripada tindakan ini, anda akan mendapat dalam kelajuan kawalan, jumlah RAM dan ROM, tetapi akan kalah dalam serba boleh kod. Walau apa pun, jurutera Promelektronika mengesyorkan menggunakan perpustakaan peranti standard sekurang-kurangnya pada peringkat pertama.

Kesukaran terbesar menanti pemaju apabila menyambungkan perpustakaan ke projeknya. Jika anda tidak tahu bagaimana untuk melakukan ini, anda boleh menghabiskan banyak masa untuk aktiviti ini, yang bercanggah dengan idea menggunakan pemandu yang sudah siap. Bahan ini dikhaskan untuk menyambungkan perpustakaan standard kepada mana-mana keluarga STM32.

Setiap keluarga STM32 mempunyai perpustakaan peranti standard sendiri. Ini disebabkan oleh fakta bahawa pinggiran itu sendiri berbeza. Sebagai contoh, pinggiran pengawal STM32L mempunyai fungsi penjimatan kuasa sebagai salah satu tugasnya, yang memerlukan penambahan fungsi kawalan. Contoh klasik ialah ADC, yang dalam STM32L mempunyai keupayaan untuk mematikan perkakasan sekiranya ketiadaan arahan penukaran yang lama - salah satu akibat daripada tugas penjimatan tenaga. ADC pengawal keluarga STM32F tidak mempunyai fungsi sedemikian. Sebenarnya, disebabkan kehadiran perbezaan perkakasan dalam peranti, kami mempunyai perpustakaan pemacu yang berbeza. Sebagai tambahan kepada perbezaan yang jelas dalam fungsi pengawal, terdapat peningkatan dalam peranti. Oleh itu, perkakasan keluarga pengawal yang dikeluarkan kemudian mungkin lebih bijak dan mudah. Sebagai contoh, persisian pengawal STM32F1 dan STM32F2 mempunyai perbezaan dalam kawalan. Pada pendapat penulis, menguruskan peranti STM32F2 adalah lebih mudah. Dan jelas sebabnya: keluarga STM32F2 dikeluarkan kemudian dan ini membolehkan pembangun mengambil kira beberapa nuansa. Sehubungan itu, untuk keluarga ini terdapat perpustakaan kawalan persisian individu. Idea di sebalik perkara di atas adalah mudah: pada halaman mikropengawal yang akan anda gunakan, terdapat perpustakaan persisian yang sesuai untuknya.

Walaupun terdapat perbezaan dalam peranti dalam keluarga, pemandu menyembunyikan 90% perbezaan dalam diri mereka sendiri. Sebagai contoh, fungsi konfigurasi ADC yang dinyatakan di atas kelihatan sama untuk semua keluarga:

batal ADC_Init(ADC_Nom, ADC_Param),

di mana ADC_Nom ialah nombor ADC dalam bentuk ADC1, ADC2, ADC3, dsb.

ADC_Param – penunjuk struktur data, bagaimana ADC harus dikonfigurasikan (apa yang harus dimulakan, berapa banyak saluran untuk didigitalkan, sama ada untuk melakukannya secara kitaran, dll.)

10% daripada perbezaan keluarga, dalam contoh ini, yang perlu diperbetulkan apabila berpindah dari satu keluarga STM32 ke keluarga yang lain, tersembunyi dalam struktur ADC_Param. Bergantung pada keluarga, bilangan medan dalam struktur ini mungkin berbeza-beza. Bahagian umum mempunyai sintaks yang sama. Oleh itu, memindahkan permohonan untuk satu keluarga STM32, yang ditulis berdasarkan perpustakaan persisian standard, kepada yang lain adalah sangat mudah. Dari segi penyejagatan penyelesaian pada mikropengawal, STMicroelectronics tidak dapat dinafikan!

Jadi, kami memuat turun perpustakaan untuk STM32 yang kami gunakan. Apa yang akan datang? Seterusnya, kita perlu membuat projek dan menyambungkan fail yang diperlukan kepadanya. Mari kita lihat mencipta projek menggunakan persekitaran pembangunan Meja Kerja Terbenam IAR sebagai contoh. Lancarkan persekitaran pembangunan dan pergi ke tab "Projek", pilih item "Buat projek" untuk membuat projek:

Dalam projek baharu yang muncul, masukkan tetapan dengan menuding kursor pada nama projek, mengklik kanan dan memilih "Pilihan" daripada menu lungsur:

Kawasan memori RAM dan ROM:

Apabila anda mengklik butang "Simpan", persekitaran akan menawarkan untuk merakam fail baharu penerangan pengawal ke folder projek. Penulis mengesyorkan membuat fail *.icp individu untuk setiap projek dan menyimpannya dalam folder projek.

Jika anda akan menyahpepijat projek anda dalam litar, yang disyorkan, kemudian masukkan jenis penyahpepijat yang digunakan:

Pada tab penyahpepijat yang dipilih, kami menunjukkan antara muka untuk menyambungkan penyahpepijat (dalam kes kami, ST-Link dipilih) kepada pengawal:



Mulai saat ini, projek kami tanpa perpustakaan sedia untuk disusun dan dimuatkan ke dalam pengawal. Persekitaran lain seperti Keil uVision4, Resonance Ride7, dsb. akan memerlukan langkah yang sama.

Jika anda menulis baris dalam fail main.c:

#include "stm32f10x.h" atau

#include "stm32f2xx.h" atau

#include "stm32f4xx.h" atau

#include "stm32l15x.h" atau

#include "stm32l10x.h" atau

#include "stm32f05x.h"

menunjukkan lokasi fail ini, atau menyalin fail ini ke folder projek, maka beberapa kawasan memori akan dikaitkan dengan daftar persisian keluarga yang sepadan. Fail itu sendiri terletak dalam folder perpustakaan persisian standard dalam bahagian: \CMSIS\CM3\DeviceSupport\ST\STM32F10x (atau nama yang serupa untuk keluarga lain). Mulai sekarang, anda menggantikan alamat daftar persisian dalam bentuk nombor dengan namanya. Walaupun anda tidak berhasrat untuk menggunakan fungsi perpustakaan standard, adalah disyorkan untuk membuat sambungan sedemikian.

Jika anda akan menggunakan gangguan dalam projek anda, adalah disyorkan untuk memasukkan fail permulaan dengan sambungan *.s, yang terletak di laluan \CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar, atau serupa untuk keluarga lain. Adalah penting untuk ambil perhatian bahawa setiap persekitaran mempunyai fail sendiri. Oleh itu, jika kita menggunakan IAR EWB, kita mesti mengambil fail dari folder IAR. Ini disebabkan oleh sedikit perbezaan dalam sintaks persekitaran. Oleh itu, agar projek dimulakan dengan segera, jurutera STMicroelectronics menulis beberapa versi fail permulaan untuk beberapa persekitaran pembangunan yang paling popular. Kebanyakan keluarga STM32 mempunyai satu fail. Keluarga STM32F1 mempunyai beberapa fail pencetus:

  • startup_stm32f10x_cl.s – untuk mikropengawal STM32F105/107
  • startup_stm32f10x_xl.s - untuk mikropengawal STM32F101/STM32F103 768kb dan banyak lagi
  • startup_stm32f10x_hd.s - untuk mikropengawal STM32F101/STM32F103 dengan memori Flash 256-512 kB
  • startup_stm32f10x_md.s - untuk mikropengawal STM32F101/ STM32F102/STM32F103 dengan memori Denyar 64-128 kB
  • startup_stm32f10x_ld.s - untuk mikropengawal STM32F101/ STM32F102/STM32F103 dengan memori Flash kurang daripada 64 kB
  • startup_stm32f10x_hd_vl.s untuk mikropengawal STM32F100 dengan memori Flash 256-512 kB
  • startup_stm32f10x_md_vl.s untuk mikropengawal STM32F100 dengan memori Flash 64-128 kB
  • startup_stm32f10x_ld_vl.s untuk mikropengawal STM32F100 dengan memori Flash 32kb atau kurang

Jadi, bergantung pada keluarga, subkeluarga dan persekitaran pembangunan, kami menambah fail pelancaran pada projek:

Di sinilah mikropengawal berakhir apabila program bermula. Sampukan memanggil SystemInit() dan kemudian __iar_program_start dalam urutan. Fungsi kedua menetapkan semula atau menulis lebih awal tetapkan nilai pembolehubah global, selepas itu ia pergi ke program pengguna main(). Fungsi SystemInit() mengkonfigurasi jam mikropengawal. Dialah yang menjawab soalan:

  • Adakah saya perlu bertukar kepada kristal luaran (HSE)?
  • Bagaimana untuk mendarab frekuensi daripada HSI/HSE?
  • Adakah perlu untuk menyambung baris gilir beban arahan?
  • Apakah kelewatan yang diperlukan semasa memuatkan arahan (disebabkan oleh kelajuan rendah memori Flash)
  • Bagaimana untuk membahagikan masa bagi bas persisian?
  • Adakah kod itu perlu diletakkan dalam RAM luaran?

Fungsi SystemInit() boleh ditulis secara manual dalam projek anda. Jika anda mereka bentuk fungsi ini sebagai kosong, maka pengawal akan beroperasi pada pengayun RC dalaman dengan frekuensi kira-kira 8 MHz (bergantung pada jenis keluarga). Pilihan 2 – sambungkan kepada projek fail system_stm32f10x.c (atau nama yang serupa bergantung pada jenis keluarga yang digunakan), yang terletak dalam pustaka di sepanjang laluan: Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x. Fail ini mengandungi fungsi SystemInit(). Beri perhatian kepada kekerapan kristal luaran HSE_VALUE. Parameter ini ditetapkan dalam fail pengepala stm32f10x.h. Nilai standard ialah 8 dan 25 MHz, bergantung pada keluarga STM32. Tugas utama fungsi SystemInit() adalah untuk menukar jam kepada kuarza luaran dan mendarab frekuensi ini dengan cara tertentu. Apa yang berlaku jika nilai HSE_VALUE ditentukan sebagai 8 MHz, teras harus ditala pada 72 MHz, tetapi sebenarnya papan mempunyai kristal 16 MHz? Akibat daripada tindakan yang tidak betul tersebut, teras akan menerima jam 144 MHz, yang mungkin berada di luar operasi sistem yang dijamin pada STM32. Itu. apabila menyambungkan fail system_stm32f10x.c, anda perlu menentukan nilai HSE_VALUE. Semua ini bermakna bahawa fail system_stm32f10x.c, system_stm32f10x.h dan stm32f10x.h (atau nama serupa untuk keluarga lain) mestilah individu untuk setiap projek. DAN

Jurutera STMicroelectronics telah mencipta Alat Konfigurasi Jam, yang membolehkan anda mengkonfigurasi jam sistem dengan betul. Ini ialah fail Excel yang menjana fail system_stm32xxx.c (nama yang serupa untuk keluarga keluarga tertentu) selepas menentukan parameter input dan output sistem. Mari kita lihat operasinya menggunakan keluarga STM32F4 sebagai contoh.

Pilihan: pengayun RC dalaman, pengayun RC dalaman dengan pendaraban frekuensi, atau kuarza luaran dengan pendaraban frekuensi. Selepas memilih sumber jam, kami memasukkan parameter konfigurasi sistem yang dikehendaki, seperti kekerapan input (apabila menggunakan kuarza luaran), kekerapan jam teras, pembahagi frekuensi jam bas persisian, operasi penimbal pengambilan arahan dan lain-lain. Dengan mengklik pada butang "Jana", kami mendapat tetingkap


Termasuk fail system_stm32f4xx.c dan analognya akan memerlukan penyambungan fail perpustakaan persisian standard yang lain. Untuk mengawal masa, terdapat satu set keseluruhan fungsi yang dipanggil daripada fail system_stm32xxxxxx.c. Fungsi ini terletak dalam fail stm32f10x_rcc.c dan pengepalanya. Sehubungan itu, apabila menyambungkan fail system_stm32xxxxxx.c ke projek, adalah perlu untuk memasukkan stm32f10x_rcc.c, jika tidak, pemaut persekitaran akan melaporkan ketiadaan perihalan fungsi dengan nama RCC_xxxxxxx. Fail yang ditentukan terletak dalam pustaka persisian di laluan: Libraries\STM32F10x_StdPeriph_Driver\src, dan pengepalanya ialah \Libraries\STM32F10x_StdPeriph_Driver\inc.

Fail pengepala pemacu persisian disertakan dalam fail stm32f10x_conf.h, yang dirujuk oleh stm32f10x.h. Fail stm32f10x_conf.h hanyalah satu set fail pengepala untuk pemacu bagi persisian pengawal tertentu untuk disertakan dalam projek. Pada mulanya, semua pengepala "#include" ditandakan sebagai ulasan. Menyambungkan fail pengepala persisian melibatkan penyahkomen nama fail yang sepadan. Dalam kes kami, ini ialah baris #include "stm32f10x_rcc.h". Jelas sekali, fail stm32f10x_conf.h adalah individu untuk setiap projek, kerana projek yang berbeza menggunakan peranti yang berbeza.

Dan satu perkara terakhir. Anda perlu menentukan beberapa arahan kepada prapemproses pengkompil dan laluan ke fail pengepala.



Laluan ke fail pengepala mungkin berbeza, bergantung pada lokasi perpustakaan persisian berbanding dengan folder projek, tetapi kehadiran "USE_STDPERIPH_DRIVER" adalah wajib apabila menyambungkan pemacu persisian perpustakaan standard.

Jadi, kami telah menyambungkan perpustakaan standard kepada projek itu. Selain itu, kami menyambungkan salah satu pemacu persisian standard kepada projek, yang mengawal jam sistem.

Kami mempelajari rupa struktur perpustakaan dari dalam, kini beberapa perkataan tentang rupa struktur perpustakaan dari luar.



Oleh itu, menyambungkan fail pengepala stm32f10x.h dalam aplikasi memerlukan penyambungan fail pengepala lain dan fail kod. Sebahagian daripada yang ditunjukkan dalam rajah diterangkan di atas. Beberapa perkataan tentang yang lain. Fail STM32F10x_PPP.x ialah fail pemacu persisian. Contoh menyambungkan fail sedemikian ditunjukkan di atas; ini ialah RCC - periferi kawalan jam sistem. Jika kita ingin menyambungkan pemacu peranti lain, maka nama fail yang disambungkan diperoleh dengan menggantikan "PPP" dengan nama persisian, contohnya, ADC - STM32F10x_ADC.c, atau port I/O STM32F10x_GPIO.c, atau DAC - STM32F10x_DAC.c. Secara amnya, ia secara intuitif jelas fail mana yang perlu disambungkan apabila menyambungkan persisian tertentu. Fail "misc.c", "misc.h" pada asasnya adalah sama dengan STM32F10x_PPP.x, tetapi ia hanya mengawal kernel. Contohnya, menyediakan vektor gangguan, yang dibina ke dalam kernel, atau menguruskan pemasa SysTick, yang merupakan sebahagian daripada kernel. Fail xxxxxxx_it.c menerangkan vektor sampukan tidak bertopeng pengawal. Mereka boleh ditambah dengan vektor gangguan persisian. Fail core_m3.h menerangkan teras CortexM3. Teras ini diseragamkan dan boleh didapati dalam mikropengawal daripada pengeluar lain. Untuk penyejagatan merentas platform, STMicroelectronics berusaha untuk mencipta perpustakaan teras CortexM yang berasingan, selepas itu ARM menyeragamkannya dan mengedarkannya kepada pengeluar mikropengawal lain. Jadi peralihan kepada STM32 daripada pengawal daripada pengeluar lain dengan teras CortexM akan menjadi sedikit lebih mudah.

Jadi, kita boleh menyambungkan perpustakaan persisian standard kepada mana-mana keluarga STM32. Orang yang belajar cara melakukan ini akan menerima hadiah: pengaturcaraan mikropengawal yang sangat mudah. Sebagai tambahan kepada pemacu dalam bentuk fail sumber, perpustakaan mengandungi banyak contoh penggunaan peranti peranti. Sebagai contoh, mari pertimbangkan untuk mencipta projek yang melibatkan output perbandingan pemasa. Dengan pendekatan tradisional, kami akan mengkaji dengan teliti perihalan daftar peranti ini. Tetapi sekarang kita boleh mengkaji teks program yang sedang berjalan. Kami pergi ke folder contoh persisian standard, yang terletak di sepanjang laluan ProjectSTM32F10x_StdPeriph_Examples. Berikut ialah folder contoh dengan nama peranti yang digunakan. Pergi ke folder "TIM". Pemasa dalam STM32 mempunyai banyak fungsi dan tetapan, jadi adalah mustahil untuk menunjukkan keupayaan pengawal dengan hanya satu contoh. Oleh itu, dalam direktori yang ditentukan terdapat banyak contoh penggunaan pemasa. Kami berminat dengan penjanaan isyarat PWM oleh pemasa. Pergi ke folder "7PWM_Output". Di dalamnya terdapat penerangan program dalam bahasa Inggeris dan satu set fail:

main.c stm32f10x_conf.h stm32f10x_it.h stm32f10x_it.c system_stm32f10x.c

Jika projek tidak mengalami gangguan, maka kandungan itu terletak sepenuhnya dalam fail main.c. Salin fail ini ke direktori projek. Setelah menyusun projek, kami akan menerima program untuk STM32 yang akan mengkonfigurasi pemasa dan port I/O untuk menjana 7 isyarat PWM daripada pemasa 1. Seterusnya, kami boleh menyesuaikan kod yang telah ditulis kepada tugas kami. Contohnya, kurangkan bilangan isyarat PWM, tukar kitaran tugas, arah pengiraan, dsb. Fungsi dan parameternya diterangkan dengan baik dalam fail stm32f10x_stdperiph_lib_um.chm. Nama-nama fungsi dan parameternya mudah dikaitkan dengan tujuannya untuk mereka yang tahu sedikit bahasa Inggeris. Untuk kejelasan, berikut adalah sebahagian daripada kod contoh:

/* Konfigurasi Asas Masa */ TIM_TimeBaseStructure.TIM_Prescaler = 0; // tiada prapilihan bagi mengira denyutan (daftar 16-bit) TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // mengira arah naik TIM_TimeBaseStructure.TIM_Period = TimerPeriod; // mengira sehingga nilai TimerPeriod (malar dalam atur cara) TIM_TimeBaseStructure.TIM_ClockDivision = 0; // tiada pembahagian pra-kaunter TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // kaunter limpahan untuk menjana acara (tidak digunakan dalam program) TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // memasukkan nilai TimeBaseStructure ke dalam daftar pemasa 1 (memasukkan data ke dalam ini // pembolehubah di atas) /* Konfigurasi Saluran 1, 2,3 dan 4 dalam mod PWM */ // menyediakan output PWM TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // Mod pengendalian PWM2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // dayakan output isyarat pemasa PWM TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; // dayakan output pemasa PWM pelengkap TIM_OCInitStructure.TIM_Pulse = Channel1Pulse; // lebar nadi Channel1Pulse – malar dalam program TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // menetapkan kekutuban keluaran TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; // menetapkan kekutuban keluaran pelengkap TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; // menetapkan keadaan selamat keluaran PWM TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; // menetapkan keadaan selamat keluaran PWM pelengkap TIM_OC1Init(TIM1, &TIM_OCInitStructure); // memasukkan nilai pembolehubah TIM_OCInitStructure ke dalam daftar PWM saluran 1 // pemasa 1 TIM_OCInitStructure.TIM_Pulse = Channel2Pulse; // tukar lebar nadi dalam pembolehubah OCInitStructure dan masukkannya dalam TIM_OC2Init(TIM1, &TIM_OCInitStructure); // mendaftar saluran PWM 2 pemasa1 TIM_OCInitStructure.TIM_Pulse = Channel3Pulse; // tukar lebar nadi dalam pembolehubah OCInitStructure dan masukkannya dalam TIM_OC3Init(TIM1, &TIM_OCInitStructure); // mendaftar saluran PWM 3 pemasa1 TIM_OCInitStructure.TIM_Pulse = Channel4Pulse; // tukar lebar nadi dalam pembolehubah OCInitStructure dan masukkannya dalam TIM_OC4Init(TIM1, &TIM_OCInitStructure); // mendaftar saluran PWM 4 pemasa1 /* pembilang TIM1 dayakan */ TIM_Cmd(TIM1, ENABLE); // mula pemasa1 /* TIM1 Output Utama Dayakan */ TIM_CtrlPWMOutputs(TIM1, ENABLE); // membolehkan operasi pemasa 1 output perbandingan

Di sebelah kanan, penulis meninggalkan komen dalam bahasa Rusia untuk setiap baris program. Jika kita membuka contoh yang sama dalam perihalan fungsi perpustakaan stm32f10x_stdperiph_lib_um.chm, kita akan melihat bahawa semua parameter fungsi yang digunakan mempunyai pautan ke penerangan sendiri, di mana nilai kemungkinan mereka akan ditunjukkan. Fungsi itu sendiri juga mempunyai pautan ke penerangan dan kod sumber mereka sendiri. Ini sangat berguna kerana... Mengetahui apa yang fungsi fungsi, kita boleh mengesan bagaimana ia melakukannya, yang bit daftar persisian dan bagaimana ia mempengaruhi. Ini, pertama, satu lagi sumber maklumat untuk menguasai pengawal, berdasarkan penggunaan praktikal pengawal. Itu. anda tentukan dahulu masalah teknikal, dan kemudian kaji penyelesaian itu sendiri. Kedua, ini adalah medan untuk mengoptimumkan program bagi mereka yang tidak berpuas hati dengan perpustakaan dari segi kelajuan dan jumlah kod.



Apabila anda baru sahaja memulakan pengaturcaraan mikropengawal atau sudah lama tidak melakukan pengaturcaraan, tidak mudah untuk memahami kod orang lain. Soalan "Apakah ini?" dan "Dari manakah ini datang?" muncul pada hampir setiap gabungan huruf dan nombor. Dan semakin cepat pemahaman logik "apa? kenapa? dan di mana?" datang, lebih mudah untuk mengkaji kod orang lain, termasuk contoh. Benar, kadang-kadang untuk ini anda perlu "melompat melalui kod" dan "melihat melalui manual" selama lebih daripada satu hari.

Semua mikropengawal STM32F4xx mempunyai banyak persisian. Setiap peranti persisian mikropengawal diberikan kawasan memori khusus, khusus dan tidak boleh dipindahkan. Setiap kawasan memori terdiri daripada daftar memori, dan daftar ini boleh menjadi 8-bit, 16-bit, 32-bit, atau sesuatu yang lain, bergantung pada mikropengawal. Dalam mikropengawal STM32F4, daftar ini adalah 32-bit dan setiap daftar mempunyai tujuan sendiri dan alamat khususnya sendiri. Tiada apa-apa yang menghalang anda daripada mengaksesnya secara langsung dalam program anda dengan menunjukkan alamatnya. Di alamat mana daftar ini atau itu terletak dan peranti persisian yang dimilikinya ditunjukkan dalam kad memori. Untuk STM32F4 kad memori seperti itu terdapat dalam dokumen DM00031020.pdf, yang boleh didapati di st.com. Dokumen itu dipanggil

RM0090
Manual rujukan
STM32F405xx/07xx, STM32F415xx/17xx, STM32F42xxx dan STM32F43xxx termaju berasaskan ARM 32-bit MCU

Dalam bab 2.3 Peta ingatan pada halaman 64 jadual bermula dengan alamat kawasan daftar dan kaitannya dengan peranti persisian. Dalam jadual yang sama terdapat pautan ke bahagian dengan peruntukan memori yang lebih terperinci untuk setiap peranti.

Jadual di sebelah kiri menunjukkan julat alamat, di tengah ialah nama persisian, dan di lajur terakhir adalah tempat perihalan peruntukan memori yang lebih terperinci terletak.

Jadi untuk port I/O tujuan am GPIO dalam jadual peruntukan memori anda boleh mendapati bahawa alamat diperuntukkan untuk mereka bermula dari 0x4002 0000. Port I/O tujuan umum GPIOA menduduki julat alamat dari 0x4002 000 hingga 0x4002 03FF. Port GPIOB menduduki julat alamat 0x4002 400 - 0x4002 07FF. Dan sebagainya.

Untuk melihat pengedaran yang lebih terperinci dalam julat itu sendiri, anda hanya perlu mengikuti pautan.

Terdapat juga jadual di sini, tetapi dengan peta memori untuk julat alamat GPIO. Menurut peta ingatan ini, 4 bait pertama tergolong dalam daftar MODER, 4 bait seterusnya tergolong dalam daftar OTYPER, dan seterusnya. Alamat daftar dikira dari permulaan julat yang dimiliki oleh port GPIO tertentu. Iaitu, setiap daftar GPIO mempunyai alamat tertentu yang boleh digunakan semasa membangunkan program untuk mikropengawal.

Tetapi menggunakan alamat daftar menyusahkan manusia dan penuh dengan sejumlah besar ralat. Oleh itu, pengeluar mikropengawal mencipta perpustakaan standard yang memudahkan kerja dengan mikropengawal. Dalam perpustakaan ini, alamat fizikal dipadankan dengan mereka penetapan surat. Untuk STM32F4xx surat-menyurat ini dinyatakan dalam fail stm32f4xx.h. Fail stm32f4xx.h kepunyaan perpustakaan CMSIS dan terletak dalam folder Libraries\CMSIS\ST\STM32F4xx\Include\.

Mari lihat bagaimana port GPIOA ditakrifkan dalam perpustakaan. Segala-galanya ditentukan sama. Ia cukup untuk memahami prinsipnya. Fail stm32f4xx.h agak besar dan oleh itu lebih baik untuk menggunakan carian atau keupayaan yang disediakan oleh rantai alat anda.

Untuk port GPIOA, kami dapati baris yang menyebut GPIOA_BASE

GPIOA_BASE ditakrifkan melalui AHB1PERIPH_BASE

AHB1PERIPH_BASE pula ditakrifkan melalui PERIPH_BASE

Dan seterusnya, PERIPH_BASE ditakrifkan sebagai 0x4000 0000. Jika anda melihat peta pengedaran memori peranti persisian (dalam bahagian 2.3 Peta ingatan pada halaman 64), kita akan melihat alamat ini di bahagian paling bawah jadual. Daftar semua persisian mikropengawal STM32F4 bermula dari alamat ini. Iaitu, PERIPH_BASE ialah alamat permulaan seluruh pinggiran mikropengawal STM32F4xx secara amnya, dan mikropengawal STM32F407VG khususnya.

AHB1PERIPH_BASE ditakrifkan sebagai jumlah (PERIPH_BASE + 0x00020000). (lihat gambar belakang). Ini akan menjadi alamat 0x4002 0000. Dalam kad memori, port input/output GPIO tujuan umum bermula pada alamat ini.

GPIOA_BASE ditakrifkan sebagai (AHB1PERIPH_BASE + 0x0000), iaitu, ia adalah alamat permulaan kumpulan daftar port GPIOA.

Nah, port GPIOA itu sendiri ditakrifkan sebagai struktur daftar, penempatan yang dalam memori bermula dengan alamat GPIOA_BASE (lihat baris #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE).

Struktur setiap port GPIO ditakrifkan sebagai GPIO_TypeDef.

Oleh itu, perpustakaan standard, dalam dalam kes ini fail stm32f4xx.h, hanya memanusiakan pengalamatan mesin. Jika anda melihat entri GPIOA->ODR = 1234, maka ini bermakna nombor 1234 akan ditulis ke alamat 0x40020014. GPIOA mempunyai alamat permulaan 0x40020000 dan daftar ODR mempunyai alamat 0x14 dari permulaan julat, jadi GPIOA->ODR mempunyai alamat 0x40020014.

Atau, sebagai contoh, anda tidak menyukai masukan GPIOA->ODR, maka anda boleh menentukan #define GPIOA_ODR ((uint32_t *) 0x40020014) dan dapatkan hasil yang sama dengan menulis GPIOA_ODR = 1234;. Tetapi betapa suai manfaatnya ini? Jika anda benar-benar ingin memperkenalkan sebutan anda sendiri, maka lebih baik untuk menetapkan semula yang standard. Anda boleh melihat bagaimana ini dilakukan dalam fail stm32f4_discovery.h Sebagai contoh, ini adalah cara salah satu LED ditakrifkan di sana:

#define LED4_PIN GPIO_Pin_12
#define LED4_GPIO_PORT GPIOD
#define LED4_GPIO_CLK RCC_AHB1Periph_GPIOD

Lagi Penerangan terperinci pinggiran pelabuhan terletak di stm32f4xx_gpio.h

Interaksi kod pengguna dengan daftar teras dan pinggir mikropengawal STM32 boleh dijalankan dalam dua cara: menggunakan perpustakaan standard atau menggunakan set coretan (petunjuk perisian). Pilihan di antara mereka bergantung pada kelantangan ingatan sendiri pengawal, kelajuan yang diperlukan, tarikh akhir pembangunan. Artikel ini menganalisis ciri struktur, kelebihan dan keburukan set coretan untuk mikropengawal keluarga STM32F1 dan STM32L0 yang dihasilkan oleh STMicroelectronics.

Salah satu kelebihan menggunakan mikropengawal STMicroelectronics ialah pelbagai alat pembangunan: dokumentasi, papan pembangunan, perisian.

Perisian untuk STM32 termasuk perisian proprietari yang dihasilkan oleh STMicroelectronics, sumber Sumber Terbuka dan perisian komersial.

Perisian STMicroelectronics mempunyai kelebihan penting. Pertama sekali, ia tersedia untuk muat turun percuma. Kedua, perpustakaan perisian dibentangkan dalam bentuk kod sumber - pengguna boleh mengubah suai kod itu sendiri, dengan mengambil kira sekatan kecil yang diterangkan dalam perjanjian lesen.

Perpustakaan STMicroelectronics mematuhi ANSI-C dan boleh dibahagikan mengikut tahap abstraksi (Rajah 1):

  • CMSIS (Lapisan Akses Periferal Teras) – tahap daftar teras dan persisian, perpustakaan ARM;
  • Lapisan Abstraksi Perkakasan – perpustakaan peringkat rendah: perpustakaan persisian standard, set coretan;
  • Middleware – perpustakaan peringkat pertengahan: OS masa nyata (RTOS), sistem fail, USB, TCP/IP, Bluetooth, Paparan, ZigBee, Penderiaan Sentuh dan lain-lain;
  • Medan Aplikasi - perpustakaan peringkat permohonan: audio, kawalan enjin, penyelesaian automotif dan perindustrian.

Rajah 1 menunjukkan bahawa untuk berinteraksi dengan tahap CMSIS, STMicroelectronics menawarkan penggunaan dua alat utama - perpustakaan standard dan coretan.

Pustaka standard ialah satu set pemacu. Setiap pemacu menyediakan pengguna dengan fungsi dan definisi untuk bekerja dengan blok persisian tertentu (SPI, USART, ADC, dan sebagainya). Pengguna tidak berinteraksi secara langsung dengan daftar peringkat CMSIS.

Set coretan sangat berkesan contoh pengaturcaraan, menggunakan akses terus kepada daftar CMSIS. Pembangun perisian boleh menggunakan pelaksanaan fungsi daripada contoh ini dalam kod mereka sendiri.

Setiap kaedah mempunyai kelebihan dan kekurangan. Pilihan antara mereka dibuat dengan mengambil kira jumlah FLASH dan RAM yang ada, kelajuan yang diperlukan, tempoh pembangunan, pengalaman pengaturcara dan keadaan lain.

Tahap CMSIS

Mikropengawal ialah cip digital-analog kompleks yang terdiri daripada teras pemproses, memori, unit persisian, bas digital dan sebagainya. Interaksi dengan setiap blok berlaku menggunakan daftar.

Dari sudut pandangan pengaturcara, mikropengawal mewakili ruang ingatan. Ia mengandungi bukan sahaja RAM, FLASH dan EEPROM, tetapi juga daftar program. Setiap daftar perkakasan sepadan dengan sel memori. Oleh itu, untuk menulis data ke daftar atau menolak nilainya, pengaturcara perlu mengakses lokasi yang sepadan dalam ruang alamat.

Seseorang mempunyai beberapa keanehan persepsi. Sebagai contoh, nama simbolik dilihat olehnya lebih baik daripada alamat sel memori. Ini amat ketara apabila sejumlah besar sel digunakan. Dalam mikropengawal ARM, bilangan daftar, dan oleh itu sel yang digunakan, melebihi seribu. Untuk membuat perkara lebih mudah, adalah perlu untuk menentukan petunjuk simbolik. Penentuan ini dibuat di peringkat CMSIS.

Contohnya, untuk menetapkan keadaan pin port A, anda perlu menulis data ke daftar GPIOA_ODR. Ini boleh dilakukan dalam dua cara - gunakan penuding dengan alamat sel 0xEBFF FCFF dengan offset 0x14 atau gunakan penuding dengan nama simbolik GPIOA dan struktur siap pakai yang mentakrifkan offset. Jelas sekali, pilihan kedua lebih mudah difahami.

CMSIS melaksanakan fungsi lain juga. Ia dilaksanakan sebagai kumpulan fail berikut:

  • startup_stm32l0xx.s mengandungi kod permulaan pemasang untuk Cortex-M0+ dan jadual vektor gangguan. Selepas permulaan permulaan selesai, kawalan dipindahkan terlebih dahulu ke fungsi SystemInit() (penjelasan akan diberikan di bawah), dan kemudian ke fungsi utama int main(void);
  • stm32l0xx.h mengandungi definisi yang diperlukan untuk melaksanakan operasi bit asas dan definisi jenis mikropemproses yang digunakan;
  • system_stm32l0xx.c/.h. Selepas permulaan permulaan, fungsi SystemInit() dilaksanakan. Dia menghasilkan persediaan awal persisian sistem, pemasaan blok RCC;
  • stm32l0yyxx.h – fail pelaksanaan untuk mikropengawal tertentu (contohnya, stm32l051xx.h). Di dalamnya penunjuk aksara, struktur data, pemalar bit dan ofset ditakrifkan.

Interaksi dengan CMSIS. Perpustakaan dan coretan standard

Bilangan daftar untuk mikropengawal STM32 dalam kebanyakan model melebihi seribu. Jika anda menggunakan akses terus ke daftar, kod pengguna akan menjadi tidak boleh dibaca dan tidak boleh digunakan sepenuhnya untuk sokongan dan pemodenan. Masalah ini boleh diselesaikan dengan menggunakan perpustakaan persisian standard.

Pustaka persisian standard ialah satu set pemacu peringkat rendah. Setiap pemandu menyediakan pengguna dengan satu set fungsi untuk bekerja dengan unit persisian. Dengan cara ini pengguna menggunakan fungsi dan bukannya mengakses daftar secara langsung. Dalam kes ini, tahap CMSIS disembunyikan daripada pengaturcara (Rajah 2a).

nasi. 2. Interaksi dengan CMSIS menggunakan perpustakaan standard (a) dan coretan (b)

Sebagai contoh, interaksi dengan port I/O dalam STM32L0 dilaksanakan menggunakan pemacu yang dibuat dalam bentuk dua fail: stm32l0xx_hal_gpio.h dan stm32l0xx_hal_gpio.c. stm32l0xx_hal_gpio.h menyediakan takrif asas jenis dan fungsi, dan stm32l0xx_hal_gpio.c menyediakan pelaksanaannya.

Pendekatan ini mempunyai kelebihan yang jelas (Jadual 1):

  • Penciptaan kod pantas. Pengaturcara tidak perlu mengkaji senarai daftar. Dia segera mula bekerja di peringkat yang lebih tinggi. Contohnya, untuk terus bersambung dengan port I/O pada STM32L0, anda mesti tahu dan boleh mengendalikan sebelas daftar kawalan/status, yang kebanyakannya mempunyai sehingga 32 bit boleh dikonfigurasikan. Apabila menggunakan pemacu perpustakaan, ia cukup untuk menguasai lapan fungsi.
  • Kesederhanaan dan kejelasan kod. Kod pengguna tidak tersumbat dengan nama daftar, ia boleh telus dan mudah dibaca, yang penting apabila bekerja dengan pasukan pembangunan.
  • Tahap abstraksi yang tinggi. Apabila menggunakan perpustakaan standard, kod tersebut ternyata agak bebas platform. Sebagai contoh, jika anda menukar mikropengawal STM32L0 kepada mikropengawal STM32F0, beberapa kod yang berfungsi dengan port I/O tidak perlu ditukar sama sekali.

Jadual 1. Perbandingan kaedah pelaksanaan kod tersuai

Parameter perbandingan Apabila menggunakan standard
perpustakaan pinggiran
Apabila menggunakan set coretan
Saiz kod purata minimum
kos RAM purata minimum
Prestasi purata maksimum
Kebolehbacaan kod cemerlang rendah
Tahap kebebasan platform purata pendek
Kepantasan penciptaan program tinggi rendah

Kehadiran shell tambahan dalam bentuk pemacu juga mempunyai kelemahan yang jelas (Jadual 1):

  • Meningkatkan jumlah kod program. Fungsi yang dilaksanakan dalam kod perpustakaan memerlukan ruang memori tambahan.
  • Peningkatan kos RAM disebabkan oleh peningkatan dalam bilangan pembolehubah tempatan dan penggunaan struktur data yang besar.
  • Prestasi berkurangan disebabkan peningkatan overhed apabila memanggil fungsi perpustakaan.

Kehadiran kelemahan inilah yang membawa kepada fakta bahawa pengguna sering terpaksa mengoptimumkan kod - melaksanakan fungsi secara bebas untuk berinteraksi dengan CMSIS, mengoptimumkan fungsi perpustakaan dengan mengalih keluar semua perkara yang tidak perlu, menyalin pelaksanaan fungsi perpustakaan terus ke dalam kod mereka, gunakan arahan __INLINE untuk meningkatkan kelajuan pelaksanaan. Akibatnya, ia telah dibelanjakan Masa tambahan untuk menambah baik kod.

STMicroelectronics, bertemu dengan pembangun separuh jalan, telah mengeluarkan koleksi coretan STM32SnippetsF0 dan STM32SnippetsL0.

Coretan disertakan dalam kod pengguna (Rajah 2b).

Menggunakan coretan memberikan kelebihan yang jelas:

  • meningkatkan kecekapan dan kelajuan kod;
  • mengurangkan skop program;
  • Mengurangkan jumlah RAM yang digunakan dan beban pada timbunan.

Walau bagaimanapun, perlu diperhatikan kelemahan:

  • mengurangkan kesederhanaan dan kejelasan kod kerana "pencemarannya" dengan nama daftar dan pelaksanaan bebas fungsi peringkat rendah;
  • hilangnya kebebasan platform.

Jadi pilihan antara perpustakaan standard dan coretan tidak jelas. Dalam kebanyakan kes, ia patut dibincangkan bukan tentang persaingan, tetapi tentang penggunaan bersama mereka. hidup peringkat awal untuk membina kod "cantik" dengan cepat, adalah logik untuk menggunakan pemacu standard. Jika pengoptimuman perlu, anda boleh beralih kepada coretan siap sedia supaya tidak membuang masa membangunkan fungsi optimum anda sendiri.

Perpustakaan standard pemacu dan coretan STM32F0 dan STM32L0 (Jadual 2) tersedia untuk muat turun percuma di tapak web www.st.com.

Jadual 2. Perpustakaan peringkat rendah untuk STM32F10 dan STM32L0

Perkenalan yang lebih rapat dengan coretan, seperti mana-mana perisian, harus bermula dengan mempertimbangkan ciri-ciri perjanjian lesen.

Perjanjian Lesen

Mana-mana pengaturcara yang bertanggungjawab sebelum menggunakan pihak ketiga produk perisian belajar dengan teliti perjanjian Lesen. Walaupun fakta bahawa koleksi coretan yang dihasilkan oleh ST Microelectronics tidak memerlukan pelesenan dan tersedia untuk muat turun percuma, ini tidak bermakna tiada sekatan ke atas penggunaannya.

Perjanjian lesen disertakan dengan semua produk yang boleh dimuat turun secara percuma yang dikeluarkan oleh STMicroelectronics. Selepas memuat turun STM32SnippetsF0 dan STM32SnippetsL0 dalam direktori akar adalah mudah untuk mencari dokumen Perjanjian Lesen MCD-ST Liberty SW V2.pdf, yang memperkenalkan pengguna kepada peraturan untuk menggunakan perisian ini.

Folder Projek mengandungi subdirektori dengan contoh untuk unit persisian tertentu, projek siap sedia untuk ARM Keil dan EWARM, serta fail main.c.

Pelancaran dan ciri menggunakan set coretan STM32SnippetF0 dan STM32SnippetL0

Ciri khas set coretan ini ialah pergantungan platform mereka. Mereka direka untuk berfungsi dengan papan tertentu. STM32SnippetsL0 menggunakan papan Penemuan STM32L053 dan STM32SnippetsF0 menggunakan papan Penemuan STM32F072.

Apabila menggunakan papan proprietari, kod dan reka bentuk mesti diubah suai, ini akan dibincangkan dengan lebih terperinci dalam bahagian terakhir.

Untuk menjalankan contoh, anda perlu melengkapkan beberapa langkah:

  • jalankan projek siap dari direktori dengan contoh yang diperlukan. Untuk memudahkan, anda boleh menggunakan projek siap sedia untuk persekitaran ARM Keil atau EWARM, masing-masing terletak dalam folder MDK-ARM\ dan EWARM\;
  • hidupkan kuasa ke papan pembangunan STM32L053 Discovery/STM32F072 Discovery;
  • Sambungkan bekalan kuasa papan nyahpepijat ke PC menggunakan kabel USB. Terima kasih kepada penyahpepijat ST-Link/V2 terbina dalam, tiada pengaturcara tambahan diperlukan;
  • buka, konfigurasi dan jalankan projek;
    • Untuk ARM Keil:
      • projek terbuka;
      • menyusun projek – Projek → Bina semula semua fail sasaran;
      • muatkannya ke dalam pengawal – Nyahpepijat → Mula/Hentikan Sesi Nyahpepijat;
      • jalankan program dalam tetingkap Debug → Run (F5).
    • Untuk EWARM:
      • projek terbuka;
      • menyusun projek – Projek → Bina semula semua;
      • muatkannya ke dalam pengawal – Projek → Nyahpepijat;
      • jalankan program dalam tetingkap Debug → Go (F5).
  • menjalankan ujian mengikut algoritma yang diterangkan dalam utama.c.

Untuk menganalisis kod program, pertimbangkan contoh khusus daripada STM32SnippetsL0: Projects\LPUART\01_WakeUpFromLPM\.

Menjalankan contoh untuk LPUART

Satu ciri tersendiri mikropengawal baharu keluarga STM32L0 berdasarkan teras Cortex-M0+ ialah keupayaan perubahan dinamik penggunaan disebabkan oleh sejumlah besar inovasi. Salah satu daripada inovasi ini ialah penampilan persisian Kuasa Rendah: pemasa LPTIM 16-bit dan transceiver LPUART. Blok ini mempunyai keupayaan mencatat masa yang tidak bergantung pada masa bas persisian APB utama. Jika perlu, kurangkan penggunaan kuasa kekerapan operasi Bas APB (PCLK) boleh dikurangkan, dan pengawal itu sendiri boleh ditukar kepada mod penggunaan rendah. Pada masa yang sama, persisian Kuasa Rendah terus beroperasi pada prestasi maksimum.

Mari kita pertimbangkan contoh daripada direktori Projects\LPUART\01_WakeUpFromLPM\, yang mempertimbangkan kemungkinan operasi bebas LPUART dalam mod penggunaan rendah.

Apabila membuka projek dalam persekitaran ARM Keil, hanya tiga fail dipaparkan: startup_stm32l053xx.s, system_stm32l0xx.c dan main.c (Rajah 4). Jika pustaka standard digunakan, adalah perlu untuk menambah fail pemacu pada projek.

Fungsi dan analisis struktur fail Main.c

Program contoh yang dipilih dilaksanakan dalam beberapa peringkat.

Selepas permulaan, fungsi SystemInit(), dilaksanakan dalam system_stm32l0xx.c, dilancarkan. Ia mengkonfigurasi parameter blok jam RCC (masa dan frekuensi operasi). Seterusnya, kawalan dipindahkan ke fungsi utama int main(void). Ia memulakan peranti peranti pengguna - port input/output, LPUART - selepas itu pengawal ditukar kepada mod penggunaan rendah STOP. Di dalamnya, pinggiran dan teras biasa dihentikan, hanya LPUART yang berfungsi. Ia menunggu permulaan pemindahan data dari peranti luaran. Apabila bit permulaan tiba, LPUART membangunkan sistem dan menerima mesej. Penerimaan disertai dengan kelipan LED papan nyahpepijat. Selepas ini, pengawal ditukar kembali ke keadaan STOP dan menunggu pemindahan data seterusnya jika tiada ralat dikesan.

Pemindahan data berlaku menggunakan port COM maya dan perisian tambahan.

Mari lihat main.c daripada projek kami. Fail ini ialah fail C standard. Ciri utamanya ialah dokumentasi diri - kehadiran ulasan, penjelasan dan cadangan terperinci. Bahagian penerangan mengandungi beberapa bahagian:

  • tajuk yang menunjukkan nama fail, versi, tarikh, pengarang, dan penjelasan ringkas tentang tujuan;
  • perihalan urutan penyediaan peranti sistem (ciri khusus RCC): FLASH, RAM, bekalan kuasa dan sistem jam, bas persisian dan sebagainya;
  • senarai sumber mikropengawal yang digunakan (MCU Resources);
  • penerangan ringkas penggunaan contoh ini(Cara menggunakan contoh ini);
  • penerangan ringkas tentang menguji contoh dan algoritma untuk pelaksanaannya (Bagaimana untuk menguji contoh ini).

Fungsi int main(void) mempunyai bentuk padat dan dilengkapi dengan ulasan, yang dalam Penyenaraian 1, untuk lebih jelas, diterjemahkan ke dalam bahasa Rusia.

Penyenaraian 1. Contoh pelaksanaan fungsi utama

int utama (tidak sah)
{
/* Menjelang permulaan pelaksanaan bahagian ini, apabila unit sistem telah dikonfigurasikan dalam fungsi SystemInit(), dilaksanakan dalam system_stm32l0xx.c. */
/* konfigurasi unit persisian */
Configure_GPIO_LED();
Configure_GPIO_LPUART();
Configure_LPUART();
Configure_LPM_Stop();
/* semak ralat semasa penerimaan */
manakala (!error) /* kitaran yang tidak berkesudahan */
{
/* tunggu LPUART bersedia dan tukar ke mod STOP */
if((LPUART1->ISR & USART_ISR_REACK) == USART_ISR_REACK)
{
__WFI();
}
}
/* apabila ralat berlaku */
SysTick_Config(2000); /* menetapkan tempoh gangguan pemasa sistem kepada 1 ms */
manakala(1);
}

Fail main.c mengisytiharkan dan mentakrifkan fungsi konfigurasi persisian dan dua fungsi pengendalian gangguan. Mari kita pertimbangkan ciri-ciri mereka.

Contoh di bawah menggunakan empat fungsi konfigurasi (Penyenaraian 2). Mereka semua tidak mempunyai hujah dan tidak mengembalikan nilai. Tujuan utama mereka adalah untuk dengan cepat dan dengan jumlah kod paling sedikit yang diperlukan untuk memulakan peranti. Ini dicapai melalui dua ciri: penggunaan akses terus kepada daftar dan penggunaan arahan __INLINE (Penyenaraian 3).

Penyenaraian 2. Mengisytiharkan fungsi konfigurasi persisian

void Configure_GPIO_LED(void);
void Configure_GPIO_LPUART(void);
void Configure_LPUART(void);
void Configure_LPM_Stop(void);

Penyenaraian 3. Contoh pelaksanaan fungsi __INLINE dengan akses terus kepada daftar LPUART

INLINE void Configure_LPUART(void)
{
/* (1) Dayakan jam antara muka kuasa */
/* (2) Lumpuhkan daftar perlindungan sandaran untuk membenarkan akses kepada domain jam RTC */
/* (3) LSE pada */
/* (4) Tunggu LSE sedia */
/* (5) Dayakan daftar perlindungan sandaran untuk membenarkan akses kepada domain jam RTC */
/* (6) LSE dipetakan pada LPUART */
/* (7) Dayakan jam persisian LPUART */
/* Konfigurasikan LPUART */
/* (8) pensampelan berlebihan sebanyak 16, 9600 baud */
/* (9) 8 bit data, 1 bit mula, 1 bit henti, tiada pariti, mod penerimaan, mod henti */
/* (10) Tetapkan keutamaan untuk LPUART1_IRQn */
/* (11) Dayakan LPUART1_IRQn */
RCC->APB1ENR |= (RCC_APB1ENR_PWREN); /* (1) */
PWR->CR |= PWR_CR_DBP; /* (2) */
RCC->CSR |= RCC_CSR_LSEON; /* (3) */
manakala ((RCC->CSR & (RCC_CSR_LSERDY)) != (RCC_CSR_LSERDY)) /*(4)*/
{
/* tambah masa di sini untuk aplikasi yang mantap */
}
PWR->CR &=~ PWR_CR_DBP; /* (5) */
RCC->CCIPR |= RCC_CCIPR_LPUART1SEL; /* (6) */
RCC->APB1ENR |= RCC_APB1ENR_LPUART1EN; /*(7) */
LPUART1->BRR = 0x369; /* (8) */
LPUART1->CR1 = USART_CR1_UESM | USART_CR1_RXNEIE | USART_CR1_RE | USART_CR1_UE; /* (9) */
NVIC_SetPriority(LPUART1_IRQn, 0); /* (10) */
NVIC_EnableIRQ(LPUART1_IRQn); /* (sebelas) */
}

Pengendali sampukan dari pemasa sistem dan dari LPUART juga menggunakan akses terus ke daftar.

Oleh itu, komunikasi dengan CMSIS dijalankan tanpa perpustakaan standard. Kod tersebut ternyata padat dan sangat cekap. Walau bagaimanapun, kebolehbacaannya akan merosot dengan ketara disebabkan oleh banyaknya akses kepada daftar.

Menggunakan coretan dalam perkembangan anda sendiri

Set coretan yang dicadangkan mempunyai had: adalah perlu untuk menggunakan papan Penemuan STM32L053 untuk STM32SnippetsL0 dan papan Penemuan STM32F072 untuk STM32SnippetsF0.

Untuk menggunakan coretan dalam perkembangan anda, anda perlu membuat beberapa perubahan. Pertama, anda perlu mengkonfigurasi semula projek ke pemproses yang diperlukan. Untuk melakukan ini, anda perlu menukar fail permulaan startup_stm32l053xx.s kepada fail pengawal lain dan tentukan pemalar yang diperlukan: STM32L051xx, STM32L052xx, STM32L053xx, STM32L062xx, STM32L063xx, STM32L063xx, STM32L051xx, STM32L052xx, STM32L053xx, STM32L062xx, STM32L063xx, STM32L063xx, STM32L061xx, STM32L061Fxx, STM32L061Fxx 51 dan lain-lain. Selepas ini, apabila menyusun stm32l0xx.h, fail yang diperlukan dengan definisi peranti pengawal stm32l0yyxx.h (stm32l051xx.h/stm32l052xx.h/stm32l053xx.h/stm32l061xx.h/stm32l051xx.h/stm32l052xx.h/stm32l053xx.h/stm32l061xx.h/stm32l061xx.h/stm32l061xx.h/stm32l061xx.h/stm32l061xx.h/stm32l061xx.h/stm32l061dm. Kedua, anda perlu memilih pengaturcara yang sesuai dalam tetapan sifat projek. Ketiga, tukar kod fungsi daripada contoh jika ia tidak memenuhi keperluan aplikasi pengguna.

Kesimpulan

Set coretan dan perpustakaan persisian standard yang dihasilkan oleh ST Microelectronics tidak saling eksklusif. Mereka saling melengkapi, menambah fleksibiliti semasa membuat aplikasi.

Pustaka standard membolehkan anda mencipta kod yang jelas dengan tahap abstraksi yang tinggi.

Coretan membolehkan anda meningkatkan kecekapan kod - meningkatkan produktiviti dan mengurangkan jejak kod anda. Memori FLASH dan RAM.

kesusasteraan

  1. Ringkas data. STM32SnippetF0. Pakej perisian tegar STM32F0xx Snippet. Rev. 1. – ST Mikroelektronik, 2014.
  2. Ringkas data. STM32SnippetL0. Pakej perisian tegar STM32F0xx Snippet. Rev. 1. – ST Mikroelektronik, 2014.
  3. Perjanjian Lesen MCD-ST Liberty SW V2.pdfGeganti Elektromekanikal. Informasi teknikal. – ST Mikroelektronik, 2011.
  4. Ringkas data. 32L0538DISCOVERY Discovery kit untuk mikropengawal STM32L053. Rev. 1. – ST Mikroelektronik, 2014.
  5. http://www.st.com/.
Mengenai ST Microelectronics

Jadi, kami sudah kembali berdiri, dalam erti kata bahawa kami mempunyai semua yang kami perlukan disambungkan ke pin mikropengawal pada papan Penemuan STM32VL, kami telah belajar bercakap dalam bahasa pengaturcaraan C, sudah tiba masanya untuk mencipta projek untuk Gred pertama.

Menulis program

Setelah selesai membuat dan mengkonfigurasi projek, anda boleh mula menulis program sebenar. Seperti biasa untuk semua pengaturcara, program pertama yang ditulis untuk berfungsi pada komputer ialah program yang memaparkan tulisan "HelloWorld" pada skrin, dan untuk semua mikropengawal, program pertama untuk mikropengawal menghasilkan LED berkelip. Kami tidak akan terkecuali daripada tradisi ini dan akan menulis program yang akan mengawal LED LD3 pada papan Penemuan STM32VL.

Selepas mencipta projek kosong dalam IAR, ia menghasilkan kod program minimum:

Kini program kami akan sentiasa "berpusing" dalam satu gelung sementara.

Untuk kita mengawal LED, kita perlu mendayakan masa port yang disambungkan dan mengkonfigurasi output sepadan port mikropengawal. Seperti yang kita bincangkan sebelum ini dalam bahagian pertama, untuk membenarkan port clocking DENGAN sedikit jawapan IOPCEN mendaftar RCC_APB2ENR. Menurut dokumen " RM0041Rujukanmanual.pdf»untuk mendayakan masa bas pelabuhan DENGAN diperlukan dalam daftar RCC_APB2ENR set sedikit IOPCEN seunit. Supaya apabila memasang diberi sedikit, kami belum menetapkan semula set lain dalam daftar ini, kami perlu menggunakan operasi penambahan logik (logik “ATAU”) kepada keadaan semasa daftar dan kemudian tulis nilai yang terhasil ke dalam kandungan daftar. Selaras dengan struktur perpustakaan ST, akses kepada nilai daftar untuk membaca dan menulis dilakukan melalui penunjuk kepada struktur RCC-> APB2 ENR. Oleh itu, mengingat semula bahan dari bahagian kedua, anda boleh menulis kod berikut yang menetapkan bit IOPCEN dalam daftar RCC_APB2ENR:

Seperti yang anda boleh lihat daripada fail "stm32f10x.h", nilai bit IOPCEN ditakrifkan sebagai 0x00000010, yang sepadan dengan bit keempat ( IOPCEN) mendaftar APB2ENR dan sepadan dengan nilai yang ditunjukkan dalam lembaran data.

Sekarang mari kita konfigurasikan output dengan cara yang sama 9 pelabuhan DENGAN. Untuk melakukan ini, kita perlu mengkonfigurasi pin port ini untuk mengeluarkan dalam mod push-pull. Daftar bertanggungjawab untuk menetapkan mod input/output port GPIOC_CRH, kami telah melihatnya, penerangannya juga terdapat dalam bahagian "7.2.2 Port konfigurasi tinggi daftar" dalam lembaran data. Untuk menetapkan output kepada mod output prestasi maksimum 2MHz, diperlukan dalam daftar GPIOC_CRH pasang MODE9 kepada satu dan set semula bit MODE9 kepada sifar. Bit bertanggungjawab untuk menetapkan mod operasi output sebagai fungsi utama dengan output tolak-tarik CNF9 Dan CNF9 , untuk mengkonfigurasi mod pengendalian yang kami perlukan, kedua-dua bit ini mesti ditetapkan semula kepada sifar.

Sekarang pin port yang LED disambungkan ditetapkan kepada output, untuk mengawal LED kita perlu menukar keadaan pin port dengan menetapkan output kepada logik. Terdapat dua cara untuk menukar keadaan pin port, yang pertama ialah menulis terus ke status port mendaftarkan kandungan yang diubah daftar port, sama seperti kami mengkonfigurasi port. Kaedah ini tidak disyorkan kerana kemungkinan situasi di mana nilai yang salah mungkin ditulis ke daftar port. Situasi ini boleh berlaku jika semasa perubahan dalam keadaan daftar, dari saat keadaan daftar telah dibaca dan sehingga saat keadaan yang diubah ditulis pada daftar, peranti persisian atau gangguan akan mengubah keadaan port itu. Setelah selesai operasi untuk menukar keadaan daftar, nilai akan ditulis ke daftar tanpa mengambil kira perubahan yang telah berlaku. Walaupun kemungkinan keadaan ini berlaku adalah sangat rendah, ia masih berbaloi menggunakan kaedah lain di mana situasi yang diterangkan dikecualikan. Untuk tujuan ini, terdapat dua daftar dalam mikropengawal GPIOx_BSRR Dan GPIOx_BRR. Apabila menulis logik kepada bit daftar yang diperlukan GPIOx_BRR pin port yang sepadan akan ditetapkan semula kepada sifar logik. Daftar GPIOx_BSRR boleh melakukan kedua-dua tetapan dan tetapan semula keadaan pin port; untuk menetapkan pin port kepada unit logik, adalah perlu untuk menetapkan bit BSN, sepadan dengan bilangan bit yang diperlukan, bit ini terletak dalam daftar rendah bait. Untuk menetapkan semula keadaan output port kepada sifar logik, anda perlu menulis bit BRn pin yang sepadan, bit ini terletak dalam bit yang paling penting dalam daftar port.

LED LD3 disambungkan ke pin 9 pelabuhan DENGAN. Untuk menghidupkan LED ini, kita perlu menggunakan satu logik pada pin port yang sepadan untuk "menyalakan" LED.

Mari tambah kod untuk menyediakan output port LED pada program kami, dan juga menambah fungsi kelewatan perisian untuk mengurangkan kekerapan pensuisan LED:

//Jangan lupa masukkan fail pengepala yang menerangkan daftar mikropengawal

#include "stm32f10x.h"

batal kelewatan ( batal);

batal kelewatan ( batal)
{
panjang tidak ditandatangani i;
untuk(i=0; i<2000000; i++);
}

//Fungsi utama kami

batal utama ( batal)
{


RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

//kosongkan bit MODE9 (set semula bit MODE9_1 dan MODE9_0 kepada sifar)
GPIOC->CRH &= ~GPIO_CRH_MODE9;

//Tetapkan bit MODE9_1 untuk mengkonfigurasi output kepada output dengan kelajuan 2MHz
GPIOC->CRH |= GPIO_CRH_MODE9_1;

//kosongkan bit CNF (ditetapkan sebagai output tujuan umum, simetri (tolak-tarik))
GPIOC->CRH &= ~GPIO_CRH_CNF9;

sementara(1)
{

//Menetapkan pin 9 port C kepada yang logik ("menyalakan" LED)
GPIOC->BSRR = GPIO_BSRR_BS9;


Kelewatan();


GPIOC->BSRR = GPIO_BSRR_BR9;


Kelewatan();

}
}

Anda boleh memuat turun arkib dengan kod sumber program yang ditulis menggunakan kawalan terus daftar mikropengawal dari pautan.

Program pertama kami yang boleh dilaksanakan telah ditulis; semasa menulisnya, untuk mengendalikan dan mengkonfigurasi peranti, kami menggunakan data daripada lembaran data rasmi " RM0041Rujukanmanual.pdf», sumber ini maklumat tentang daftar mikropengawal adalah yang paling tepat, tetapi untuk menggunakannya anda perlu membaca semula banyak maklumat, yang merumitkan menulis program. Untuk memudahkan proses menyediakan peranti mikropengawal, terdapat pelbagai penjana kod; utiliti rasmi dari syarikat ST ialah program Microxplorer, tetapi ia masih mempunyai sedikit fungsi dan atas sebab ini, pemaju pihak ketiga telah mencipta program alternatif " Penjana Kod Program STM32” » . Program ini membolehkan anda mendapatkan kod tetapan persisian dengan mudah menggunakan visual yang mudah GUI(lihat Rajah 2).


nasi. 2 Tangkapan skrin program penjana kod STM32

Seperti yang dapat dilihat dari Rajah 2, kod konfigurasi output LED yang dijana oleh program bertepatan dengan kod yang kami tulis sebelum ini.

Untuk menjalankan program bertulis selepas menyusun kod sumber, kita perlu memuatkan atur cara kita ke dalam mikropengawal dan melihat bagaimana ia berjalan.

Video mod penyahpepijatan program berkelip LED

Video program berkelip LED pada papan Penemuan STM32VL

Fungsi perpustakaan untuk bekerja dengan peranti

Untuk memudahkan kerja dengan menyediakan daftar persisian mikropengawal, syarikat ST telah membangunkan perpustakaan, terima kasih kepada penggunaannya, anda tidak perlu membaca lembaran data dengan teliti, kerana apabila menggunakan perpustakaan ini, kerja menulis program akan menjadi lebih dekat dengan menulis program tahap tinggi, kerana semua fungsi peringkat rendah dilaksanakan di peringkat fungsi perpustakaan. Walau bagaimanapun, seseorang tidak sepatutnya meninggalkan sepenuhnya penggunaan kerja langsung dengan daftar mikropengawal, kerana fungsi perpustakaan memerlukan lebih banyak masa pemproses untuk pelaksanaannya, dan akibatnya, penggunaannya dalam bahagian masa kritikal program tidak wajar. Namun, dalam kebanyakan kes, perkara seperti memulakan peranti tidak penting untuk masa pelaksanaan, dan kemudahan menggunakan fungsi perpustakaan adalah lebih diutamakan.

Sekarang mari tulis program kami menggunakan perpustakaan ST. Program ini memerlukan penyediaan port input/output; untuk menggunakan fungsi perpustakaan untuk menyediakan port, anda perlu menyambungkan fail pengepala " stm32f10x_gpio.h"(lihat jadual. 1). Fail ini boleh disambungkan dengan menyahkomen baris yang sepadan dalam fail konfigurasi pengepala yang disambungkan " stm32f10x_conf.h" Pada akhir fail " stm32f10x_gpio.h» terdapat senarai pengisytiharan fungsi untuk bekerja dengan port. Penerangan terperinci semua fungsi yang ada boleh dibaca dalam fail " stm32f10x_stdperiph_lib_um.chm», Penerangan Ringkas yang paling biasa digunakan diberikan dalam Jadual 2.

Jadual 2. Penerangan mengenai fungsi konfigurasi port utama

Fungsi

Perihalan fungsi, parameter yang diluluskan dan dikembalikan

GPIO_DeInit(
GPIO_TypeDef* GPIOx)

Menetapkan daftar konfigurasi port GPIOx kepada nilai lalainya.

GPIO_Init(
GPIO_TypeDef* GPIOx,

Menetapkan daftar konfigurasi port GPIOx mengikut parameter yang ditentukan dalam struktur GPIO_InitStruct

GPIO_StructInit(
GPIO_InitTypeDef* GPIO_InitStruct)

Mengisi semua medan struktur GPIO_InitStruct dengan nilai lalai

uint8_t GPIO_ReadInputDataBit(
GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin);

Membaca nilai input pin GPIO_Pin port GPIOx

uint16_t GPIO_ReadInputData (
GPIO_TypeDef* GPIOx)

Membaca nilai input semua pin port GPIOx

GPIO_SetBits(
GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin)

Menetapkan nilai output pin GPIO_Pin port GPIOx kepada logik

GPIO_ResetBits(
GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin)

Menetapkan semula nilai output pin GPIO_Pin port GPIOx kepada sifar logik

GPIO_WriteBit(
GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin,
BitAction BitVal)

Menulis nilai BitVal pada pin GPIO_Pin port GPIOx

GPIO_Write(
GPIO_TypeDef* GPIOx,
uint16_t PortVal)

Tulis nilai PortVal ke port GPIOx

Seperti yang dapat dilihat dari huraian fungsi, sebagai parameter untuk tetapan port, dll., tidak banyak parameter individu yang berbeza dihantar ke fungsi, tetapi satu struktur. Struktur ialah data gabungan yang mempunyai beberapa hubungan logik. Tidak seperti tatasusunan, struktur boleh mengandungi data jenis yang berbeza. Dengan kata lain, struktur mewakili satu set pembolehubah yang berbeza dengan pelbagai jenis, digabungkan menjadi satu pembolehubah unik. Pembolehubah yang terletak dalam struktur ini dipanggil medan struktur, dan ia diakses dengan cara berikut: mula-mula tulis nama struktur, kemudian tulis titik dan nama medan struktur (nama pembolehubah dalam struktur ini).

Senarai pembolehubah yang disertakan dalam struktur untuk fungsi yang bekerja dengan port diterangkan dalam fail yang sama sedikit di atas perihalan fungsi. Jadi, sebagai contoh, struktur " GPIO_InitTypeDef" Ia ada struktur berikut:

struct typedef
{

uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
Parameter ini boleh menjadi sebarang nilai @ref GPIO_pins_define */

GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
Parameter ini boleh menjadi nilai @ref GPIOSpeed_TypeDef */

GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
Parameter ini boleh menjadi nilai @ref GPIOMode_TypeDef */

)GPIO_InitTypeDef;

Medan pertama struktur ini mengandungi pembolehubah " GPIO_ Pin" taip tidak ditandatangani pendek, dalam pembolehubah ini adalah perlu untuk merekodkan bendera nombor pin yang sepadan yang mana tetapan yang diperlukan sepatutnya dibuat. Anda boleh mengkonfigurasi beberapa output sekaligus dengan menentukan beberapa pemalar sebagai parameter menggunakan operator bitwise ATAU(cm. ). ATAU bitwise akan "mengumpul" semua yang daripada pemalar yang disenaraikan, dan pemalar itu sendiri adalah topeng yang hanya bertujuan untuk kegunaan sedemikian. Takrif makro pemalar disenaraikan dalam fail yang sama di bawah.

Medan kedua struktur " GPIO_InitTypeDef» menetapkan kelajuan maksimum yang mungkin bagi output port. Senarai nilai yang mungkin untuk medan ini disenaraikan di atas:

Penerangan tentang nilai yang mungkin:

  • GPIO_Mode_AIN- input analog (Bahasa Inggeris: INput Analog);
  • GPIO_Mod_IN_FLOATING- input tanpa mengetatkan, berjuntai (Input Bahasa Inggeris terapung) di udara
  • GPIO_Mode_IPD- input tarik-turun
  • GPIO_Mode_IPU- tarik masuk masukan
  • GPIO_Mode_Out_OD- Output Longkang Terbuka
  • GPIO_Mode_Out_PP- keluaran dalam dua keadaan (Bahasa Inggeris: Output Push-Pull - bolak-balik)
  • GPIO_Mod_AF_OD- keluaran longkang terbuka untuk fungsi alternatif (Fungsi Ganti Bahasa Inggeris). Digunakan dalam kes di mana output mesti dikawal oleh peranti yang dipasangkan kesimpulan ini port (contohnya, Tx pin USART1, dsb.)
  • GPIO_Mode_AF_PP- perkara yang sama, tetapi dengan dua keadaan

Dengan cara yang sama, anda boleh melihat struktur pembolehubah struktur lain yang diperlukan untuk bekerja dengan fungsi perpustakaan.

Untuk bekerja dengan struktur, sama seperti pembolehubah, anda perlu mengisytiharkannya dan memberikannya nama unik, selepas itu anda boleh mengakses medan struktur yang diisytiharkan dengan nama yang diberikan kepadanya.

//Isytiharkan struktur

/*
Sebelum anda mula mengisi medan struktur, adalah disyorkan untuk memulakan kandungan struktur dengan data lalai; ini dilakukan untuk mengelakkan penulisan data yang salah jika, atas sebab tertentu, tidak semua medan struktur diisi .

Untuk menghantar nilai struktur kepada fungsi, anda mesti mendahului nama struktur dengan simbol &. Simbol ini memberitahu pengkompil bahawa perlu untuk menghantar ke fungsi bukan nilai-nilai itu sendiri yang terkandung dalam struktur, tetapi alamat dalam ingatan di mana nilai-nilai ini berada. Ini dilakukan untuk mengurangkan bilangannya tindakan yang perlu pemproses untuk menyalin kandungan struktur, dan juga membolehkan anda menyimpan RAM. Oleh itu, daripada menghantar banyak bait yang terkandung dalam struktur kepada fungsi, hanya satu yang akan diluluskan yang mengandungi alamat struktur.
*/

/* Tulis dalam medan GPIO_Pin struktur GPIO_Init_struct nombor pin port yang akan kami konfigurasikan selanjutnya */

GPIO_Init_struct.GPIO_Pin=GPIO_Pin_9;

/* Isikan medan GPIO_Speed ​​​​dengan cara yang sama */

/*
Selepas kami mengisi Ruangan wajib struktur, struktur ini mesti diserahkan kepada fungsi yang akan membuat kemasukan yang diperlukan ke dalam daftar yang sesuai. Sebagai tambahan kepada struktur dengan tetapan untuk fungsi ini, ia juga perlu untuk menghantar nama port yang mana tetapan itu dimaksudkan.
*/

Hampir semua persisian dikonfigurasikan dengan cara yang lebih kurang sama; satu-satunya perbezaan adalah dalam parameter dan arahan khusus untuk setiap peranti.

Sekarang mari tulis program berkelip LED kami hanya menggunakan fungsi perpustakaan.

//Jangan lupa untuk memasukkan fail pengepala dengan penerangan daftar mikropengawal

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

//mengisytiharkan fungsi kelewatan perisian

batal kelewatan ( batal);

//fungsi kelewatan perisian itu sendiri

batal kelewatan ( batal)
{
panjang tidak ditandatangani i;
untuk(i=0; i<2000000; i++);
}

//Fungsi utama kami

batal utama ( batal)
{

//Benarkan masa bas port C
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, DAYAKAN);

//Isytiharkan struktur untuk mengkonfigurasi port
GPIO_InitTypeDef GPIO_Init_struct;

//Isi struktur dengan nilai awal
GPIO_StructInit(&GPIO_Init_struct);

/* Tulis dalam medan GPIO_Pin struktur GPIO_Init_struct nombor pin port yang akan kami konfigurasikan selanjutnya */
GPIO_Init_struct.GPIO_Pin = GPIO_Pin_9;

// Isikan medan GPIO_Speed ​​​​dan GPIO_Mode dengan cara yang sama
GPIO_Init_struct.GPIO_Speed= GPIO_Speed_2MHz;
GPIO_Init_struct.GPIO_Mode = GPIO_Mode_Out_PP;

// Lulus struktur yang diisi untuk melakukan tindakan untuk mengkonfigurasi daftar
GPIO_Init(GPIOC, &GPIO_Init_struct);

//Gelung tidak berkesudahan utama kami
sementara(1)
{
//Menetapkan pin 9 port C kepada satu logik (LED menyala)
GPIO_SetBits(GPIOC, GPIO_Pin_9);

//Tambah kelewatan perisian supaya LED bersinar untuk seketika
Kelewatan();

// Tetapkan semula keadaan pin 9 port C kepada sifar logik
GPIO_ResetBits(GPIOC, GPIO_Pin_9);

//Tambah kelewatan perisian sekali lagi
Kelewatan();
}
}

pautan.

Daripada contoh di atas adalah jelas bahawa penggunaan fungsi perpustakaan untuk bekerja dengan persisian membolehkan anda membawa program penulisan untuk mikropengawal lebih dekat dengan pengaturcaraan berorientasikan objek, dan juga mengurangkan keperluan untuk akses kerap ke lembaran data untuk membaca penerangan mikropengawal. mendaftar, tetapi penggunaan fungsi perpustakaan memerlukan pengetahuan yang lebih tinggi tentang bahasa pengaturcaraan . Memandangkan ini, bagi orang yang tidak begitu biasa dengan pengaturcaraan, pilihan yang lebih mudah untuk menulis atur cara akan menjadi cara untuk menulis program tanpa menggunakan fungsi perpustakaan, dengan akses terus kepada daftar pengawal mikro. Bagi mereka yang mengetahui bahasa pengaturcaraan dengan baik, tetapi kurang mahir dalam mikropengawal, khususnya STM32, penggunaan fungsi perpustakaan dengan ketara memudahkan proses menulis atur cara.

Keadaan ini, serta hakikat bahawa ST telah menjaga tahap keserasian yang tinggi, baik dalam perkakasan dan perisian, pelbagai mikropengawalnya, menjadikannya lebih mudah untuk mengkajinya, kerana tidak perlu menyelidiki ciri-ciri struktur pelbagai pengawal siri STM32 dan membolehkan anda memilih mana-mana mikropengawal yang terdapat dalam talian STM32 sebagai mikropengawal untuk kajian.

Pengendali gangguan

Pengawal mikro mempunyai satu keupayaan yang luar biasa - untuk menghentikan pelaksanaan program utama untuk acara tertentu, dan meneruskan pelaksanaan subrutin khas - pengendali gangguan. Sumber gangguan boleh sama ada peristiwa luaran - gangguan untuk menerima/menghantar data melalui mana-mana antara muka pemindahan data, atau perubahan dalam keadaan output, atau dalaman - limpahan pemasa, dsb. Senarai kemungkinan sumber gangguan untuk mikropengawal siri STM32 diberikan dalam lembaran data " RM0041 Manual rujukan"Dalam bab" 8 Gangguan dan peristiwa».

Memandangkan pengendali sampukan juga merupakan fungsi, ia akan ditulis sebagai fungsi biasa, tetapi untuk pengkompil mengetahui bahawa fungsi ini ialah pengendali sampukan tertentu, nama yang telah ditetapkan harus dipilih sebagai nama fungsi, yang akan mengganggu pengalihan vektor dinyatakan. Senarai nama fungsi ini dengan penerangan ringkas terletak dalam fail pemasang " startup_stm32f10x_md_vl.s" Seorang pengendali gangguan mungkin mempunyai beberapa sumber penyebab gangguan, contohnya fungsi pengendali gangguan " USART1_IRQHandler"boleh dipanggil apabila tamat penerimaan dan tamat penghantaran bait, dsb.

Untuk mula bekerja dengan gangguan, anda mesti mengkonfigurasi dan memulakan pengawal gangguan NVIC. Dalam seni bina Cortex M3, setiap gangguan boleh diberikan kumpulan keutamaannya sendiri untuk kes apabila beberapa gangguan berlaku serentak. Kemudian anda perlu mengkonfigurasi sumber gangguan.

Medan NVIC_IRQChannel menunjukkan gangguan yang ingin kita konfigurasikan. USART1_IRQn pemalar menandakan saluran yang bertanggungjawab untuk gangguan yang dikaitkan dengan USART1. Ia ditakrifkan dalam fail " stm32f10x.h", pemalar lain yang serupa juga ditakrifkan di sana.

Dua medan seterusnya menunjukkan keutamaan gangguan (nilai maksimum untuk kedua-dua parameter ini ditentukan oleh kumpulan keutamaan yang dipilih). Medan terakhir sebenarnya membolehkan penggunaan gangguan.

Untuk berfungsi NVIC_Init, sama seperti semasa menyediakan port, penunjuk kepada struktur dihantar untuk menggunakan tetapan yang dibuat dan menulisnya ke daftar mikropengawal yang sepadan.

Sekarang dalam tetapan modul anda perlu menetapkan parameter yang modul ini akan menghasilkan gangguan. Mula-mula anda perlu mendayakan gangguan; ini dilakukan dengan memanggil fungsi nama_ITConfig(), yang terletak dalam fail pengepala peranti persisian.

// Dayakan gangguan setelah selesai pemindahan bait melalui USART1
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

// Dayakan gangguan apabila bait diterima melalui USART1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

Penerangan tentang parameter yang dihantar kepada fungsi boleh didapati dalam fail kod sumber peranti persisian, tepat di atas lokasi fungsi itu sendiri. Fungsi ini mendayakan atau melumpuhkan gangguan untuk pelbagai acara daripada modul persisian yang ditentukan. Apabila fungsi ini dilaksanakan, mikropengawal akan dapat menjana gangguan untuk acara yang kami perlukan.

Selepas kita masuk ke dalam fungsi pengendalian gangguan, kita perlu menyemak dari peristiwa mana gangguan itu berlaku, dan kemudian menetapkan semula bendera, jika tidak, apabila keluar dari gangguan, mikropengawal akan memutuskan bahawa kita tidak memproses gangguan, kerana bendera gangguan adalah masih ditetapkan.

Untuk melakukan pelbagai, tindakan kecil dan berulang dengan tempoh yang tepat, mikropengawal dengan teras Cortex-M3 mempunyai pemasa sistem yang direka khas untuk ini. Fungsi pemasa ini termasuk hanya memanggil gangguan pada selang masa yang ditetapkan dengan ketat. Biasanya, gangguan yang dipanggil oleh pemasa ini mengandungi kod untuk mengukur tempoh pelbagai proses. Pengisytiharan fungsi tetapan pemasa terletak dalam fail " teras_ cm3. h" Hujah yang dihantar kepada fungsi menentukan bilangan kitaran jam bas sistem antara selang masa memanggil pengendali gangguan pemasa sistem.

SysTick_Config(clk);

Sekarang setelah kita menangani gangguan, mari kita tulis semula program kita menggunakan pemasa sistem sebagai elemen pemasaan. Sejak pemasa " SysTick” ialah satu sistem dan boleh digunakan oleh pelbagai blok berfungsi program kami, maka adalah munasabah untuk mengalihkan fungsi pengendalian gangguan pemasa sistem ke dalam fail yang berasingan, dan daripada fungsi ini memanggil fungsi untuk setiap blok berfungsi secara berasingan.

Contoh fail "main.c" untuk program berkelip LED menggunakan gangguan:

//Sertakan fail pengepala yang menerangkan daftar mikropengawal

#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "main.h"

int yang tidak ditandatangani LED_pemasa;

//Fungsi dipanggil daripada fungsi pengendali gangguan pemasa sistem

batal SysTick_Timer_main( batal)
{
//Jika pembolehubah LED_timer belum mencapai 0,
jika(Pemasa_LED)
{
//Periksa nilainya, jika lebih daripada 1500, hidupkan LED
jika(Pemasa_LED>1500) GPIOC->BSRR= GPIO_BSRR_BS9;

//sebaliknya jika kurang daripada atau sama dengan 1500 maka matikan ia
lain GPIOC->BSRR= GPIO_BSRR_BR9;

//Kurangkan pembolehubah LED_timer
LED_pemasa--;
}

//Jika nilai pembolehubah mencapai sifar, tetapkan nilai baharu 2000
lain LED_timer=2000;
}

//Fungsi utama kami

batal utama ( batal)
{

//Benarkan masa bas port C
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, DAYAKAN);

//Isytiharkan struktur untuk mengkonfigurasi port
GPIO_InitTypeDef GPIO_Init_struct;

//Isi struktur dengan nilai awal
GPIO_StructInit(&GPIO_Init_struct);

/* Tulis dalam medan GPIO_Pin struktur GPIO_Init_struct nombor pin port yang akan kami konfigurasikan selanjutnya */
GPIO_Init_struct.GPIO_Pin = GPIO_Pin_9;

// Isikan medan GPIO_Speed ​​​​dan GPIO_Mode dengan cara yang sama
GPIO_Init_struct.GPIO_Speed= GPIO_Speed_2MHz;
GPIO_Init_struct.GPIO_Mode = GPIO_Mode_Out_PP;

// Lulus struktur yang diisi untuk melakukan tindakan untuk mengkonfigurasi daftar
GPIO_Init(GPIOC, &GPIO_Init_struct);

//pilih kumpulan keutamaan untuk gangguan
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

//Konfigurasikan pemasa sistem dengan selang 1ms
SysTick_Config(24000000/1000);

//Gelung tidak berkesudahan utama kami
sementara(1)
{
//Kali ini kosong, semua kawalan LED berlaku dalam gangguan
}
}

Sebahagian daripada kod sumber dalam fail "stm32f10x_it.c":


#include "main.h"

/**
* @brief Fungsi ini mengendalikan Pengendali SysTick.
* @param Tiada
* @retval Tiada
*/

batal SysTick_Handler( batal)
{
SysTick_Timer_main();
}

Contoh draf kerja program untuk berkelip LED menggunakan gangguan boleh dimuat turun dari pautan.

Ini menyimpulkan cerita saya tentang asas membangunkan program untuk mikropengawal STM32. Saya telah menyediakan semua maklumat yang diperlukan untuk membolehkan selanjutnya belajar sendiri Pengawal mikro STM32. Bahan yang disediakan hanyalah permulaan, kerana penerangan lengkap tentang bekerja dengan mikropengawal tidak boleh diterangkan dalam rangka kerja mana-mana artikel. Di samping itu, mengkaji mikropengawal tanpa mendapat pengalaman praktikal adalah mustahil, dan pengalaman sebenar datang secara beransur-ansur dengan bertahun-tahun kerja, eksperimen, dengan pengumpulan pelbagai pembangunan perisian dan perkakasan, serta membaca pelbagai artikel dan dokumentasi mengenai mikropengawal. Tetapi jangan biarkan ini menakutkan anda, kerana maklumat yang diberikan dalam artikel itu cukup mencukupi untuk mencipta peranti pertama anda pada mikropengawal, dan anda boleh memperoleh pengetahuan dan pengalaman lebih lanjut sendiri, membangunkan peranti yang lebih kompleks dan lebih baik setiap kali dan meningkatkan kemahiran anda.

Saya harap saya dapat menarik minat anda untuk mengkaji mikropengawal dan membangunkan peranti berdasarkannya, dan kerja saya akan berguna dan menarik kepada anda.

Sekali lagi saya ingin menulis tentang permulaan mudah dengan STM32, hanya kali ini tanpa menggunakan templat atau contoh sesiapa - dengan penjelasan setiap langkah. Artikel akan mempunyai penomboran langkah yang berterusan.

1. Pasang IAR

Membina projek di IAR

1. Prapemproses

  1. memadam komen

2. Penyusun

3. Penghubung

3. Buat projek baharu dalam IAR

Selepas melancarkan IAR, tetingkap pusat maklumat muncul, yang kami tidak perlukan. Klik menu Projek -> Cipta Projek Baru. Pilih rantai alat: ARM (tidak mungkin anda mempunyai apa-apa lagi dalam senarai itu), Templat projek: C -> utama.

Dalam tetingkap kiri (“Ruang Kerja”), klik kanan untuk memanggil menu dan buat kumpulan baru(Tambah ->

Klik kanan pada CMSIS

Kepada kumpulan Memulakan

Kami telah selesai dengan CMSIS.

Kepada kumpulan StdPeriphLib

Kepada kumpulan pengguna

5. Menyediakan projek

  1. Pilihan umum -> Sasaran ->
Pilih ST –> STM32F100 –> ST STM32F100xB. Ini adalah pengawal kami. 2. Pilihan umum -> Konfigurasi Perpustakaan -> CMSIS: tandakan kotak semak Gunakan CMSIS. Jadi kami akan menggunakan perpustakaan CMSIS terbina dalam pengkompil. Sejak versi 6.30, IAR mula dihantar dengan CMSIS terbina dalam, dan ini nampaknya lebih baik - tetapi ia memperkenalkan beberapa kekeliruan dengan projek lama. 3. Pengkompil C/C++ –>
$PROJ_DIR$\

* Penyahpepijat -> Persediaan -> Pemacu: pilih ST–Pautan, kerana ini adalah pengaturcara yang dibina ke dalam papan Discovery. Sekarang kita mengkonfigurasi pengaturcara itu sendiri: * Penyahpepijat -> ST–LINK -> Antara Muka: pilih SWD (pengaturcara pada papan disambungkan kepada pengawal melalui SWD, bukan melalui JTAG). * Penyahpepijat ->
#include "stm32f10x_conf.h" 

batal utama()
{
sementara(1)
{
}
}

<1000000; i++);


untuk(i=0; i<1000000; i++);

#include "stm32f10x_conf.h"

batal utama()
{





int i;
sementara(1)
{

untuk(i=0; i<1000000; i++);

<1000000; i++); } }

arkib dengan projek GPIO. Nasib baik, anda boleh menyimpan projek ini dan menggunakannya sebagai templat supaya anda tidak perlu melalui semua persediaan lagi. Keseluruhan kitaran: 1. Port I/O (/index.php/stm32-from_zero_to_rtos-2_timers/ "STM32 - dari sifar hingga RTOS. 2: Pemasa dan gangguan") (/index.php/stm32-from_zero_to_rtos-3_timer_outputs/ " STM32 - dari awal hingga RTOS. 3: Output pemasa") [Sekali lagi saya ingin menulis tentang permulaan mudah dengan STM32, hanya kali ini tanpa menggunakan templat atau contoh sesiapa - dengan penjelasan setiap langkah. Artikel akan mempunyai penomboran langkah yang berterusan.

0. Kami mengekstrak papan penemuan STM32VLD

Kami membelinya di kedai, ia berharga 600 rubel. Anda perlu memasang pemacu pada papan - Saya fikir ini tidak akan menyebabkan sebarang kesulitan.

1. Pasang IAR

Kami akan bekerja dalam IAR - IDE yang baik dengan pengkompil yang sangat baik. Ia tidak mempunyai kemudahan menulis kod - tetapi untuk tujuan kami ia cukup mencukupi. Saya menggunakan IAR versi 6.50.3, anda tahu di mana untuk mendapatkannya.

2. Muat turun perpustakaan persisian

Saya bukan peminat bekerja dengan daftar semasa fasa pembelajaran. Oleh itu, saya cadangkan memuat turun perpustakaan persisian daripada ST untuk mendapatkan fungsi yang mudah untuk mengakses semua tetapan yang diperlukan.

Cipta folder "STM32_Projects", letakkan folder Perpustakaan di sana daripada arkib yang dimuat turun (stsw-stm32078.zip/an3268/stm32vldiscovery_package), ia mengandungi CMSIS (perpustakaan daripada ARM untuk semua mikropengawal Cortex, perihalan dan alamat semua sumber) dan STM32F10tPerix - perpustakaan persisian daripada ST dengan semua ciri.

Kami juga membuat folder di sana "1. GPIO”, yang akan menjadi projek pertama kami.

Pokok folder ditunjukkan dalam gambar. Lakukan dengan cara ini, kerana nanti laluan relatif dalam pokok ini akan menjadi sangat penting.

Nah, untuk memahami perkara yang kita bincangkan, muat turun dokumen 1100 halaman pada pengawal ini.

Membina projek di IAR

Ia adalah perlu untuk memahami dengan jelas intipati proses pemasangan projek. Untuk kemudahan, kami akan memecahkannya secara berperingkat.

1. Prapemproses

Prapemproses melalui semua fail .c projek (kedua-dua main.c dan semua fail dalam ruang kerja). Ia melakukan perkara berikut:

  1. memadam komen
  2. mengembangkan arahan #include, menggantikannya dengan kandungan fail yang ditentukan. Proses ini berlaku secara rekursif, bermula dari fail .c dan memasukkan setiap #include .h yang ditemui, dan jika arahan #include juga ditemui dalam fail .h, prapemproses akan memasukkannya juga. Ini menghasilkan pokok kemasukan. Sila ambil perhatian: ia tidak mengendalikan situasi kemasukan berganda, i.e. fail .h yang sama boleh disertakan beberapa kali jika ia #disertakan di beberapa tempat dalam projek. Keadaan ini perlu ditangani dengan defin.
  3. melakukan penggantian makro - mengembangkan makro
  4. mengumpul arahan pengkompil.

Prapemproses menjana fail .i, yang agak mudah apabila mencari ralat binaan - jika hanya kerana semua makro didedahkan sepenuhnya di dalamnya. Menyimpan fail ini boleh didayakan dalam tetapan projek.

Pada ketika ini, pembina mempunyai semua fail .c dalam projek sedia untuk disusun - sebagai fail .i. Tiada sambungan antara fail lagi.

2. Penyusun

Selepas melalui prapemproses, pengkompil mengoptimumkan dan menyusun setiap fail .i, mencipta kod binari. Di sinilah anda perlu menentukan jenis pemproses, memori yang tersedia, bahasa pengaturcaraan, tahap pengoptimuman dan perkara yang serupa.

Apakah yang dilakukan oleh pengkompil apabila ia menemui panggilan fungsi dalam beberapa fail .c yang tidak diterangkan dalam fail ini? Dia mencarinya dalam tajuk berita. Jika pengepala mengatakan bahawa fungsi itu terletak pada fail .c yang lain, ia hanya meninggalkan penunjuk ke fail lain ini di tempat ini.

Pada ketika ini, pembina mempunyai semua fail .c projek yang disusun ke dalam fail .o. Ini dipanggil modul tersusun. Kini terdapat sambungan antara fail dalam bentuk penunjuk di tempat di mana fungsi "asing" dipanggil - tetapi ini masih beberapa fail yang berbeza.

3. Penghubung

Hampir semuanya sudah siap, anda hanya perlu menyemak semua sambungan antara fail - pergi melalui main.o dan menggantikan penunjuk kepada fungsi orang lain - modul yang disusun. Jika sesetengah fungsi daripada perpustakaan tidak digunakan, ia sama ada tidak akan disusun sama sekali pada peringkat sebelumnya, atau tidak akan digantikan di mana-mana oleh pemaut (bergantung pada kaedah pengendalian pemasang). Walau apa pun, ia tidak akan dimasukkan ke dalam kod binari siap.

Penyambung juga boleh melakukan beberapa tindakan akhir pada binari, seperti mengira jumlah semaknya.

Projek pertama berfungsi dengan port I/O

3. Buat projek baharu dalam IAR

Selepas melancarkan IAR, tetingkap pusat maklumat muncul, yang kami tidak perlukan. Klik menu Projek -> Cipta Projek Baru. Pilih rantai alat: ARM (tidak mungkin anda mempunyai apa-apa lagi dalam senarai itu), Templat projek: C -> utama.

Anda kini mempunyai projek C kosong baharu dan fail main.c.

4. Sambungkan perpustakaan kepada projek

Dalam tetingkap kiri ("Ruang Kerja"), klik kanan menu dan buat kumpulan baharu (Tambah -> Tambah Kumpulan), mari kita panggilnya CMSIS. Mari buat kumpulan StdPeriphLib, Startup dan Pengguna dengan cara yang sama. Sekarang kami menambah fail ke kumpulan (saya akan menggariskan semua fail untuk memudahkan untuk diikuti).

Klik kanan pada CMSIS, Tambah, Tambah fail - pergi ke Perpustakaan/CMSIS/CM3, daripada folder DeviceSupport/ST/STM32F10x (sokongan cip) ambil system_stm32f10x.c (ini ialah perihalan periferi tetapan kristal dan jam tertentu). Dalam folder CoreSupport (sokongan kernel) terdapat juga core_cm3.c (ini adalah perihalan teras Cortex M3), tetapi kami tidak akan mengambilnya - kerana ia sudah ada dalam pengkompil. Saya akan menulis tentang ini lebih lanjut.

Kepada kumpulan Memulakan tambah fail startup_stm32f10x_md_vl.s daripada folder Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar. Ini adalah tindakan yang perlu dilakukan pada permulaan. Hampir keseluruhannya adalah mengenai menyediakan pelbagai pengendali gangguan (pengendali sendiri akan berada jauh sedikit). Terdapat juga fail untuk kristal lain, tetapi kami berminat dengan md_vl - ini bermakna ketumpatan sederhana (purata isipadu memori, terdapat juga kristal dengan volum kecil dan besar), garis nilai (garis penilaian - kristal STM32F100 hanya bertujuan untuk menilai keupayaan, dan beralih kepada keluarga berikut).

Kami telah selesai dengan CMSIS.

Kepada kumpulan StdPeriphLib tambahkan fail stm32f10x_rcc.c dan stm32f10x_gpio.c daripada folder Libraries/STM32F10x_StdPeriph_Driver/src. Yang pertama ialah fungsi bekerja dengan sistem jam, dan yang kedua berfungsi dengan pin I/O.

Kepada kumpulan pengguna seret utama kita.c . Ini tidak perlu, tetapi ia lebih cantik.

Pokok projek GPIO kini kelihatan seperti ini:

Ruang kerja sudah sedia, kami tidak akan menambah apa-apa lagi padanya.

Apa yang tinggal ialah meletakkan fail lain dalam folder projek yang menghubungkan pengepala kepada semua fail perpustakaan persisian. Anda boleh menulisnya sendiri, tetapi lebih mudah untuk mengambil yang sudah siap. Kami pergi ke stsw-stm32078.zip/an3268/stm32vldiscovery_package/Project/Examples/GPIOToggle - di sana kita ambil fail stm32f10x_conf.h (konfigurasi projek) dan masukkan ke dalam folder “1. GPIO". Ini adalah satu-satunya fail siap pakai yang kami ambil.

stm32f10x_conf.h hanyalah lambakan termasuk modul yang diperlukan dan fungsi menegaskan. Fungsi ini akan dipanggil apabila terdapat ralat semasa bekerja dengan fungsi perpustakaan persisian: contohnya, meletakkan beberapa sampah ke dalam fungsi GPIO_WriteBit dan bukannya GPIOC - ringkasnya, ST telah memainkannya dengan selamat. Dalam fungsi ini anda hanya boleh memulakan gelung tak terhingga - while(1); Kita masih perlu pergi ke stm32f10x_conf.h - untuk mengulas baris untuk memasukkan fail peranti yang tidak diperlukan, hanya meninggalkan stm32f10x_rcc.h, stm32f10x_gpio.h dan misc.h - supaya kami boleh menulisnya sendiri.

5. Menyediakan projek

Klik kanan pada nama projek dalam tetingkap Ruang Kerja:

  1. Pilihan umum -> Sasaran -> Varian pemproses: pilih "Peranti", tekan butang di sebelah kanan
Pilih ST –> STM32F100 –> ST STM32F100xB. Ini adalah pengawal kami. 2. Pilihan umum -> Konfigurasi Perpustakaan -> CMSIS: tandakan kotak semak Gunakan CMSIS. Jadi kami akan menggunakan perpustakaan CMSIS terbina dalam pengkompil. Sejak versi 6.30, IAR mula dihantar dengan CMSIS terbina dalam, dan ini nampaknya lebih baik - tetapi ia memperkenalkan beberapa kekeliruan dengan projek lama. 3. Pengkompil C/C++ -> Prapemproses. Di sini kami menulis laluan ke folder perpustakaan:
$PROJ_DIR$\
$PROJ_DIR$\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
$PROJ_DIR$\..\Libraries\STM32F10x_StdPeriph_Driver\inc
Makro $PROJ_DIR$ bermaksud folder semasa (folder projek), dan .. - naik satu tahap lebih tinggi. Kami telah menentukan laluan ke folder dengan perihalan kristal, serta fail pengepala pustaka persisian, kerana semua fail .c dalam projek termasuk pengepalanya dan pengkompil mesti tahu di mana hendak mencarinya. Di sini anda juga perlu menulis USE\_STDPERIPH\_DRIVER dalam simbol Ditakrifkan. Ini akan menyambung fail yang diperlukan konfigurasi (contohnya, stm32f10x_conf.h yang disebutkan) kepada projek. Jadi tab Prapemproses akan kelihatan seperti ini: * Penyahpepijat -> Persediaan -> Pemacu: pilih ST–Pautan, kerana ini adalah pengaturcara yang dibina ke dalam papan Discovery. Sekarang kita mengkonfigurasi pengaturcara itu sendiri: * Penyahpepijat -> ST–LINK -> Antara Muka: pilih SWD (pengaturcara pada papan disambungkan kepada pengawal melalui SWD, bukan melalui JTAG). * Penyahpepijat -> Muat turun: tandakan kotak Gunakan pemuat kilat, "Muat naik perisian tegar ke dalam memori kilat." Ia logik, tanpanya tiada apa yang akan banjir.## 6. Menulis kod Pertama, saya akan menulis perkara yang akan dilakukan oleh kod ini. Dia akan berdemonstrasi perkara yang mudah, LED berkelip (PC8 pada papan Discovery) dengan jeda dalam gelung yang tidak berkesudahan. Kami menyertakan fail pengepala konfigurasi projek, stm32f10x\_conf.h. Di dalamnya kita dapati baris #include “stm32f10x\_exti.h” - ini ialah baris 35 dan mengulasnya dengan dua garis miring. Hakikatnya projek kami tidak memerlukan modul EXTI. Fail main.c sudah mempunyai fungsi int main, dan satu-satunya tindakan di dalamnya ialah mengembalikan 0. Kami memadamkan baris ini (kami tidak akan mengembalikan sebarang nilai), tukar jenis fungsi kepada batal (atas sebab yang sama), dan tulis gelung tak terhingga:
#include "stm32f10x_conf.h" 

batal utama()
{
sementara(1)
{
}
}

### Melancarkan modul GPIO Port input/output dalam STM32 dipanggil GPIO - Input/Output Tujuan Umum. Itulah sebabnya kami memasukkan perpustakaan stm32f10x_gpio.c. Walau bagaimanapun, ini bukan semua yang kita perlukan, sedikit teori: Semua persisian pada cip dilumpuhkan secara lalai, kedua-duanya daripada kuasa dan daripada kekerapan jam. Untuk menghidupkannya, anda perlu menghantar isyarat jam. Ini diuruskan oleh modul RCC, dan terdapat fail stm32f10x_rcc.c untuk berfungsi dengannya. Modul GPIO digantung pada bas APB2. Terdapat juga AHB (analog bas pemproses-northbridge) dan APB1 (serta APB2 - analog daripada bas northbridge-southbridge). Oleh itu, perkara pertama yang perlu kita lakukan ialah mendayakan masa modul GPIOC. Ini adalah modul yang bertanggungjawab untuk PORTC; terdapat juga GPIOA, GPIOB dan sebagainya. Ini dilakukan seperti ini: RCC\_APB2PeriphClockCmd(RCC\_APB2Periph_GPIOC, ENABLE); Ia mudah - kami memanggil fungsi menghantar isyarat jam dari bas APB2 ke modul GPIOC, dan dengan itu menghidupkan modul ini. Sudah tentu, kami melakukan ini pada awalnya. fungsi kosong utama. Berikut adalah asas yang perlu anda fahami. Saya juga mempunyai banyak lagi [artikel terperinci tentang modul GPIO](/index.php/stm32-%e2%86%92-%d0%bf%d0%be%d1%80%d1%82%d1%8b- gpio / "STM32 → port GPIO"). ### Mengkonfigurasi modul GPIOC Hanya tinggal sedikit, anda perlu mengkonfigurasi modul GPIOC. Kami memasang kaki output (terdapat juga input dan fungsi alternatif), laraskan ketajaman bahagian hadapan (untuk tujuan keserasian EM), dan pemacu output (push-pull atau sumber terbuka). Kami melakukan ini sejurus selepas memulakan port. GPIO\_InitTypeDef GPIO\_InitStructure; GPIO\_InitStructure.GPIO\_Speed ​​​​= GPIO\_Speed\_2MHz; GPIO\_InitStructure.GPIO\_Mode = GPIO\_Mode\_Out_PP; GPIO\_InitStructure.GPIO\_Pin = GPIO\_Pin\_8; GPIO\_Init(GPIOC, &GPIO\_InitStructure); Nah, itu sahaja, selepas ini kaki PC8 akan berfungsi sebagai output tolak-tarik dengan tepi yang agak licin ( kekerapan maksimum menukar 2 MHz. Tepi tajam ialah 50 MHz). Kami tidak akan melihat kelancaran bahagian hadapan dengan mata, tetapi ia boleh dilihat pada osiloskop. ### Hidupkan LED Panggil fungsi GPIO\_WriteBit(GPIOC, GPIO\_Pin\_8, Bit\_SET); LED akan menyala. ### Hidupkan dan matikannya dalam gelung Dalam gelung while(1) kita menulis kod untuk menghidupkannya, menjeda, mematikannya dan menjeda lagi:

GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);  untuk(i=0; i<1000000; i++);

GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);
untuk(i=0; i<1000000; i++);

Oleh itu, keseluruhan fail main.c kelihatan seperti ini:

#include "stm32f10x_conf.h"

batal utama()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, DAYAKAN);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed ​​​​= GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);

int i;
sementara(1)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);
untuk(i=0; i<1000000; i++);

GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET); untuk(i=0; i<1000000; i++); } }

## 7. Jom lancarkan! Kami menyambungkan papan STM32VLDdiscovery ke komputer melalui microUSB, klik butang Muat Turun dan Nyahpepijat dalam IAR. Program ini dimuat naik ke mikropengawal (anda akan melihat tetingkap dengan bar kemajuan yang ditutup dengan cepat - saiz program sangat kecil), dan penyahpepijatan bermula. IAR berhenti pada arahan pertama kod (ini agak mudah apabila menyahpepijat), anda perlu memulakannya dengan butang Pergi. Semuanya harus berfungsi - LED PC8 biru pada papan STM32VLDdiscovery harus Seperti biasa, anda boleh memuat turun arkib dengan projek GPIO. Nasib baik, anda boleh menyimpan projek ini dan menggunakannya sebagai templat supaya anda tidak perlu melalui semua persediaan lagi. Keseluruhan kitaran: 1. Port I/O (/index.php/stm32-from_zero_to_rtos-2_timers/ "STM32 - dari sifar hingga RTOS. 2: Pemasa dan gangguan") (/index.php/stm32-from_zero_to_rtos-3_timer_outputs/ " STM32 - dari sifar kepada RTOS. 3: Output pemasa")

](/index.php/stm32-from_zero_to_rtos-4_exti_nvic/ “STM32 - dari sifar hingga RTOS. 4: Gangguan luaran dan NVIC”) 5. Pasang FreeRTOS