Щурм на STM32, микроконтролер под микроскоп

Вероятно вече знаете как работи компютърът. Дори на ежедневно ниво си представяте какво е RAM и ROM памет. Знаете също, че информацията в компютъра е представена в двоична форма. Тези знания обаче не са достатъчни, за да започнем работа с микроконтролера.

В допълнение към вече споменатите типове памет и самото процесорно ядро, микроконтролерът включва регулатор на напрежението, генератор на тактов сигнал, системна шина, различни контролери, системен блок за прекъсване, периферни устройства и др.

stm32
Изображение от Wikipedia, ARM архитектура

Първото нещо, с което обаче ще трябва да се запознаем, е особен вид памет, наречена „регистър“.

Какво е регистър?

Тъй като ще използваме езика за програмиране C, ще бъде правилно да си припомним някои операции, които ще ни позволят бързо и удобно да зададем необходимите битове в регистъра. Първото нещо, което трябва да запомните, са операциите за побитово преместване. Да кажем, че трябва да получим числото 8. Вече знаем, че 810 = 10002. Следователно, за да получим 8, просто трябва да преместим "1" в паметта три позиции наляво. Можете да го направите така:

Битът, който искаме да променим, ще се нарича маска. Маската ще ни позволи директен достъп до желания бит от регистъра.

Нуждаем се обаче и от побитовите логически операции И, ИЛИ и НЕ. За да запишем "1" в желания бит от регистъра, можем да действаме върху регистъра бит по бит с маска, използвайки операцията "OR". Помислете за таблицата на истината:

Както можете да видите, ако имаше „1“ в бита на регистъра, тогава няма да го презапишем с нашата маска и ще променим само бита, който ни интересува. Можете да го направите така:

За да напишем "0" в необходимия бит, имаме нужда от операцията "И", таблицаистината за което е показана по-долу:

Както можете да видите, ще изтрием всички битове, които не съдържат "1". Преди да приложим тази операция, трябва да обърнем маската (т.е. да приложим операцията „НЕ“):

Сега приложете операцията И към регистъра, като използвате модифицираната маска:

Краткият запис изглежда така:

Сега сме готови да работим с регистри, но преди това, няколко думи за други важни части на микроконтролера.

Какво представляват I/O портовете?

Портът не е само един крак на микроконтролера: в нашия случай на един порт са разположени до 16 крака (номерирането е от 0 до 15). На свой ред портовете са маркирани с букви - A, B, C и т.н. Например, светодиодът е свързан към крака PD8 (порт D, крак 8). Кракът може да има няколко режима на работа и те се конфигурират чрез съответните регистри. Как да намерите тези регистри, как се наричат ​​и какво трябва да се направи с тях, за да активирате този или онзи режим, ще говорим на практика и сега ще разгледаме тези режими. По-долу е дадена диаграма на структурата на единия крак на нашия MK (вижте Фигура 11. Основна структура на стандартен I / O порт бит).

щурм

Първата отличителна черта, която може да се забележи (и просто да се изведе от името) е, че кракът може да работи като вход и изход. Изходът има четири режима на работа:

От своя страна входът има различни режими на работа:

  • плаващ вход (англ. input floating) - издърпването е деактивирано (без издърпване, кракът е в състояние Hi-Z, което означава, че входното съпротивление е високо и всяко електрическо прихващане (смущение) може да причини „1“ или „0“ да се появи на такъв вход);
  • изтеглен вход (англ. input pull-up) - издърпване до мощност (за STM32 обикновено е 3,3 волта);
  • вход изтеглен додъно (англ. Input-pull-down) - издърпване към земята (0 волта);
  • аналогов вход (англ. analog) - ако кракът е конфигуриран като аналогов вход, тогава се използва ADC модулът, ако е свързан към този крак.
трябва

За да използвате GPIO, вие също трябва да активирате клокването на портове ... и за това трябва да разберете какво е клокване!

Какво е система за време?

Какво е сърцето на микроконтролера, какво го кара да работи? Когато избирате компютър в магазин, вероятно сте обърнали внимание на такъв индикатор като „тактова честота“.

