Keling, STM32 dan foydalanishni boshlaylik yoki yorug'likni oqilona boshqaring.

topshirish / Golovna

Ishni optimallashtirish Yaqinda bir hamkasb meni aqlli telefon yaratish g'oyasiga jalb qildi va men nihoyat o'nlab turli sensorlarni ulashga muvaffaq bo'ldim. Tanlov haqida ko'proq ovqat bor Mikrokontroller(Dali MK) yoki to'lash. Bir nechta qidiruvlardan so'ng siz bir qator variantlarni bilasiz. Ular orasida men ham bor edi Arduino (2313), (shu jumladan uning klonlari, ulardan biri shunchaki dam olish uchun o'zini yuvgan) va Ishga tushirish paneli Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Natija, ehtimol, tayyor taxtadan emas, balki MKni olib, hamma narsani noldan ishlaydi. Natijada, birini tanlang Atmel ATtiny Atmel ATmega(o'rtacha narxda topa olmagan narsadan ilhomlanmoqchi bo'lsangiz), Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). STM32

(Yadrodagi korteks

ARM). Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Men allaqachon Tinka bilan zavqlanishga tayyor edim, shuning uchun men o'zimni oldim STM32VL-kashfiyot.

Buni maqolalar turkumiga kirish deb atash mumkin. .:

Aytmoqchimanki, ushbu maqolalarning aksariyati muallifi men bo'lmaydi, chunki ...

Men buni faqat o'zim bilaman, shuning uchun unutib qo'yishim uchun hazil qilish osonroq bo'lishi uchun ularni o'zim uchun o'zim uchun nashr etaman. Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Va shuning uchun ketaylik!

  • Zagalnye Vidomosti Mikrokontrollerlar
  • oilalar Omboringizga nomlari PORTA dan PORTG gacha bo'lgan yettitagacha 16 bitli kirish-chiqish portlarini joylashtiring.
  • Muayyan model uchun mikrokontroller
  • Barcha turdagi portlar xatosiz mavjud bo'lib, ularning bir qismi korpus turida saqlanadi va tegishli sub-ramkada Data Sheet bilan ta'minlanadi. X portini yoqish uchun, avvalo, uni APB2 shinasiga ulash kerak bo'lib, periferik blokning soatiga ruxsat berish registrida IOPxEN xususiy bitini o'rnatish kerak.
  • RCC_APB2ENR RCC->APB2ENR | = RCC_APB2ENR_IOPxEN;
  • // PORTx soatiga ruxsat berish. Port boshqaruvi

7 ta 32 bitli registrlarning qo'shimcha to'plamlari mavjud:

Quyidagi bosqichlarning ishlash rejimlari zarbalar kombinatsiyasi bilan ko'rsatilgan MODEyі CNFy registrlar GPIOx_CRLі GPIOx_CRH(Bu erda va keyingi: x - portning nomi, y - portning bit raqami).

GPIOx_CRL- 0...7 portli qurilmalar uchun konfiguratsiya registri x:

Ro'yxatga olish tuzilishi GPIOx_CRH o'xshash tuzilish GPIOx_CRL va portning yuqori qismlarining ish rejimlariga tayinlanadi (bitlar 8...15).

Belgilangan registrlarning MODEy bitlari chiqish rejimida suyuqlik almashinuvining bevosita chiqishi va almashinuvini ko'rsatadi:

  • MODEy = 00: Kirish rejimi (tashlanganidan keyin stan);
  • MODEy = 01: Chiqish rejimi, maksimal tezlik - 10 MGts;
  • MODEy = 10: Chiqish rejimi, maksimal tezlik - 2 MGts;
  • MODEy = 11: Chiqish rejimi, maksimal tezlik - 50 MGts.

CNF bitlari chiqish pinlarining chiqish kaskadlarining konfiguratsiyasini belgilaydi:

kirish rejimida:

  • CNFy = 00: Analog kirish;
  • CNFy = 01: Uchinchi lagerga kirish (tushgandan keyin lager);
  • CNFy = 10: O'ziga tortuvchi, tortuvchi (PxODR=1 sifatida) yoki pastga tortuvchi (PxODR=0 sifatida) rezistor bilan kiritish;
  • CNFy = 11: Zaxiralangan.

chiqish rejimida:

  • CNFy = 00: halol funksiyaning ikki tomonlama ta'sirli chiqishi;
  • CNFy = 01: Gaz omborining ochiq drenajidan chiqish;
  • CNFy = 10: Muqobil funktsiyadan push-pull chiqishi;
  • CNFy = 11: Muqobil funksiya bilan ochiq drenajdan chiqing.

O'tkazishdan oldin barcha kirish buferlarining barqarorligini oshirish uchun Shmidt triggerlarini ularni saqlash joyiga joylashtiring. Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Vysnovki qismi

Yong'in avtobusi va hayot avtobusidan ulangan quruq diodlarga ega bo'lib, ushbu ma'lumotlar varaqlarida FT (5V bardoshli) sifatida belgilangan - 5 voltlik kuchlanish bilan birlashtirilgan.

GPIO konfiguratsiya bitlarini himoya qilish Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Konfiguratsiya registrlarini ruxsatsiz kirishlardan himoya qilish uchun // PORTx soatiga ruxsat berish.
// PORTx soatiga ruxsat berish. uzatilgan registrni blokirovka qilishni sozlash

- Ko'rsatilgan portni blokirovka qilish va sozlash registri: Mahalliy chiqishni portga xavfsiz tarzda sozlash uchun LCKy chiqish bitini o'rnatish kerak. Shundan so'ng, tushirishdan oldin oxirgi kirishni qiling LCKK qiymati "1" - "0" - "1" va registrni o'qishning ikkita operatsiyasi Mahalliy chiqishni portga xavfsiz tarzda sozlash uchun LCKy chiqish bitini o'rnatish kerak. LCKR

, bir marta muvaffaqiyatli blokirovka zarba uchun berilgan Qiymatlar "0" va "1". Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Sozlama bitlarini himoya qilish mikrokontroller qayta o'rnatilgunga qadar harakatingizni saqlaydi. Tashqi qurilmalar uchun fayl qiymati mikrokontrollerlar

stm32f10x.h yashirin funktsional maqsadlar bilan bog'liq registrlar guruhini bildiradi (termlar va GPIO
), tilning strukturasi sifatida va registrlarning o'zlari bu strukturaning elementlari sifatida. Masalan: GPIOC-> BSRR – GPIOC portini o'rnatish/o'chirish uchun BSRR registri.:

#o'z ichiga "stm32F10x.h" u32 tmp;

int main (void) (RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // PORTC soatiga ruxsat bering. GPIOC->CRH |= GPIO_CRH_MODE8; // Chiqish uchun LED4 PC8 ni almashtiring. GPIOC->CRH &=~GPIO_CRH_CNF8; PC8da > GPIOC- CRH |= GPIO_CRH_MODE9;// Displey LED3 PC9 GPIOC->CRH &=~GPIO_CRH_CNF9;// Push-pull chiqish uchun PA0 - kirish uchun // PC8, PC9 pinlarini bloklash GPIOC->LCKR = GPIO_. LCKR_LCK8|GPIO_LCKR_LCK9|GPIO_LCKR_LCKK KR_LCK9|GPIO_LCKR_LCKK;tmp=GPIOC->LCKR;tmp=GPIOC->LCKR;

GPIO-ni yozing va o'qing oilalar Yozish va o'qish portlari uchun kirish portlari hisobga olinadi Muayyan model uchun va hafta oxiri

ma'lumotlar reestri. Chiqish registriga kirish ODR Chiqish registriga kirish Portga barcha razryadlarning chiqish darajalarini o'rnatish uchun sozlangan port qayd qilinayotgan qiymatga ulangan.

Sozlamalar yuqoriga tortilgan rezistorlar bilan kirish sifatida amalga oshirilgandan so'ng, registr biti yoqiladi. chiqishning hayot shinasiga (tortishish, ODR=1) yoki mikrokontrollerning yer shinasiga (pastga tortish, ODR=0) tortilishini faollashtiradi. Ro'yxatga olish kitobini o'qish

IDR

kirish sifatida sozlangan mikrokontroller pinlarining qiymatlarini aylantiradi:

// Agar tugmani bossangiz (PA0=1), bitlarni C portiga o'rnating, aks holda qayta o'rnating. Tashqi qurilmalar uchun fayl qiymati agar (GPIOA->IDR & GPIO_IDR_IDR0) GPIOC->ODR=0xFFFF; Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). boshqa GPIOC->ODR = 0x0000; Barcha turdagi portlar xatosiz mavjud bo'lib, ularning bir qismi korpus turida saqlanadi va tegishli sub-ramkada Data Sheet bilan ta'minlanadi. Portga bitlarni tushirish va o'rnatish Natijada, birini tanlang Atom tushishi va bitlarni kiritish uchun mikrokontrollerlarda tayinlash reestri . Arxitektura uchun an'anaviy sobit turdagi operatsiyani talab qilmaydigan registr bitlarini boshqarish usuli "o'qish-o'zgartirish-yozish" o'rnatish bitlariga bitta yozish orqali portdan bitlarni o'rnatish va olib tashlash imkonini beradi BS (BitSet)

Barcha turdagi portlar xatosiz mavjud bo'lib, ularning bir qismi korpus turida saqlanadi va tegishli sub-ramkada Data Sheet bilan ta'minlanadi. bu chegirma

BR (BitReset)

ro'yxatdan o'tish Tashqi qurilmalar uchun fayl qiymati BSRR .
Bunday holda, registrdagi nol bitlarning kiritilishi chiqish ramkasiga oqmaydi. Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor).– portga bitlarni tushirish va o‘rnatish uchun ro‘yxatdan o‘ting: GPIOC->BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BR9;// LED4ni yoqing (PC8), LED3ni o'chiring. GPIOC->BSRR=GPIO_BSRR_BS9|GPIO_BSRR_BR8;”_.
// LED3 (PC9) yoqiladi, LED4 o'chiriladi. Muqobil funktsiyalar _ mikrokontroller komponentlarida maxsus funksiyalarni sozlash uchun bir qancha variantlarni tanlash imkonini beradi. Yangi aloqa interfeyslariga, taymerlarga (registrlarga) doimiy ehtiyoj bor. AFIO_MAPR ), yangi tashqi uzilishlar (ro'yxatga olish AFIO_EXTICR

) va boshqalar.

§> Zagalni umumiy ovqatlanish.


Korruptsiyadan dahshatga tushdik.

Bundan tashqari, S tili mavhum dasturlash tilining tipik vakili bo'lib, bu biz qayta ishlaydigan har qanday ma'lumotni kompyuter fayli o'rniga yoki mikrokontrollerning ichki registrlarida saqlash umuman qiyin emasligini anglatadi.

Klassik C uchun dasturlashning asosiy ob'ekti o'zgarishdir.

Bu bitta yoki alohida trikotaj buyumlar guruhi bo'lishi mumkin, masalan, massiv yoki struktura.

Aslida, o'ziga xos nomga ega bo'lgan raqam va har qanday chegaradan tashqariga chiqadigan maqbul qiymatlar oralig'i o'rtasida farq bor.

Avvalo, dasturni uning vakolatlari bilan tanishishimiz uchun matnda o'zgartirilgan dastur nomini vikoristlashni boshlashimiz kerak.

Rossiyada bu jarayon almashinuv deb ataladi.
Endi o'zgarishlarni hayratda qoldirish kerakmi?

Garchi u mavhum bo'lsa-da, ishlab chiquvchi tomonidan tanlangan mikrokontroller odatda juda o'ziga xosdir va berilgan vakolatlardan o'z manzilli xotira maydoniga ega, bu erda ovoz bergan o'zgarishlarni saqlash mumkin.

Zaxira mikrokontroller xotirasini saqlash uchun, uning hajmi uning sig'imi bilan belgilanadi.

Shunday qilib, masalan, AVR oilasining mikrokontrollerlari 8-bitli, ya'ni ma'lumotlarni saqlash uchun 256 xil raqamli qiymatlarni saqlaydigan bir bayt xotira qutilari yaratiladi.
Hisoblangan o'zgarish qiymatlari ushbu xotira hajmini bosib o'tishi mumkinligi sababli, yana ikkita xotira maydonini saqlash kerak bo'ladi.
Fragmentlar, aniq aytganda, biz qanday qiymatlarni berishni rejalashtirayotganimizni ko'rsatmaganligi sababli, bizdan qabul qilinadigan qiymatlar oralig'ini ko'rsatadigan turni ko'rsatishimizni so'rang.
Buning uchun haddan tashqari yoki qabul qilib bo'lmaydigan darajada kichik hajmdagi xotirani zahiraga solmaslik kerak, shuningdek, saqlanishi mumkin bo'lmagan o'zgarishlarga juda ko'p qiymat qo'shishga urinayotganda bizni oldini olish kerak.
8 bitli mikrokontrollerlar uchun eng ko'p ishlatiladigan butun sonli ma'lumotlar turlari:
Iltimos, ijobiy qiymatlarni saqlang (imzosiz):
unsigned char - bir bayt xotirani egallaydi, qiymati 0...255
unsigned int - ikki bayt, qiymati 0...65535

unsigned long - baytlar soni, 0 dan (2^32)-1 gacha
Belgi(lar) bilan ma'nolarni saqlang:

signed char - bir bayt xotirani egallaydi, -128...127 dan
imzolangan int - ikki bayt, qiymati -32768...32767

imzolangan uzun - baytdan -(2^31) gacha (2^31) oralig'i

"Unsigned" (unsigned) kalit so'zi, aftidan, ishlatilmasligi mumkin, ammo C tilida hech qanday belgi belgilanmagan aqliy tip uchun u imzosiz hisoblanadi.

O'zgaruvchan nuqta bilan C uzatish turidagi kasr sonlar bilan ishlash uchun:

Float - 32 bit, qiymatlar ±1,18E-38 dan ±3,39E+38 gacha

double – 32 (±1,18E-38…±3,39E+38) yoki 64 bit (±2,23E-308…±1,79E+308) kompilyator sozlamalariga qarab.

§> Ko'rinish sohasi o'zgarishi.

Biroq, ovozsiz o'zgarishning ko'rinadigan sohasi deb ataladigan tilning kuchi boshoqlar uchun juda ko'p qiyinchiliklarni keltirib chiqaradi.

Siz dastur kodining ushbu o'zgaruvchan maydonini qo'shishingiz mumkin va dasturning boshqa qismlarida unga kirish imkoni bo'lmaydi, shuning uchun xotira yo'qoladi, chunki dasturning boshqa qismlariga boshqa o'zgarishlar ta'sir qilishi mumkin.

Bunday o'zgarishlar mahalliy deb ataladi, chunki vikoristan iqtisodiy kodni o'zgartirishning asosiy usuli hisoblanadi.

Dastlabki bosqichda barcha o'zgarishlar global deb e'lon qilinishi kerak.


Buning uchun dastur va funktsiyalarni eng boshida joylashtirish kerak.

Bunday holda, ular oqim faylidagi har qanday dastur uchun mavjud bo'lishini kutishingiz mumkin.
§> Saqlash joyi joylashgan hudud.

Ko'rinishidan, AVR oilasining mikrokontrollerlari turli texnologiyalar yordamida amalga oshirilgan uchta xotira maydoniga ega.

Ularning har biri ma'lum bir model uchun noldan maksimal qiymatgacha raqamlangan o'z ma'nosi va manzil maydoniga ega:

O'zgaruvchan ma'lumotlarni saqlash uchun siz vikoristan operativ xotirasidan, doimiy EEPROM xotirasidan va dasturlarning ishlashi paytida qiymatlarini o'zgartirib bo'lmaydigan konstantalarni, shuningdek mikrokontrollerning FLASH xotirasidan foydalanishingiz mumkin.

Mikrokontrollerlarni dasturlash imkonini beruvchi asosiy g'oya quyidagilardan iborat: maxsus qiymatli registrlar boshqaruvchi ishlatadiganlar bilan bir xil.

Ushbu o'zgaruvchilarga mikrokontroller yordamida qiymatlar berilishi mumkin yoki ular o'qilishi mumkin, shu bilan tishli tegirmon haqida ma'lumot olib tashlanadi.

Ko'p sabablarga ko'ra tekshirgichni o'zgartirishdan oldin mikrokontroller registrlarini o'chirish kerak emas.

Avvalo, ularning o'lchamlari oldindan: AVR uchun imzosiz 8 bitli o'zgarishlar mavjud.

Boshqacha qilib aytganda, SFRlar kirish-chiqish registrlari deb ataladigan nomlar va manzillarni qattiq xotirada saqlaydi.

Maxsus maqsadli registrlar bilan dastur bilan tanishib chiqish va sarlavhali fayllar haqida qo'shimcha ulanishlarni so'rash kerak.
Si-dagi har qanday dastur uchun biz quyidagi qatorlarni yaratishimiz mumkin:

#include "file1.h" // "file1.h" fayli o'rniga koddan oldin qo'shing.

#include - bu direktiv (insert), bu fayl1.h nomli fayl o'rniga ishlanmaning o'rtasini dastur bilan bir joyda joylashtirish imkonini beradi.