Тактовият сигнал или часовниковият сигнал е сигнал, който се използва за координиране на операциите на една или повече цифрови схеми. Тактовият сигнал обикновено е с квадратна вълна и осцилира между високи и ниски логически нива. В най-първото приближение тактовата честота характеризира производителността на подсистемата (процесор, памет и т.н.), т.е. броят на операциите, извършвани в секунда. Въпреки това, системи с една и съща тактова честота може да имат различна производителност, тъй като различните системи може да изискват различен брой цикли, за да завършат една и съща операция.

Заслужава да се отбележи, че работата на всички подсистеми на микроконтролера зависи от това дали те получават тактови сигнали или не, както и каква честота са тези сигнали. С други думи, няма часовников сигнал - периферията не работи. По подразбиране периферният часовник в STM32 е деактивиран и трябва да го свържете ръчно. За това се използва модулът RCC (англ. Нулиране и управление на часовника), но повече за това по-късно.

Източникът на тактовия сигнал е така нареченият тактов генератор. Може да се приложи по различни начини, като се използват различни физически ефекти.

  • RC верига епроста осцилаторна верига, базирана на използването на RC верига, т.е. резистори и кондензатори се използват за генериране на тактов импулс. Недостатъкът на такъв генератор е неговата ниска точност (например, такъв генератор не се препоръчва за часовници).
  • Кварцовият или керамичният резонатор е по-точен източник на часовникови импулси, базиран на пиезоелектричния ефект.

По-долу има диаграма за нашия микроконтролер, обясняваща как се извършва тактовата честота (вижте [18] Фигура 2. Дърво на часовника).

който

  • HSI 8 MHz RC осцилатор (High Speed ​​​​Internal) - вътрешен високоскоростен 8 MHz RC осцилатор (при различни температурни условия честотата може да варира от 7,3 MHz до 8,7 MHz). От името става ясно, че се намира директно в микроконтролера и е RC верига. Задейства се при подаване на захранване към микроконтролера.
  • HSE осцилаторен часовник (High Speed ​​​​External) - външен високоскоростен кристален (т.е. кварцов или керамичен) резонатор или външен осцилатор, който е свързан към съответните щифтове на MK.
  • PLL часовник (Phase-Locked Loop) - система с фазово заключена верига (PLL), която ви позволява да умножите честотата от първия и втория тип източник с коефициент от 2 до 16.

В допълнение, микроконтролерът съдържа нискоскоростни (по отношение на горните) източници.

  • 40 kHz нискоскоростен вътрешен RC (LSI RC) - вътрешен 40 kHz RC осцилатор, този осцилатор се използва, когато MK преминава в енергоспестяващ режим.
  • 32.768 kHz нискоскоростен външен кристал (LSE кристал) - външен осцилатор за модула на часовника за реално време при 32.768 kHz, който ниеще говорим в този курс.
  • 14 MHz високоскоростен вътрешен RC (HSI) е специален вътрешен RC осцилатор за ADC модула.

В момента се нуждаем от цялата тази информация само за да :

  • разберете какво е „честотата на микроконтролера“, колко бързо работи (работната честота на нашия MK е 24 MHz);
  • разберете, че за да стартирате периферното устройство, е необходимо да активирате тактовата честота за това периферно устройство.

Нашата цел не е да дадем изчерпателно описание на ядрото, а напротив, целта ни е да дадем повърхностна представа, за да можем да започнем да правим поне нещо. Повече подробности за архитектурата на ядрото могат да бъдат намерени в специални издания или в документацията (диаграмата е представена в документацията Фигура 1. Системна архитектура на линия с ниска и средна плътност).

Cortex включва не само ядрото, но и различни компоненти за управление и отстраняване на грешки, които са свързани помежду си с шини AHB и APB. Още два компонента, които ще ни трябват в бъдеще са:

  • NVIC е интегриран контролер за прекъсване, за който ще говорим по-късно. Броят на възможните прекъсвания се определя от производителя на чипа. Този контролер е тясно свързан с ядрото и съдържа контролните регистри на системата.
  • SysTick - системен таймер, който е субтрактивен брояч, който може да се използва за генериране на прекъсвания на редовни интервали (дори ако MCU е в режим на заспиване)
трябва

Това може би е всичко, което трябва да знаете за микроконтролера сега, за да започнете да го програмирате. Все пак... преди това малко за стандартните библиотеки.