Kengaytmalari.h bo'lgan fayllar sarlavhalar yoki h-fayllar deb ataladi.
Chakana sotuvchi o'zingizning h-fayllaringizni yaratishi va ularni har qanday dasturga joylashtirishi mumkin.
Biroq, ushbu turdagi mikrokontroller uchun SFR dasturini tushunish uchun maxsus sarlavha fayllarini kiritish kerak.
Ularning nomlari va miqdori muayyan rivojlanish markaziga va sinovdan o'tkazilayotgan mikrokontroller turiga bog'liq, shuning uchun, masalan, Atmega64 uchun IAR-da quyidagi qatorlarni yozish kifoya:
{
# "iom64" ni o'z ichiga oladi
# "inavr.h" ni o'z ichiga oladi
}

Matnga kerakli h-fayllarni kiritgandan so'ng, dastur unda mavjud bo'lgan SFR nomlarini taniydi, masalan, SREG nomlari bilan AVR mikrokontrollerining holat registrini, UART qabul qilish/uzatish buferi - UDR moduli va boshqalar.

Hech narsaga xalaqit bermaslik, lekin Atmega16 mikrokontrollerining maxsus registrlarining nomlariga "yotmaslik" uchun IAR uchun dasturlarni tayyorlash quyidagicha ko'rinishi mumkin:

Registrlar va dastur o'zgarishlari bo'yicha jiddiyroq operatsiyalarga o'tish vaqti keldi.

Mikrokontrollerning ishlashini boshqarish ko'pincha oddiy registrlar to'plamiga to'g'ri keladi:
1. Kerakli qiymat registriga yozing.
2. Registr qiymatini o'qish.
3. Registrga kerakli raqamlarni o'rnatish.
4. Registrni nolga qaytarish.
5. Raqamni mantiqiy bir yoki mantiqiy nolga tekshirish.

6. Registrning mantiqiy tartibini keyingisiga o'zgartirish.

Ko'rsatilgan barcha harakatlar sodiqlik belgisi sifatida qayd etilgan C tiliga tayinlangan operatorni o'z ichiga oladi.
Operatorning harakat tamoyili juda oddiy - u registrga yozadi va o'ng qo'lda yozilgan narsaning qiymatini o'zgartiradi.
O'ng qo'l doimiy, boshqa registr, o'zgaruvchan yoki ulardan tashkil topgan ifoda bo'lishi mumkin, masalan:

A = 16;

// A o'zgaruvchini 16 ga belgilang;

A=B;

// B o'zgaruvchining qiymatini kiriting va A o'zgaruvchining qiymatini belgilang;

A = B+10;

// B o'zgaruvchining qiymatini kiriting, ishlov berilgan qiymatga 10 qo'shing, natijani A o'zgaruvchiga belgilang (B o'zgaruvchisining qiymati o'zgarmaydi).
“ABO” bitli mantiqiy operatsiya operatori vertikal chiziq shaklida yoziladi - “|”

Va siz ikkita o'zgaruvchini, shuningdek, o'zgaruvchi va doimiy o'rtasida tanlashingiz mumkin.

Sizga shuni eslatib o'tamanki, ikkita bitda "ABO" operatsiyasi bitta bitga olib keladi, chunki men chiqish bitlaridan biri bitta holatda bo'lishini xohlayman.

Shunday qilib, har qanday bit uchun, bu bitning qiymatidan qat'i nazar, "1" natijasini "1" bilan berish mantiqiyroq "ABO" va mantiqiy "0" bilan "ABO" chiqish bitiga olib keladi. o'zgartirish.
Ushbu kuch "ABO" g'alabali operatsiyasiga reestrda N-darajani o'rnatishga imkon beradi.

(1<

Buni amalga oshirish uchun siz 2^N formulasidan foydalanib, bitta N-bit bilan doimiyni hisoblashingiz kerak, bu bit niqobi deb ataladi va u bilan registr o'rtasida "ABO" yopishqoqligi, masalan, bitni o'rnatish uchun No. SREG reestrida 7:<<7);

(SREG | 128) - bu virus SREG registrini o'qiydi va somy bitini ishlov berilgan qiymatga kiritadi, so'ngra o'zgartirilgan qiymat SREG registriga qayta joylashtirilgunga qadar:

SREG = SREG |<<7);

128;

// SREG registriga №7 bitni o'rnating.

Registr bilan bunday ish odatda "o'qish - o'zgartirish - yozish" deb nomlanadi, oddiy topshiriq o'rniga u boshqa bitlarning holatini nomsiz saqlaydi.
~(1<

SREG registrida maxsus bitni o'rnatuvchi dastur kodini joylashtirish orqali u robotni to'liq xabardor qiladi - bu mikrokontrollerga dastur uzilishlarini qayta ishlash imkonini beradi.<<7)); или кратко: SREG &= ~ (1<<7);

Ushbu yozuvning yagona kamchiligi shundaki, doimiy 128da ettinchi bitning sozlamalarini taxmin qilish oson emas, shuning uchun N-bit uchun niqob quyidagi shaklda yozilishi kerak:

SREG = SREG |

Bu erda #define - kompilyator qo'shimchasi dastur matnidagi "OCIE0" belgisini 1 raqami bilan almashtiradi, shuning uchun standart bit OCIE0 bo'lib, uning seriya raqami i bilan Atmega64 mikrokontrollerining TIMSK registriga kiritilgan.

Shuning uchun, TIMSK registrida OCIE0 bitini o'rnatish quyidagicha yozilishi mumkin:<

TIMSK | = (1

Mantiqiy “ABO” operatori yordamida ifodalarga bit niqoblarini qoʻshish orqali bir vaqtning oʻzida bir nechta registr bitlarini oʻrnatishingiz yoki olib tashlashingiz mumkin:<<1)|(1<<4); // Установить выводы 1 и 4 порта A в единицу;
PORTA |= (1<<2)|(1<<3)); // Выводы 2 и 3 порта A сбросить в ноль.

PORTA&=~((1

CMSIS tomonidan belgilangan registrlarga ega viki misoli:
DAC0->CTRL | = DAC_CTRL_DIFF;

// O'rnatish

DAC0->CTRL &= ~DAC_CTRL_DIFF;

// chegirma<

§> Registr raqamlarini nolga va bittaga tekshirish.<Maxsus maqsadli mikrokontrollerlar registrlari o'z omboriga mikrokontroller va boshqa modullarning ishlab chiqarish tegirmoni haqida ma'lumot beradigan "belgilar" deb ataladigan bo'sh belgini joylashtiradilar bit holatiga N raqamini kiritish orqali tekshiriladi:<

(RO'YXATDING & (1<

Induktsiyalar aqliy operatorda if (viraz) yoki tsikl operatorida while (viraz)da ishlatilishi mumkin, ular mantiqiy bo'lganlar guruhiga kiradi, shuning uchun ular true yoki false tipidagi argumentlar sifatida qabul qilinadi.<Raqamli qiymatlarni mantiqiy qiymatlarga keltiradigan S tilining bo'laklari, hatto raqamlar nolga teng bo'lmasa ham, mantiqiy haqiqat, qiymatlar sifatida qabul qilinadi (REGISTR & (1)<

N biti o'rnatilganda, bizning ifodamiz uchun "bema'nilik" ning mantiqiy ma'nosini olib tashlash kerak bo'lganligi sababli, uni do'l belgisi ko'rinishidagi mantiqiy inversiya operatori bilan to'ldirish kifoya - !(REGISTR & (1)

Holbuki (!(UCSRA & (1.).

Bu yerda, bit otilgan bilan, UDRE viraz (UCSRA & (1.).

!(UCSRA & (1<< LED); // Погасить светодиод, если он светится и наоборот.

§> Men karavotdagi registrni almashtiraman.

Biz mikrokontroller registrlari bilan ishlashning har bir soatida bajariladigan odatiy operatsiyalar to'plamini ko'rib chiqdik.


Ularga qo'shimcha ravishda, til arsenalida bir qator oddiy arifmetik va mantiqiy operatsiyalar mavjud bo'lib, ularning tavsiflarini istalgan C brauzerida topish mumkin, masalan:

Dunyoning eng katta va eng muhim tizimlaridagi operatsiyalar haqida batafsil ma'lumot olish uchun men B. Kernighan, D. Ritchie tomonidan "Mova Programming" kitobini tavsiya qilaman.
O'zgaruvchilar turlarini o'zgartirish kompilyatorning ichki avtomatik ishining bir qismi bo'lib, bu bizning dasturlash qoidalariga bog'liq.

Dasturchining o'zi, dasturlarni yozishda, qoida tariqasida, aniq masalalar bilan shug'ullanmaydi.

Biroq, o'zgaruvchilar turlarini noto'g'ri e'lon qilish yoki ruxsat etilgan diapazondan oshib ketadigan o'zgaruvchan qiymatni belgilash va doimiy kiritishga noto'g'ri format qo'yish kompilyator to'liq buzilganda ma'lumotlarning yo'qolishiga va dasturlarning noto'g'ri ishlashiga olib kelishi mumkin.

Qachonki, kimda induksiya turi bor?

Bunday holatlar ko'p bo'lgan.

Keling, eng xavflilarini ko'rib chiqaylik.
§> O'zgartirishni tayinlashdan oldin virus turini qayta tuzing.

Ushbu parametr yordamida (x+y) ifoda qiymati 400 ga teng bo'lishidan qat'i nazar, kompilyator tomonida hech qanday avanslar bo'lmaydi.
Va x o'zgarishida 400 raqamining eng kichik bayti yoziladi, ya'ni 144. Va bu erda kompilyatorni tushunish va hatto virusdagi aniq pro-intiallashtirilgan o'zgarishlarni almashtirish, masalan, asosiy avtobus registrida bo'lishi mumkin. UART shikastlangan bo'lishidan qat'i nazar, u qanday ma'noda bo'lishidan qat'i nazar, men kelajak uchun narsalarni tartibga solaman.

Bu ruh uchun yana bir ko't - o'zgaruvchining butun turiga zarba qiymatini belgilash:

Float a = 1,5;

// Suzuvchi nuqta bilan kar.

b = a * b;

// Qarang, men uni o'zgartiraman va 4,5 qiymati yoziladi.

b o'zgartirish natijasi a*b natijaning butun qismidan kamroq - 4 raqamini saqlaydi.
§> Virus natijasini virusdagi eng aniq o'zgarish turiga aniqlashtirish.

Bunday qayta konstruksiya bilan kompilyator quyidagi qoidaga amal qiladi: birinchidan, pastki tur hisoblab chiqiladi, pastki turga ega operatorlar yuqoriga o'tadi va natija ham yuqori turga ko'tariladi.
Qaysi turdagi iz muhim?

Aniqlikni yo'qotmasdan, iloji bo'lsa, boshqa turdagi qiymatni saqlab qolishi mumkin bo'lgan narsa.
Shunday qilib, oldingi dumbada:
Float a = 1,5;
// Suzuvchi nuqta bilan kar.

char b = 3;
// Butun son qiymati yo'qolgan.

Turi (a*b) o'zgaruvchan float va undan yuqori turga ega, shuning uchun siz 0…255 oralig'idagi barcha qiymatlarni char turiga saqlashingiz mumkin.
Natija virazu (a*b) matime tipidagi float.
Ushbu turdagi o'rnatilmagan qurolning odatiy qo'shtirnoq ikki butunning bir qismini ayirishdir:

Bu erda shuni unutmaslik kerakki, C dagi doimiy o'zgaruvchan bo'lganidek, o'z turiga ham ega.
Kirishning vikoryst shaklini aniq ko'rsatish kerak.

5 va 1024 doimiylar o'ninchi nuqtasiz yoziladi va butun sonlar sifatida qabul qilinadi.
Natijada, virusning natijasi (5/1024) ham butunga kamayadi - hisoblangan 0,00489 o'rniga 0.

Format formatida (5.0/1024) yozishda bu sodir bo'lmasdi.

Bu tuzatishlar ham yo'q qilinishi mumkin, vikorista va virus iboralar turlarini aniq kamaytirish operatori C, turi nomi shaklida yozilgan, dumaloq qurol joylashtirilgan va undan keyin turadi virus, oqib.

Ushbu operator natijani operandlarining turidan qat'i nazar, aniq tayinlangan turga o'zgartiradi:
C = (suzuvchi) a/b;
// E'tibor bering, "c" 0,75 (¾) dan ortiq;

U = ADC * ((float) 5/1024);
// Rozrahunok keskinligi.

Bu erda juda ehtiyotkorlik bilan harakat qilish kerak.

O'ng tomonda, funktsiyaga o'tish va uni yoqishda mikrokontroller ba'zi tizim ma'lumotlarini saqlaydi, masalan, funktsiya uzatiladigan dasturning manzili va qo'shimcha resurslarni talab qiladi.

Bu haqiqatni tan olish va dasturda qisqa funksiyalarsiz ko'paytirmaslikka ishonch hosil qilish kerak, chunki ularni bitta yotoqxonaga birlashtirish mumkin.
§> Funksiyalarning tuzilishi va dizayni.

Har qanday funktsiya uchun strukturaviy jihatdan ikkita qismni ko'rish oson: funktsiyaning sarlavhasi va tanasi.

Sarlavha har qanday funktsiyaning birinchi qatoridir:

Chiqish turi funksiya nomini o'zgartiradi (Kirish turlari nomlarni va ularning nomlarini koma orqali o'zgartiradi)

Hozircha nomdan oldin va keyin sarlavhani ko'rib chiqamiz va kerakli ma'lumotlarni qayta ishlamaydigan funktsiyalarni ko'rib chiqamiz.
Ayniqsa, qo'shiq kuylashda badbo'y hid tan olinmaydi.
Bunday funktsiyalarning sarlavhalarida bo'sh turning nomi ko'rsatilgan - void (inglizcha: vakuum, bo'sh):

Yaroqsiz funktsiyalar (yaroqsiz)

Sanoqdan boshlanmasa ham, harakatlarning vazifalari o‘rnini ifodalovchi so‘z ekanligini qanday tushunsam bo‘ladi.
Endi biz dasturning istalgan joyidan funksiyamizni darhol tanlashimiz mumkin.

Buni amalga oshirish uchun siz funktsiyalarning nomlarini, dumaloq qo'llarni va ularning orqasidagi nuqta belgisini yozishingiz kerak.
{
Masalan, sarlavhali funksiya:
bekor boshlash (yaroqsiz)<<0)| (1<<3)| (1<<4); // PB0, PB3, PB4 на выход.
Siz uni quyidagicha wiki qilishingiz mumkin:
}

ishga tushirish ();
Funksiya tanasi sarlavhadan keyin ochiladigan birinchi jingalak kamon va jingalak kamon bilan yopiladigan ikkinchisi o'rtasida harakatlanish uchun buyruqlar to'plamidan iborat.

Izoh: C figurali kamarlarning o'rtasida joylashgan harakatlar to'plami odatda bloklar deb ataladi.

Barcha funktsiyalari bir xil global ilonlar, Tobto, Yaki, Poza pozasi belgilari bilan tekshirish, makrokontroller vazirligining ixtisoslashtirilgan hududlarini loyihalashning Zmíniyvati uchun qobiliyatsiz bo'lishi mumkin.
Bundan tashqari, qo'ng'iroq paytida darhol ma'lumotlarni qayta ishlash uchun funktsiyaga o'tkazish mumkin.

Bu shunchaki qulay va boshqa hech narsa emas.

Ushbu ma'lumotlar parametrlar deb ataladi va funktsiyaga uzatiladi.

Nomidan keyin dumaloq qo'llarning o'rtasida, bu turlarning kombinatsiyasi orqali funktsiya sarlavhasiga ko'chirilishi uchun badbo'y hid aybdor:

Sarlavhaning bu belgilanishi funktsiya FrameLength va StopBit nomli belgilar turidagi ikkita raqamni parametr sifatida qabul qilishga mo'ljallanganligini anglatadi.
{
Endi, funktsiya chaqirilganda, kompilyator dumaloq qo'llarning bo'sh bo'lishiga va ma'lum qiymatlarni koma orqali o'tkazish qobiliyatiga ruxsat bermaydi, masalan:<<1)|(1<<2));
InitUart(8, 2);<<3);
}

Shundan so'ng, funktsiyaning o'rtasida, FrameLength va StopBit nomlarini o'zgartirish 8 va 2 ning o'ziga xos qiymatlarini beradi, ular, masalan, UART modulining uzoq muddatli sozlamalarini va sonini sozlash uchun ishlatilishi mumkin. Itivni to'xtatadi:

Void initUart (char FrameLength, char StopBit)
agar (FrameLength==8) UCSR0C|=((1
agar (StopBit==2) UCSR0C|=(1

§> Ixtisoslashgan funksiyalar.

Biz koristuvachning o'ziga yuklangan funktsiyalarni ko'rib chiqdik.

Bir vaqtning o'zida dasturni ko'rib chiqayotganda, u o'z ishini asosiy funktsiyaning birinchi qatoridan boshlaydi (001-qator kichik):

C tilidagi dastur tuzilishi
Keyin 002, 003, 004 qatorlari ketma-ket to'ldiriladi, ular bitta yashirin quvvat bilan birlashtiriladi: dastur mikrokontrollerni ishga tushirib, ulardan faqat bir marta o'tadi.

Dasturning bu qismi odatda ishga tushirish deb ataladi.

Initsializatsiya qismi belgilangan parametrlar bilan ishlashdan oldin mikrokontrollerning atrof-muhitini tayyorlashdan oldin harakatlarni joylashtirish uchun to'g'ri joy - kirish yoki chiqish portlarini sozlash, dastlabki ishga tushirish ii taymerlari, tezlikni va UART formatini o'rnatish va hokazolarni o'zgartirish rejalashtirilgan barcha narsalar uchun. yana.

Agar biron-bir dastur uzluksiz ishlash uchun mo'ljallangan bo'lsa, normal ish rejimi uzluksiz aylanish o'rniga tsiklni doimiy ravishda takrorlashdir.
{
Aslida, bunday pastadir ko'pincha qo'shimcha konstruktsiyasi bilan amalga oshiriladi while(1) (), jingalak qo'llarning o'rtasini joylashtirish, harakatlarni ko'p marta bajarish uchun mo'ljallangan.<<0); // Притянуть вход кнопки PORTA.0 внутренним pull-up резистором.

Tugallanmagan tsikl o'rniga, dastur isrof deb ataladi.<Bu erda ishning asosiy qismi apparat qismini tekshirish va kerakli natijaga erishish uchun uni ichiga quyishdan iborat.
{
Dasturning eng oddiy ilovadagi tuzilishi bir qarashda tasvirlangan.<<0))) // Если кнопка нажата...
{
Bu kerak: PA0 chiqishidagi tugma bosilgan holatda (signalning nol darajasi) UART shinasi orqali UART belgisini yuboring.<Bu holda dastur (tugmachaning tartibsizligini bostirish uchun murakkab protseduralarsiz va boshqalar) quyidagicha ko'rinishi mumkin:
}
Asosiy bekor (bo'sh)
PORTA | = (1
UCSRB = (1
...
}
}

esa (1)

agar (! (PINA & (1.).

Misoldan ko'rish mumkinki, PA.0 kiritishiga kiritish chastotasi fonga buyruqlar kiritish chastotasi bilan belgilanadi va tugma oxirgi marta qo'llanilishidan oldin ham keyingi qatorlarni chiqarish uchun mikrokontroller javobgardir. 00N, 00N+1 va boshqalar. Shubhasiz, tashqi bosimni (tugmachadagi bosim) mahkamlash ishonchliligi har bir vaqtda uni aniqlash davrigacha bir xil oqimdagi trivallikka nisbatan saqlanadi.

Ushbu dasturdagi fon muammosi amalda bir necha o'nlab millisekundlarga aylanadigan tugmani bosish qiyinligidan ancha kam bo'ladi.

Biroq, dasturning fon qismining o'sishi va tashqi oqimning kichik soati bilan hozirgi vaqtda uni qo'llab-quvvatlashning ishonchliligi keskin pasayadi.

Bunga yo'l qo'ymaslik, shuningdek, dasturning tashqi kirishga reaktsiya vaqtini qisqartirish uchun uzilish tizimi joriy etilmoqda.

§> Pererivannya.

To'xtatish mexanizmi qanday ishlaydi?
Bu juda oddiy, ayniqsa rus tilida!
AVR mikrokontrollerlarining arxitekturasi, shuningdek, har qanday boshqa, "kliklarni chiqarish" qo'shiqlarini o'rnatish va ularni istalgan vaqtda o'rnatish qobiliyatining apparat darajasiga kiritilgan. Bunday stantsiyalar "viniknenya aqllari" deb ataladi va o'rnatilgan belgilar "qayta chizish" ning "filiallari" deb ataladi.

Mikrokontroller ushbu signallarning holatini doimiy ravishda kuzatib boradi, agar biron bir uzilish signali aniqlansa, telefon bitini yoqishga ruxsat beriladi va global uzilishga ruxsat berilgan bit ham o'rnatiladi (AVR uchun SREG registridagi № 7). dasturning asosiy qismining mazmuni vaqtincha qisqartiriladi (to'xtatiladi).
2. Hisob qaydnomangizda maxsus bit bilan bizni bosish uchun uzilishga ruxsat bering.
Men mikrokontrollerni shunday tasvirlab berdim.
3. Fikringizni o'zgartiring va uni o'zgartiring, masalan, taymerni o'zgartirishni xohlamasangiz, uni shunchaki ishga tushiring.

O'zgarish to'xtatilishi bilan biz yangi rahbarga aylanamiz, keyin buning uchun kerakli fikrlarni (old, yon yoki nol daraja) o'rnatamiz.

4. Dasturga uzilishlar kollektorini joylashtiring, uni kompilyatorga mos keladigan tarzda formatlang.

Agar biron-bir dastur uzluksiz ishlash uchun mo'ljallangan bo'lsa, normal ish rejimi uzluksiz aylanish o'rniga tsiklni doimiy ravishda takrorlashdir.
{
Bizning holatda, tugmani kiritishda past darajadagi orqada UART ga yuborishni tashkil qilish uchun siz INT0 ning tashqi uzilishi deb ataladigan vositadan foydalanishingiz mumkin.<<2); // Притянуть вход кнопки PORTD.2 внутренним pull-up.
Ushbu uzilish ko'rsatilgan INT0 da old, yon yoki nol daraja bilan signallanadi.
Tugallanmagan tsikl o'rniga, dastur isrof deb ataladi.<SREG = SREG |<<7); // Разрешить прерывания.
Biz PD.2 displey tugmachasini INT0 muqobil funksiyasi bilan o'tkazdik.<Dasturning ishga tushirish qismida global va INT0 ni to'g'ridan-to'g'ri uzish mumkin.
}

Mikrokontroller kirish signalining past darajasida INT uzilishini shakllantirish uchun sozlashlarni o'rnatish uchun javobgardir, shuning uchun qo'shimcha sozlashlar talab qilinmaydi.
Asosiy funktsiya va UARTga * belgisini yuboradigan INT0 jo'natuvchisi o'rtasida ovoz berish mumkin emas:
{
PORTD | = (1<<2))) {while(! (UCSRA & (1< }

UBRRL = 51;

// UART tezligi - 9600 bps.

GICR|=(1
esa (1)()
Agar uzilishlarga qo'ng'iroq qilgan odamlar tez-tez o'z ishlarini tugatishlari kutilsa, uzilishlar boshlanishi haqida e'lon qilingan paytda, uzoq muddatli namuna oluvchi oxirigacha tugatmasligi mumkin.

Va bu ma'lumotlarning yo'qolishi va normal harakatlar ketma-ketligining buzilishi tufayli qabul qilinishi mumkin bo'lmagan oqibatlar bilan tahdid qiladi.
Masalan, agar UART ma'lum bir bayt qatorini olishi kerak bo'lsa, ularning har birini olgandan keyin yuborilgan protsessorda olingan ma'lumotlarni qayta ishlash bilan shug'ullanishning hojati yo'q, faqat ularni qayta yozish kerak. massivni tayyorlash ortida.

Va ularning qolgan qismini olganingizdan so'ng, siz to'plamga tegishli belgini qo'yishingiz mumkin (hamma narsa qabul qilingan deb aytish) va paydo bo'lgan fonda siz barcha qabul qilingan massivni xotirjamlik bilan tekshirishni boshlashingiz mumkin.

Saytdan olingan

http://eugenemcu.ru/

Aftidan, ijaraga olingan kvartiramga kelganimdan so'ng, men qo'shiq kuylashdan o'zimni o'chirib qo'ydim, bu juda asabiy edi: asosiy xonadagi yorug'lik devorga o'ralgan devor shkafi orqasiga tushdi va uni qayta tartibga solish noqulay edi.

O'sha paytda men uchun hamma narsa unutilmas darajada murakkab bo'lib tuyuldi va menga topshirilgan vazifani amalga oshirishdan ko'ra, muammoga duch kelish xavfi bor edi.

Shunday qilib, men STM32 mikrokontrollerlar oilasi va STM32F0-Discovery platasi bilan tanishdim, o'rganganimdan so'ng men kerakli maqsadlar uchun qurilmamni yaratmoqchi bo'ldim.

Ajablanarlisi shundaki, STM-dagi bunday ajoyib jamoa, maqolalar, ilovalar va turli xil materiallar Arduino kabi ko'p emas edi.

Albatta, agar siz qidirsangiz, boshlash uchun qanday va qaerdan boshlashni tasvirlaydigan ko'plab maqolalar mavjud.

Ammo o'sha paytda menga hamma narsa juda murakkab bo'lib tuyuldi, nutqni chuqur tushunadigan yangi boshlanuvchilar uchun foydali bo'lgan ko'p tafsilotlar ochilmagan edi.


Ko'pgina maqolalar "yollanganlar uchun boshlang'ich" sifatida tavsiflangan, ammo har doim ham ularning yordami bilan kodning tayyor misollaridan foydalanib, istalgan natijaga erishish mumkin emas edi.

Shuning uchun men STM32-da ma'lum bir g'oyani amalga oshirish uchun dasturlash haqida qisqacha maqolalar yozishga qaror qildim: xonani yoritish uchun masofadan boshqarish.

Nega AVR/Arduino emas?

To'rtinchidan, kasbiy rivojlanish bilan shug'ullanadigan odamlar 32-bitli MK-lardan ko'proq foydalanishadi va ko'pincha bu modellar NXP, Texas Instruments va ST Microelectronics-dan.

Istalgan vaqtda men o'z muhandislarimga tergov qilish uchun borib, boshqa vazifalarni qanday hal qilishni bilishim va siqish o'rniga ovqatlanish bilan maslahatlashishni to'xtatishim mumkin edi.

Nima uchun Discovery platasidan STM32 mikrokontrollerlaridan foydalanishni boshlash kerak?

Siz allaqachon tushunganingizdek, biz siz, aziz o'quvchilar, Discovery to'lovidan STM32 mikrokontrolleri haqidagi bilim va amaliyotni baham ko'ramiz.

Nima uchun o'z boshqaruv kengashi emas, balki Discoveryning o'zi?

Discovery-ni boshlash va to'lash uchun bizga nima kerak?

Discovery taxtasi bo'lgan robotda bizga bir qator muhim nutqlar kerak bo'ladi, ularsiz qila olmaymiz: Keling, IDE ni sozlash va ishga tayyorlashni boshlaylik! Bizning IDE o'rnatish fayli o'rnatilgandan so'ng, o'rnatishni davom ettirishingiz mumkin.


O'rnatish ko'rsatmalariga rioya qiling va o'rnatish jarayonini yakunlang.
  1. Operatsiya uchun zarur bo'lgan barcha fayllar nusxalangandan so'ng, o'rnatish uchun dasturiy ta'minot paketini o'rnatish oynasi paydo bo'ladi. Paket o'rnatuvchi
  2. . Ushbu o'rnatuvchida muntazam yangilanib turadigan past darajadagi kutubxonalar, o'rta dastur va amaliy dasturlar mavjud.
  3. Kengashimiz bilan ishlashni boshlash uchun biz ish uchun zarur bo'lgan past paketlarni o'rnatishimiz va biz foydalanadigan mikrokontrollerni bilishimiz kerak. Oynani qidirish orqali ham tezda bilib olishingiz mumkin.
MK-ni topganimizdan so'ng, yangisini va oynaning ikkinchi yarmini bosing va biz kutubxonalarning joriy transferini o'rnatishimiz kerak:


Keil :: STM32F0xx_DFP - Mikrokontrollerlarning ma'lum bir oilasi uchun to'liq dasturiy ta'minot to'plami, unga qo'llanmalar, ma'lumotlar jadvallari, SVD fayllari, generatordan kutubxonalar kiradi. ARM::CMSIS

– Korteks yadrosini qo‘llab-quvvatlash uchun ARM-da yangi kutubxonalar to‘plamini o‘z ichiga olgan Cortex Microcontroller Software Interface Standard to‘plami. Keil::ARM_Compiler.


Va yana, biz allaqachon qanday modullarga ulanishimiz mumkinligini bilamiz, bu bizni loyihaga olib boradi.
  1. Bizning loyihamiz ikkita modulni talab qiladi: CMSIS kutubxona yadrosi
  2. , Unda bizning MK ishi uchun zarur bo'lgan sozlamalar, ro'yxatga olish kitoblarining manzillari va boshqa ko'plab narsalar qayd etilgan. Boshlash fayli
, bu ishga tushirishda MK ning dastlabki ishga tushirilishini, vektorlar va protsessorlarni bostirishni, uzilishni va boshqalarni ko'rsatadi.


Agar ulanganlarning barcha ishlari qoniqsa, menejer bu haqda bizga yashil rang bilan ishora qiladi: Keil::ARM_Compiler Shundan so'ng, biz tugmachani bosganimizdek

Loyihamizga hissa qo'shishimiz mumkin. Loyihaning parametrlarini sozlash va dasturchimizni sozlash uchun siz sichqonchaning o'ng tugmachasini bosishingiz kerak Maqsad 1


Pastki menyuni oching. Loyihaning asosiy menyusida siz parametrni sozlashingiz mumkin Xtal maqsad uchun 8,0 MGts


. Ushbu parametr bizning MK kvarts osilatorining ish chastotasini ko'rsatadi: Endi dasturchimiz/tuzatish vositasini sozlashga o'tamiz. Oynangizdagi yorliqni bosing Nosozliklarni tuzatish va maydonda tanlang Foydalanish


parametr

ST-Link tuzatuvchisi Va keling, sozlashga o'tamiz:.


Doskada o'rnatilgan ST-Link modelini, uning seriya raqamini, HW versiyasini va biz miltillovchi MK IDCODEni tekshirish biz uchun juda muhim: Qulaylik uchun siz miltillagandan keyin MK avtomatik ravishda qayta tiklanishini ta'minlaydigan parametrni sozlashingiz mumkin. Buning uchun siz katakchani belgilashingiz kerak Qayta o'rnatish va ishga tushirish Shundan so'ng, biz yana bitta variantni o'rnatishimiz kerak, bu bizning loyihalarimiz kodidan oldin ruscha sharhlarni yozishga imkon beradi. Tugmani bosish .


Konfiguratsiya

va maydonda paydo bo'lgan menyuda


Kodlash yig'amiz Ruscha Windows-1251 Bo'ldi shu. Bizning IDE va ​​dasturchimiz ishga tayyor! Keilda qulay loyiha navigatori mavjud bo'lib, unda biz loyihaning tuzilishini, ish uchun zarur bo'lgan dastlabki materiallarni, shu jumladan kompyuterimizga allaqachon yuklab olganlarimizni (kashf qilish sxemasi, ma'lumotlar varag'i, ma'lumotnoma qo'llanmasi), mavjud funktsiyalar ro'yxatini bilib olishimiz mumkin. turli harakatlanuvchi tuzilmalarni dasturlashda tez kiritish uchun loyiha va andozalar.


Loyiha tuzilmasidagi papka nomini o'zgartiring Manba 1-guruh .


yoqilgan Ilova/foydalanuvchi , Shunday qilib, bu papada biz koristuvachning fayllari va dasturlariga ega bo'lganlarni bildiradi: Buyruqni kiritish orqali asosiy dastur faylini loyiha navigatori orqali qo'shing :


Yaratish fayli avtomatik ravishda loyiha tuzilishiga qo'shiladi va dasturning asosiy oynasida paydo bo'ladi.

Xo'sh, endi biz yaratilgan dasturimizni chop etishimiz mumkin.

Avvalo, mikrokontrollerlar oilamizning sarlavhali hujjatini o'ralgan faylimizga ulashimiz kerak. Buyruqni kiritish orqali asosiy dastur faylini loyiha navigatori orqali qo'shing Fayl uchun Dodamo

Keyingi o'rin qatorlarida LEDlarni navbatma-navbat miltillash dasturi beriladi:<500000; i++){} // Искусственная задержка /* Зажигаем светодиод PC9, гасим PC8 */ GPIOC->/* Mikrokontrollerlar oilamiz uchun sarlavha fayli */ #include "stm32f0xx.h" /* Asosiy dasturning tanasi */ int main(void) ( /* GPIO portidagi soatni o'z ichiga oladi */ RCC->AHBENR |= RCC_AHBENR_GPIOCEN ; /* Chiqishdagi PC8 va PC9 portlarining sozlanishi * / GPIOC -> MODER = 0x50000; PC8 LED, o'chirish mumkin bo'lgan PC9 */ GPIOC->ODR = 0x100;<500000; i++){} // Искусственная задержка } }
ODR = 0x200;


uchun (int i=0; i Dasturimizni yozganimizdan so'ng, kodni kompilyatsiya qilish va proshivkani MK-ga yuklash vaqti keldi. Kodni kompilyatsiya qilish va yuklab olish uchun siz ushbu menyuga tezda kirishingiz mumkin:


uchun (int i=0; i Jamoa Qurish


(yoki F7 tezkor tugmasi) kodni kompilyatsiya qiladi va agar o'tmishda hech qanday o'zgarishlar bo'lmasa, dastur kompilyatsiya jurnalida o'tmishda o'zgarmaganlar haqida ko'rsatadi:


Yuklash

(yoki tezkor tugma F8) kompilyatsiya kodini bizning MK-dan yuklab oling va uni avtomatik ravishda wiki-ga yuboring:

Kodga jalb qilingandan so'ng, biz yorug'lik chiqaradigan diodlar muntazam soatlik oraliqda porlay boshlaganidan xursand bo'ldik.

Xayr! Biz o'zlashtirilgan STM32 mikrokontrollerlari bilan birinchi marramizni yakunladik!

Biz ushbu asosiy va mantiqiy operatsiyalar nima ekanligini, ulardan qanday foydalanishni aniqlaymiz va MK bilan ishlash uchun juda foydali yordamchi dastur haqida bilib olamiz, ammo bu orada biz Discovery platamizdagi LEDlarni qanday qilib baxtli ravishda miltillashdan bahramand bo'lishimiz mumkin.

STM32 vaqt tizimi.

Bugun biz STM 32 mikrokontrollerlarining soat tizimi haqida gapiramiz. Agar siz hali ham soat, chastota va vaqtga ushbu soat tizimi ta'sir qilmasligini bilmasangiz. Ushbu ko'rsatmalarga amal qilish uchun biz yuqoridagi ko'rsatmalarga amal qilgan holda darsda tushunilgan va STM 32 mikrokontrollerlarining takt tizimiga mos keladigan AVR mikrokontrollerining takt tizimini ko'rib chiqamiz. Qani, boramiz!

Keling, STM 32 F 3 DISCOVERY platasiga o'rnatilgan STM 32F 303VCT 6 mikrokontrolleri qo'llanilishi bo'yicha soat tizimini ko'rib chiqaylik.

O'ngdagi yo'lning diagrammasiga qarang.

Avvalo, biz kontrollerning asosiy soatini tanlashimiz mumkin. HSI va HSE o'rtasida tanlash mumkin.

H.S.E. - -Tashqi yuqori chastotali generator.

Soat elementi kontaktlarning zanglashiga asoslangan tashqi soat signali (Kirish chastotasi), keyin u 4 dan 32 MGts gacha bo'lishi mumkin. Bu kvarts rezonatori, soat generatori va boshqalar bo'lishi mumkin. HSI

Bu kvarts rezonatori, soat generatori va boshqalar bo'lishi mumkin. Ichki yuqori chastotali generator. - STM 32 F 3 mikrokontrollerlarida 8 MGts chastotali RC lanyard mavjud.

Aniqlik joriy HSE generatoridan sezilarli darajada past.

Ushbu qurilmalarning terisi bilan bog'langan bo'lishi mumkin

PLL

. Biroq, PLL ga yuborilishidan oldin, HSI signali 2 marta o'zgaradi. HSE signali PLL ga o'zgarishsiz yuborilishi mumkin, ammo vaziyatga qarab ko'p marta o'zgarishlar bo'ladi.

Soat

Fazali chastotalarni avtomatik moslashtirish (PLL) tizimi.

HSI yoki HSE kirish signalini kerak bo'lganda ko'p marta ko'paytirish imkonini beradi.

PLL signali maksimal chastotasi 72 MGts bo'lgan tizim shinasiga qo'llanilishi mumkin.

HSE yoki HSI signali tizim avtobusiga hech qanday o'rta asossiz, PLLni teskari o'zgartirmasdan etkazib berilishi mumkin.

SYSCLK tizim takt chastotasi mikrokontrollerning barcha asosiy avtobuslarini konnektorlar orqali, biz sxemada ko'rib turganimizdek, soatlab beradi.

Avtobuslarning maksimal soat chastotasi SYSCLK dan past ekanligiga ishonch hosil qiling.

Shuning uchun, SYSCLK soat signalini kuzatuv avtobusiga yuborishdan oldin, uni o'z quliga bo'lish kerak.

Agar siz hech narsa qila olmasangiz, mikrokontroller muzlaydi.

Soatni sozlash uchun siz registrlarni qo'lda tahrirlashingiz yoki ishlarni tezlashtirish uchun kutubxona funksiyalaridan foydalanishingiz mumkin.

FLASH -> ACR &= (uint32_t) ((uint32_t) ~ FLASH_ACR_LATENCY);

FLASH -> ACR | = (uint32_t) ((uint8_t) 0x02);

RCC_PREDIV1Config(RCC_PREDIV1_Div1);

//PREDIV 1 bo'luvchi = 1 RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);

// PLL uchun manba sifatida PREDIV1 ni o'rnating va PLLMUL=9 ni o'rnating

RCC_PLLCmd(yoqish);

//PLL-ni yoqing

while (RCC_GetFlagStatus (RCC_FLAG_PLLRDY) == RESET);

//PLL kutilmoqda

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//PLL ni SYSCLK Soucre sifatida o'rnating

RCC_HSICmd(DISABLE);

// HSI-ni o'chirib qo'ying

int main (yaroqsiz)

RCC_ClocksTypeDef RCC_Clocks; InitRCC(); _ RCC_GetClocksFreq(&RCC_Clocks); NOP();

while(1)

Asosiy funktsiyada struktura bo'sh InitRCC(); _ RCC (InitRCC(); _ Avvalo, biz kontrollerning asosiy soatini tanlashimiz mumkin. _ Clocks TypeDef ), . InitRCC(); _ Ushbu tuzilma o'z maydonlarini boshqaradi, kontrollerning qo'shiq elementlarining aniq soat chastotasini uradi. _ Keyin asosiy funktsiya kontrollerning soat tezligini sozlaydigan InitRCC funktsiyasidir. . Keling, hisobotni ko'rib chiqaylik. Jamoa (InitRCC(); _ HSEConfig (InitRCC(); _ Ushbu tuzilma o'z maydonlarini boshqaradi, kontrollerning qo'shiq elementlarining aniq soat chastotasini uradi. _ Keyin asosiy funktsiya kontrollerning soat tezligini sozlaydigan InitRCC funktsiyasidir. ) == ON ) .

Biz HSE-ni yoqamiz, uni yoqish uchun bir soat vaqt ketadi, agar praporshchik o'rnatilmagan bo'lsa, hujjatlarni tekshirishingiz kerak

BAYROQ InitRCC(); _ HSERDY 1 Robimo mi tse u tsikli (InitRCC(); _ HSERDY 1_ esa 1) GetFlagStatus InitRCC(); _ RESET (InitRCC(); _ Keyin flesh-xotira sozlamalarini sozlash uchun qattiq ishlaymiz. _ HSERDY 1, InitRCC(); _ Tizim avtobusini 36 MGts dan yuqori chastotalarda ishlatish kerak! _9 Dampingni sozlagandan so'ng, PLL distribyutorini tanlang. InitRCC(); _ Jamoa (PREDIV ), Konfiguratsiya InitRCC(); _ Ushbu tuzilma o'z maydonlarini boshqaradi, kontrollerning qo'shiq elementlarining aniq soat chastotasini uradi. _ Div Biz qarzdorni 1. Buyruq bilan o'rnatamiz InitRCC(); _ PLLConfig (InitRCC(); _ PLLSource _ PLLMul ). ) PLL uchun chastota selektori sifatida HSE ni tanlang va multiplikatorni 9 marta tanlang.

PLLni faqat buyruq bilan yoqishingiz mumkin InitRCC(); _ PLLCmd (YOQISH ).

va o'rnatilgan praporshchni tekshiring InitRCC(); _ RCC_GetClocksFreq(&RCC_Clocks); PLLRDY , while tsiklida.

Tim o'zimiz PLL-ni yoqish uchun kerakli vaqtni kechiktirishni ta'minlaydi. __ Shundan so'ng, PLL SYSCLK buyrug'i bilan tizim chastotasi tashuvchisi sifatida tanlanadi () SYSCLKConfig

SYSCLKSource PLLCLK, proshivkani tanlang, platani o'chiring va disk raskadrovka seansini boshlash / to'xtatish tugmasini bosib sozlash rejimiga o'ting (Ctrl + F 5). __ Shundan so'ng, PLL SYSCLK buyrug'i bilan tizim chastotasi tashuvchisi sifatida tanlanadi Funktsiyaga nuqta qo'yish orqali

, va soatga RCC _Clocks tuzilmasini qo'shgandan so'ng, biz F 5 tugmachasini bosib proshivka yangilanishini ishga tushiramiz. Natijada:

Chastotalar to'g'ri sozlangan va mikrokontroller hozirda 72 MGts chastotada ishlamoqda.

Bundan tashqari, bugungi darsdan tushunganingizdek, STM 32 soat tizimi loyihalaringiz ehtiyojlarini qondirish uchun katta kuch va kuch bilan ishlatilishi mumkin.

Ushbu treningga bir soat vaqt sarflab, siz mo''jizaviy natijalarga erishasiz!

Hurmatingiz uchun rahmat!

Sizning taomingiz doimo sharhlarda! Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). MKPROG.RU ma'muriyatining yozma roziligisiz har qanday nusxa ko'chirish, ko'paytirish, material yoki biron bir qismdan iqtibos keltirish mumkin. Noqonuniy nusxa ko'chirish, iqtibos keltirish yoki qayta yaratish qonuniy tergovga tortiladi! 08/09/2016 chop etilgan


Mikrokontrollerlar Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Ular o'zlarining kuchlari, turli xil chekkalari va moslashuvchanligi tufayli tobora ko'proq mashhurlikka erishmoqdalar. Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Biz, albatta, byudjet sinov taxtasini sotib olamiz, uning narxi 2 dollardan oshmaydi (Xitoydan). Bizga ko'proq kerak ST-Link

dasturchi, narxi 2,5 dollarga yaqin (xitoychadan).

  • Bunday materiallar ham talabalar, ham maktab o'quvchilari uchun mavjud, shuning uchun men ushbu byudjet variantini chop etishni maslahat beraman.
  • Bu mikrokontroller eng qiyin emas
  • ale y eng zaif emas.
  • To'lovlarda farqlar bo'ladi
  • , bu raqam
  • Kashfiyot
  • Narxi 20 dollar atrofida.
  • Bu kengashlarda bizning platamizdagi hamma narsa, shuningdek, dasturchi mavjud.
  • U bizning vipadku mi vikoristuvatimemo dasturchi okremo.
  • Mikrokontroller STM32F103C8.
  • Xususiyatlari
  • ARM 32-bit Cortex-M3 yadrosi
  • Maksimal chastota 72 MGts
  • Dasturlar uchun 64 Kb flesh xotira
  • 20 Kb SRAM xotirasi

Xarchuvannya 2.0 ... 3.3V

  • 2 x 12-bitli ADC (0...3,6V) DMA boshqaruvchisi, 37 ta kirish/chiqish 5V ga chidamli, 4 ta 16 bitli taymer, 2 ta kuzatuvchi taymer
  • I2C - 2 ta avtobus USART – 3 ta avtobus
  • SPI - 2 ta avtobus USB 2.0 to'liq tezlikda interfeys
  • RTC - tug'ilgan kunning yubileyi STM32F103C8 platasida mavjudі Portlarni ko'rish A0-A12 B0-B1.
  • B3-B15
  • C13-C15 Micro-USB bu orqali siz to'lovni to'lashingiz mumkin. Kengashda 3,3V kuchlanish stabilizatori mavjud. Bortdagi chiqish terminallariga 3,3 yoki 5V quvvat manbai berilishi mumkin. C13.
  • Dasturchi uchun ulagich Noqonuniy nusxa ko'chirish, iqtibos keltirish yoki qayta yaratish qonuniy tergovga tortiladi!.

Xo'sh, biz mikrokontrollerni yoqishga harakat qilishimizga arziydi. Noqonuniy nusxa ko'chirish, iqtibos keltirish yoki qayta yaratish qonuniy tergovga tortiladi!.

Siz USART orqali yordam olishingiz yoki dasturchidan yordam olishingiz mumkin Mikrodastur uchun test faylini yuklab olishingiz mumkin

.

Dastur doskadagi LEDni yoqadi. Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor).є Windows uchun qo'shimcha USB-Uart adapteri yordamida STM32 proshivka Tizim xotirasida Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). Bootloader . Ishlab chiqarish bosqichidagi yozuvlarni yuklovchi va har qanday mikrokontroller interfeysi orqali dasturlash mumkin USART interfeysi orqali dasturlash mumkin qo'shimcha USART-USB adapteri uchun. Bunday adapterlar ko'pincha mashhur mikrosxemalar asosida ishlab chiqariladi. FT232RL


. Avval adapterni kompyuterga ulaymiz va drayverlarni o'rnatamiz (agar kerak bo'lsa).і Siz drayverlarni haydovchining veb-saytidan yuklab olishingiz mumkin- ftdichip.com. Drayvlarni yuklab olish kerak VCP Avval adapterni kompyuterga ulaymiz va drayverlarni o'rnatamiz (agar kerak bo'lsa).(Virtual com port). Siz drayverlarni haydovchining veb-saytidan yuklab olishingiz mumkin Drayvlarni kompyuteringizga o'rnatganingizdan so'ng, virtual ketma-ket port paydo bo'lishi mumkin. Siz drayverlarni haydovchining veb-saytidan yuklab olishingiz mumkin(Virtual com port). Avval adapterni kompyuterga ulaymiz va drayverlarni o'rnatamiz (agar kerak bo'lsa). Ulanish mumkin

RX STM32F103C8 platasida mavjudі Portlarni ko'rish TX USB 2.0 to'liq tezlikda interfeys oxirgi daqiqadan oldin tashqariga chiqing STM32F103C8 platasida mavjud USART1 Portlarni ko'rish mikrokontroller.

adapter ulangan USB 2.0 to'liq tezlikda interfeys mikrokontroller (A9).

mikrokontroller (A10).

USART-USB bo'laklari 3,3V quvvatdan chiqib ketishi va platani yangisi bilan ta'minlashi mumkin. Mikrokontrollerni dasturlash rejimiga o'tkazish uchun siz mikrodasturni o'rnatishingiz kerak

kerakli joyda, tugma bilan qayta ishga tushiring

Yoki uni yoqing va mikrokontrollerning ishlash muddatini yoqing.

Kim uchun biz dam olishimiz kerak.

Turli kombinatsiyalar mikrokontrollerni turli rejimlarda o'rnatadi.

Bizni to'xtatadigan yagona rejim bor.

Nima uchun mikrokontroller tepada?

Yoki uni yoqing va mikrokontrollerning ishlash muddatini yoqing.

mantiqiy bo'lishi mumkin, lekin tepada

- Mantiqiy nol.

Plastinkadagi jumperning holati quyidagicha: Noqonuniy nusxa ko'chirish, iqtibos keltirish yoki qayta yaratish qonuniy tergovga tortiladi! Tugmani bosgandan so'ng STM32F103C8 platasida mavjudі Portlarni ko'rish nazoratchining normal ishlashi uchun standart pozitsiyani buzmang va javobgardir.

(rus tili kitobi)

STM32 markalash mashinasi

Qurilmalar oilasiMahsulot turiQurilma kichik oilasiPin soniFlash xotira hajmiPaketHarorat oralig'i
Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor). =
ARM asosidagi 32 bitli mikrokontroller
F = Umumiy maqsadli
L = Ultra past quvvat
TS = Sensorli ekran
W = Chipdagi simsiz tizim
60 = multitouch rezistiv
103 = ishlash chizig'i
F = 20 pin
G = 28 pin
K = 32 pin
T = 36 pin
H = 40 pin
C = 48/49 pin
R = 64 pin
O = 90 pin
V = 100 pin
Z = 144 pin
I = 176 pin
B = 208 pin
N = 216 pin
4 = 16 Kbayt Flash xotira
6 = 32 Kbayt Flash xotira
8 = 64 Kbayt Flash xotira
B = 128 Kbayt Flash xotira
Z = 192 Kbayt Flash xotira
C = 256 Kbayt Flash xotira
D = 384 Kbayt Flash xotira
E = 512 Kbayt flesh xotira
F = 768 Kbayt flesh xotira
G = 1024 Kbayt Flash xotira
I = 2048 Kbayt Flash xotira
H = UFBGA
N = TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Sanoat harorati oralig'i -40…+85 °C.
7 = Sanoat harorati oralig'i, -40…+105 °C.
Ammo hamma narsa juda og'ir va og'ir (dasturlash nuqtai nazaridan u ancha sodda bo'lsa-da, lekin men bayramlar mavzusini ko'tarmayman, har kimning o'z didi bor).F103 C8 T6

Yozish/o'qishdan qanday himoyalanish mumkin?

Agar siz STM32F103 platasini olib tashlagan bo'lsangiz, lekin dasturchi ishlamasa, bu xitoyliklar mikrokontrollerning flesh-xotirasini o'g'irlaganligini anglatadi.

Oziq-ovqat "keyingi nima?"

Keling, hurmat bilan pozani yo'qotaylik.

Bloklashni olib tashlash uchun u orqali dasturlashtiriladigan UART adapterini ulang.

Biz dasturlash uchun jumperlarni o'rnatdik va yo'lga chiqamiz:

Men qo'shimcha stm32flash yordam dasturi uchun Ubuntu bilan ishlayman.

1. Mikrokontrollerning ko'rinib turishini tekshiramiz:

Sudo stm32flash /dev/ttyUSB0

Quyidagilarni ayblash kerak:

Defraggler (Ukraina Defragler) - bu boshqa dunyoda bo'lgani kabi qattiq diskni defragmentatsiya qilish uchun bepul dastur.