General-purpose input/output (GPIO) у STM32F103C8T6 або Blue Pill.

Складність налаштування пінів Blue Pill потребує глибокого вивчення Datasheet. Це не завжди виправдано, адже інколи достатньо декількох вхідних і декількох вихідних сигналів. STM32 має складну і не завжди зрозумілу архітектуру.

Arduino IDE привчило до легкого налаштування портів вводу-виводу. Точніше навіть не портів а легкому налаштуванню окремих пінів на вхід-вихід.  Налаштування пінів Blue Pill   на вхід-вихід набагато складніша, і розділ General-purpose input/output чи як звично для нас — GPIO дуже суттєва частина Datasheet  але про все по порядку.

Зверніть увагу на «технічні піни».

Зауважу зразу — є так звані «технічні піни» які краще не чіпати. А зачіпаючи треба бути з ними дуже обережними. Це може попередити перетворення мікропроцессора в кирпич. Дорогий технологічно складний та мертвий без спеціальних маніпуляцій кристал.

Особливо треба бути обережним з  РА11 та РА12 — до них підключений порт USB.  Неправильне налаштування А11 та А12 може пошкодити ще й порт USB ноута чи компа.

Є ще два технічних піни це РС14 та РС15 — до цих пінів підключений зовнішній кварц 32.768 . При перепрограмуванні цих пінів втратиться функція годинника реального часу та можуть пошкодитись чи працювати не належним чином.

Краще буде якщо просто виключити ці чотири піни з можливого простору доступних для програмування. І ще одне — треба безпечно проводити налаштування пінів на вхід/вихід. Звертаю увагу на те що піни організовані в порти. Порти в свою чергу налаштовуються регістрами , а модификація регістрів може зачепати одночасно багато пінів. Виходить, що маніпуляції треба проводити так щоб не зачепити інші біти в регістрі.

 

Почати потрібно напевне з маленької але дуже важливої деталі — STM32 це логіка 3,3 Вольтова. Мікроконтроллер працює на такій напрузі. Тому відповідно всі сигнали вхідні та вихідні розраховані на 3,3 Вольта.  Якби не було можливості маніпулювання з налаштуваннями вихідних каскадів пінів, було б дуже складно підключати периферію та отримувати вхідні сигнали від датчиків.

Справедливо буде тут звернути увагу, що є датчики та переферія 3х вольтова. Є в тому числі і різноманітні екрани які працюють на 3,3 Вольтах. Але це скоріше виключення ніж правило. Тому хочеться нам того чи ні — доведеться адаптуватися до цих умов.

Виробник ввів поняття 5 Вольт толерантні входи та виходи що це значить?

Плата blue pill піни та альтернативні функції виходів
Pin blue pill

Вызьмем наприклад наступну схему  Blue Pill . Толерантні до 5  Вольт піни позначені замальованими точками.

5V Tolerance input Blue Pill.

Трохи теорії без нудних схематичних картинок. Сучасні мікроконтролери мають захисні  діоди на виході які підключені до землі та до піна живлення. В толерантних до 5 Вольт пінів катоди захисних діодів підключені до 5 Вольтового живлення. В інших до 3,3 Вольтової шини.  Тому  подачі на вхід напруги більшої ніж 3,3 вольти призведе до незворотніх процесів. Вхід просто згорить, а може й не тільки даний пін а й ще щось чи взагалі все.

Для правильного налаштування пінів Blue Pill на роботу на вхід треба розуміти та знати схему як влаштований вхідний каскад. Ми звикли в Arduino IDE до макросу

pinMode(btnPin, INPUT_PULLUP);

Blue Pill дозволяє трохи розширити це поняття та додає можливість Input with pull-up / pull-down, але цю функцію потрібно правильно налаштувати.налаштування пінів Blue Pill

та треба розуміти що резистор підтяжки може бути тільки до шини 3,3 вольта. Підключення навіть толерантного до 5 Вольт входу в режимі Input pull-up до вхідного сигналу 5 Вольтової логіки скоріше всього призведе до пошкодження піну або навіть порту чи ще чогось. Тому при роботі з 5 Вольтовими вхідними сигналами треба використовувати лише режим Floating input .

При налаштуванні пінів Blue Pill в режим Floating input схематично толерантні до 5 Вольтової логіки вхідні піни можна зобразити спрощено приблизно так налаштування пінів Blue Pill

при цьому вхід типу «висить в повітрі» — він не має свого сталого потенціалу і без зовнішнього сигналу може читатись як 1 і як 0.

Еквівалентна схема входу не толерантного до 5 Вольт буде таканалаштування пінів Blue Pill

при подачі на вхід сигналу більшого за 3,7 вольта відкриється верхній діод позначений червоним на картинці а що після цього вийде з ладу можна тільки гадати.

На схемі Pin blue pill позначені як толерантні до 5 Вольт так і суто 3х вольтові вихідні піни. Для налаштування пінів Blue Pill на роботу з 5 Вольтовою периферією можна використовувати лише толерантні до 5 Вольт входи-виходи мікроконтролера.

Схема налаштування пінів Blue Pill .

Для розуміння як це працює я буду далі налаштовувати окремий порт, для налаштування іншого порту використовуються такі самі регістри тільки в назві міняється одна літера — наприклад для порту А — GPIOA_CRL ; для порту В — GPIOB_CRL ; для порту C — GPIOC_CRL

За налаштування пінів порту В на вхід відповідає слідуючий набор регістрів мікроконтролеру STM32 :

  • GPIOB_CRL
  • GPIOB_CRH
  • GPIOB_ODR
  • RCC_APB2ENR

Почнемо з доступу до адресного простору мікроконтролеру.


#define GPIOB_BASE 0x40010C00
#define GPIOB_CRL ((volatile uint32_t *)(GPIOB_BASE+0x00))
#define GPIOB_CRH ((volatile uint32_t *)(GPIOB_BASE+0x04))
#define GPIOB_ODR ((volatile uint32_t *)(GPIOB_BASE+0x0C))
#define RCC_BASE 0x40021000
#define RCC_APB2ENR ((volatile uint32_t *)(RCC_BASE+0x18))

Це та частина налаштування пінів Blue Pill яка працює безпосередньо на рівні доступу до регістрів налаштування. Поки в Вас не виникло бажання лізти в цей ліс, просто копіпастіть в свої проекти — це працює.
Тепер особливості налаштування пінів Blue Pill які були відсутні в Arduino IDE при роботі з платами Arduino.  Переферійні модулі — а порти — це переферійні модулі для Blue Pill — працюють тільки якщо їм подати строб — сигнал тактування порту.  Трохи заглибимось в внутрішню будову мікроконтролеру — самі по собі піни — це біти від байту — порту. Тобто кожен окремий вихід порту в данному випадку В — це один біт від байту порту В.

Тобто байт порту В це:

В == В15:В14:В13:В12:В11:В10:В9:В8:В7:В6:В5:В4:В3:В2:В1:В0

Так саме організовані і інші порти А,С. Так само організовані порти і біти в старших сімействах мікроконтролерів. Це потрібно щоб розуміти — достатньо ввімкнути тактовий сигнал для порту В і всі піни порту В можуть працювати після відповідного налаштування кожного. Але для того щоб працював пін порту А треба ввімкнути тактовий сигнал для порту А.

За вмикання тактового сигналу порту В відповідає біт 3 IOPBEN регістру RCC_APB2ENR. Для того щоб не зашодити іншим налаштуванням і випадково не збити можливі попередні настройки регістру RCC_APB2ENR використовуємо бітову операцію

*RCC_APB2ENR |= 0x00000008;

ця процедура підключає сигнал генератора і вмикає порт В для роботи на вхід-вихід. Далі іде налаштування пінів Blue Pill на роботу окремих бітів порту В на вхід.

input mode налаштування пінів Blue Pill .

Напишем заміну для Arduino IDE до макросу

«pinMode(btnPin, INPUT_PULLUP);»

GPIOx_CRH
GPIOx_CRH із Datasheet

Для налаштування кожного із пінів Blue Pill є чотири біти — два біти CNFy — Port x configuration bits та два біти MODEy — Port x mode bits. Дотично до нашого вибраного порту В налаштування пінів Blue Pill буде мати таку абревіатуру:

є чотири біти — два біти CNFy — Port В configuration bits та два біти MODEy — Port В mode bits.

Для піну PB15 це буде так : CNF15[31:30] — Port В configuration bits

Та для 15 піну буде : MODE15[29:28] —  Port В mode bits.

для піну PB14 налаштування пінів Blue Pill  :

  • CNF14[27:26] — Port В configuration bits
  • MODE14[25:24] —  Port В mode bits.

А для піну PB13 налаштування пінів Blue Pill  :

  • CNF13[23:22] — Port В configuration bits
  • MODE13[21:20] —  Port В mode bits.

Та нерашті налаштування пінів Blue Pill для піну PB12 :

  • CNF12[19:18] — Port В configuration bits
  • MODE12[17:16] —  Port В mode bits.

далі по таблиці з даташиту якщо потрібно.

За що відповідає пара бітів CNF та пара бітів MODE.

Розберем за що відповідає пара бітів CNF : These bits are written by software to configure the corresponding I/O port. В перекладі це означає що пара бітів CNF конфігурує роботу конкретного біту в залежності від того налаштований біт на вхід чи на вихід.
In input mode (MODE[1:0]=00):
00: Analog mode
01: Floating input (reset state)
10: Input with pull-up / pull-down
11: Reserved
In output mode (MODE[1:0] >ѓn00):
00: General purpose output push-pull
01: General purpose output Open-drain
10: Alternate function output Push-pull
11: Alternate function output Open-drain

Розберем за що відповідає пара бітів MODE :

00: Input mode (reset state)
01: Output mode, max speed 10 MHz.
10: Output mode, max speed 2 MHz.
11: Output mode, max speed 50 MHz.

В перекладі пара бітів MODE відповідає за налаштування біту на вхід (00) або на вихід з різними параметрами.

Налаштування пінів Blue Pill на прикладі PB12.

Для розуміння як це працює простіше всього демонструвати на прикладі. Нехай це буде PB12. На платі Blue Pill він підписаний як B12налаштування пінів Blue Pill

дивимось на можливості цього піну — він толерантний до 5 Вольт та є звичайним цифровим виходом з альтернативною функцією при використанні в якості SS2 в інтерфейсі SPI2. Альтернативна функція даного піну нам наразі не цікава , тому обмежимося налаштуваннями як цифрового входу або як цифрового виходу .

Наші керуючі біти в регістрі GPIOВ_CRH це :

  • CNF12[19:18] — Port В configuration bits
  • MODE12[17:16] —  Port В mode bits.

Для того щоб не нашкодити іншим моржливим налаштуванням та блокам программи треба провести дві процедури — маніпуляції з регістром GPIOВ_CRH.

  1. стерти біти конфігурації — CNF12 та MODE12 — тобто біти 16,17,18,19 регістру GPIOВ_CRH
  2. встановити потрібні біти GPIOВ_CRH

Корисна програма «калькулятор» в режимі «програміст».

для наглядності процесу можна користуватись звичайним віндовс калькулятором в режимі «програміст»

Треба пам’ятати що всі біти та всі регістри починаються з нульового біту та не робити зв’язаних з цим помилок. Отже для того щоб обнулити потрібні нам біти та не зачіпити випадком інші, зручно використовувати бітову операцію множення на маску.  Ми всі добре знаємо що якщо помножити будь яке число на нуль то в результаті буде нуль.

Використаємо наш калькулятор для того щоб зробити маску регістра. Регістр 32 розрядний — тобто чотирьохбайтний. Нулі повинні бути на місці 16,17,18,19 біту.

Безпечна послідовності маніпуляцій з керуючим регістром.


Тепер помножимо наш регістр на цю маску і результат запишем в регістр GPIOВ_CRH.  Для цього треба зробити такі маніпуляції :

  • зчитати регістр GPIOВ_CRH
  • побітово помножити на 0хFFF0FFFF
  • записати отримане значення в регістр GPIOВ_CRH

при такій послідовності маніпуляцій з регістром GPIOВ_CRH ми не чіпаючи жодного іншого скидаєм тільки біти відповідаючі за налаштування PB12.

Тепер треба записати в дані біти потрібну нам конфігурацію. MODE12 —  [17:16] bits регістру GPIOВ_CRH: 00: Input mode . тобто для переводу PB12 в режим входу треба щоб біти 16 та 17 регістру GPIOВ_CRH дорівнювали нулю.

Розберемось з бітами CNF12 — це [19:18]  bits регістру GPIOВ_CRH :

00: Analog mode
01: Floating input (reset state)
10: Input with pull-up / pull-down
11: Reserved

Варіант 00: Analog mode не працює з нашим PB12 тому що немає такої альтернативної функції у цього піну. Варіант 11: Reserved — це майбутні можливі конфігурації які наразі теж не працюють. Для налаштування піну PB12 Blue Pill доступні для режиму входу (який ми задали MODE12 бітами) два варіанти :

01: Floating input
10: Input with pull-up / pull-down

Налаштування пінів Blue Pill як Floating input.

Для вхідного сигналу рівню 5 Вольт доступний тільки варіант 01: Floating input — я раніше пояснював чому. Тобто треба встановити в 1 один біт під номером — 18.

MODE12 — [17:16] bits регістру GPIOВ_CRH = 00: Input mode .

CNF12 — це [19:18]  bits регістру GPIOВ_CRH = 01: Floating input

Процедура встановлення бітів в 1 так щоб не зачепити інші біти повинна проводитись бітовою операцією додавання за модулем 2 .

Ітого налаштування піну B12 Blue Pill на режим входу толерантно до 5 Вольтового сигналу буде в Arduino IDE виглядати так

*GPIOB_CRH &= 0хFFF0FFFF;
*GPIOB_CRH |= 0х00040000;

Для того щоб застосувати режим підтяжки або до плюсу 3,3 Вольт або до земляного контакту, треба змінити налаштування пінів Blue Pill наприклад таким чином як я напушу далі. Але зверніть увагу, що при включенній підтяжці , вхід може працювати тільки з 3,3 вольтовою логікою.

Для налаштування піну PB12 Blue Pill  для режиму входу (який ми задали MODE12 бітами) з підтяжкою треба щоб

CNF12 — це [19:18]  bits регістру GPIOВ_CRH = 10: Input with pull-up / pull-down

*GPIOB_CRH &= 0хFFF0FFFF;
*GPIOB_CRH |= 0х00080000;

але — треба знати що підтяжка перемикається бітом регістру GPIOB_ODR. Для корректного підключення pull-down все таки бажано скинути в 0 відповідний біт 12 цього регістру. Так що правильно буде підтяжку до нуля B12 зробити таким чином

Налаштування піну B12  Blue Pill з підтяжкою pull-down.


*GPIOB_CRH &= 0хFFF0FFFF;
*GPIOB_CRH |= 0х00080000;
*GPIOB_ODR &= 0xFFFFEFFF;

відповідно підтяжка входу до шини 3,3 Вольт буде реалізована наступним кодом

Налаштування піну B12  Blue Pill з підтяжкою pull-up.


*GPIOB_CRH &= 0хFFF0FFFF;
*GPIOB_CRH |= 0х00080000;
*GPIOB_ODR |= 0x00001000;

На завершення для лінивих налаштування пінів Blue Pill B12, B13, B14, B15 — на вхід  для роботи з 5 Вольтовою логікою.

#define RCC_BASE 0x40021000
#define RCC_APB2ENR ((volatile uint32_t *)(RCC_BASE+0x18))
#define GPIOB_BASE 0x40010C00
#define GPIOB_CRL ((volatile uint32_t *)(GPIOB_BASE+0x00))
#define GPIOB_CRH ((volatile uint32_t *)(GPIOB_BASE+0x04))
#define GPIOB_ODR ((volatile uint32_t *)(GPIOB_BASE+0x0C))
#define RCC_BASE 0x40021000
#define RCC_APB2ENR ((volatile uint32_t *)(RCC_BASE+0x18))
void setup() {
*RCC_APB2ENR |= 0x00000008; // port B clock enable
*GPIOB_CRH &= 0x0000FFFF; // PB12,PB13,PB14,PB15 - маска
*GPIOB_CRH |= 0x44440000; // PB12,PB13,PB14,PB15 - Floating input
}

Output mode налаштування пінів Blue Pill .

За налаштування піну на вихід відповідає той же набір регістрів. Саме налаштування теж схоже але є деякі відмінності. Отже за налаштування пінів порту В відповідають

  • GPIOB_CRL
  • GPIOB_CRH
  • RCC_APB2ENR

По підключенню тактового сигналу для порту все ідентично, більше того, якщо в скетчі вже вмикалось один раз тактування порту, то не треба повторно це робити. Навіть якщо одні піни порту працюють на вхід інші альтернативні функції а нам треба щоб був цифровий вихід — одного разу встановлення біту в RCC_APB2ENR достатньо на всі біти порту В. Доречі, для вмикання бітів наприклад порту А або порту С треба встановлювати інший біт в регістрі.

Налаштувань пінів порту на вихід.

Tепер що стосується налаштувань пінів порту на вихід. Згідно таблиці з GPIOx_CRH із Datasheet для налаштування пінів порту В Blue Pill як вихідних необхідно правильно записати чотири біти — два біти CNFy — Port В configuration bits та два біти MODEy — Port В mode bits.

Спочатку треба записати два біти MODEy в режим виходу :

01: Output mode, max speed 10 MHz.
10: Output mode, max speed 2 MHz.
11: Output mode, max speed 50 MHz.

Що це означає? — в мікроконтролерах STM32 дуже часто використовується режим енергоекономії. Це дуже актуально при живленні від аккумулятора чи батарейки. В залежності від частоти на якій працює пристрій збільшується чи зменшується споживання струму. Чим більша частота тим більше споживання енергії від джерела живлення. Для наших проектів в основному не суттєва економія цих мікроампер, тому можна вибирати максимальну частоту для роботи порту — тобто max speed 50 MHz що означатиме біти MODEy =  1:1.

Насправді, дуже рідко необхідна частота 50 MHz і в більшості випадків можна використати навіть 2 MHz але якщо є можливість їздити на форсажі чому б ні.

Тепер залишається визначитись з режимом в якому буде працювати вихід порту В — тобто записати біти CNFy

00: General purpose output push-pull
01: General purpose output Open-drain

 

Налаштування пінів Blue Pill в output push-pull.

З самого початку я акцентував увагу на роботі виходів з 5 Вольтовою логікою, але для повної картини, я поясню і логіку роботи в режимі 3,3 Вольтових сигналів.налаштування пінів Blue Pill

не треба плутати толерантність до 5 Вольт та необхідність розуміти логіку схемотехніки вихідного каскаду.  Якщо якимось чином 5 вольт будуть присутні при підключенні піну в режимі push-pull то можливі непередбачувані ситуації, тому навіть толерантність до 5 Вольт не дає право в цьому режимі працювати з сигналами 5 Вольтового рівня.

Налаштуємо піни порту В в режимі push-pull.

Отже налаштуємо піни порту В в режимі push-pull. Пропоную для прикладу зупинитись на пінах PB6,PB7,PB8,PB9 які на платі Blue Pill позначені як B6, B7, B8, B9.  Дуже добре що налаштування виявились в різних регістрах. Точніше так — за комплекс налаштувань пінів порту В на вхід-вихід відповідає не один регітр а регістрова пара GPIOB_CRH та GPIOB_CRL

Біти PB8,PB9 які на платі відповідають контактам B8, B9 керуються бітами регістру GPIOB_CRH а біти PB6,PB7 які на платі відповідають контактам B7, B6 керуються бітами регістру GPIOB_CRL

Розглянемо налаштування пінів регістру GPIOB_CRH Blue Pill для піну PB8 :

  • CNF8[3:2] — Port В configuration bits
  • MODE8[1:0] —  Port В mode bits.

Також налаштування пінів регістру GPIOB_CRH Blue Pill для піну PB9 :

    • CNF9[7:6] — Port В configuration bits
    • MODE9[5:4] —  Port В mode bits.

І налаштування пінів регістру GPIOB_CRL Blue Pill для піну PB6 :

  • CNF6[27:26] — Port В configuration bits
  • MODE6[25:24] —  Port В mode bits.

Ще налаштування пінів регістру GPIOB_CRL Blue Pill для піну PB7 :

  • CNF7[31:30] — Port В configuration bits
  • MODE7[29:28] —  Port В mode bits.

Раніше я пропонував MODEy = [1:1] а для роботи в режимі Push-pull CNFy = [0:0]  Візьмем до прикладу налаштування біту 7 порту В , тобто піну PB7 або як написано на платі піну B7.

CNF7[31:30] = 0:0

MODE7[29:28] = 1:1

в регістрі GPIOB_CRL спочатку з допомогою маски обнулим необхідні біти [31:30:29:28] побітно помноживши GPIOB_CRL на 0x0FFFFFFF а потім множення по модулю2 на необхідне нам значення

в результаті не в залежності від налаштувань інших пінів.  Не зачепивши їх жодним чином ми налаштуємо наш PB7 на роботу в режимі Push-pull .

*GPIOB_CRL &= 0x0FFFFFFF;
*GPIOB_CRL |= 0х30000000;

Налаштування пінів Blue Pill на роботу з 5 Вольтовими вихідними механізмами.

Може скластись враження, а може воно так і є , що виробники STM32 вимушено додали можливість організувати вихід з відкритим стоком. Це аналог виходу з відкритим колектором. Якщо подивитись на схему налаштування пінів Blue Pill

то можна побачити звичайний ключовий режим для транзистора. Єдиним зауваженням буде те що цей транзистор знаходиться на кристалі мікропроцессора плати Blue Pill і в нас з’являється можливість підлючити безпосередньо наприклад світлодіод опторозв’язки до стоку цього транзистору.

Я прихильник трошки іншого методу. Я використовую режим роботи Open-drain для конвертування сигналу в 5 Вольтовий рівень. Роблю це за допомогою звичайного резистору підключеного до шини 5 Вольт. Така нехитра маніпуляція дозволяє підключати на вихід як потужні ключові транзистори так і мікросхеми 5 Вольтової логіки.налаштування пінів Blue Pill

в більшості випадків достатнім є приблизно 510 Ом ний номінал.

Налаштування бітів порту В.

Візьмем до прикладу налаштування біту 7 порту В. Тобто піну PB7 . Або, як написано на платі , піну B7 в режимі Open-drain . Регістр GPIOB_CRL

CNF7[31:30] = 0:1

MODE7[29:28] = 1:1

В регістрі GPIOB_CRL спочатку з допомогою маски обнулим необхідні біти [31:30:29:28] побітно помноживши GPIOB_CRL на 0x0FFFFFFF

а потім множення по модулю2 на необхідне нам значення

в результаті ми отримаємо код для Arduino IDE . З налаштованим 7 бітом порту В на роботу з 5-ти вольтовим сигналом. Чи наприклад потужним мосфетом логічного рівня керування.

*GPIOB_CRL &= 0x0FFFFFFF;
*GPIOB_CRL |= 0х70000000;

після таких маніпуляцій з налаштуваннями бітів прямим записом у регістри функції Arduino IDE працюють як зі звичайним Arduino Nano чи Arduino Mega. Але замість пуш пул може бути відкритий сток наприклад. Це дозволяє додаванням простого незрозумілого коду займатись далі програмуванням на високому рівні не спускаючись до низькорівневої логіки.

Наприклад класичний

digitalWrite(PB7, !digitalRead(PB7));
delay(1000);

буде нормально працювати. Звичайно, тільки якщо ви не будете прописувати в сетапі

pinMode(PB7, OUTPUT);

Адже ми зробили налаштування біту в регістрах і використовувати цей макрос вже недоречно в даному скетчі.
Для особливо лінивих додам код налаштування.

*GPIOB_CRH &= 0xFFFFFF00; // - маска
*GPIOB_CRH |= 0x00000033;
*GPIOB_CRL &= 0x00FFFFFF; // - маска
*GPIOB_CRL |= 0x77000000;
// *RCC_APB2ENR |= 0x00000008;

Данний код налаштовує PB6,PB7 в режимі пуш пул. Це відповідає  3,3 вольтовій логіці.  PB8,PB9 в режимі відкритого стоку і можливості 5 Вольтового виходу.

Скетч на чотири входи та чотири виходи.

Об’єднуючи все налаштування можна зробити кальку для проекту на чотири входи. B12, B13, B14, B15 — на вхід  для роботи з 5 Вольтовою логікою. Та чотири виходи 2 з яких пуш пул та два відкритий сток .  PB6,PB7 в режимі пуш пул та 3 вольтовій логіці а PB8,PB9 в режимі відкритого стоку і можливості 5 Вольтового виходу.

// Farik 20.09.2023
// https://farion.top/blue-pill/
#define RCC_BASE 0x40021000
#define RCC_APB2ENR ((volatile uint32_t *)(RCC_BASE+0x18))
#define GPIOB_BASE 0x40010C00
#define GPIOB_CRL ((volatile uint32_t *)(GPIOB_BASE+0x00))
#define GPIOB_CRH ((volatile uint32_t *)(GPIOB_BASE+0x04))
#define GPIOB_ODR ((volatile uint32_t *)(GPIOB_BASE+0x0C))
#define RCC_BASE 0x40021000
#define RCC_APB2ENR ((volatile uint32_t *)(RCC_BASE+0x18))
void setup() {
*RCC_APB2ENR |= 0x00000008; // port B clock enable
*GPIOB_CRH &= 0x0000FFFF; // PB12,PB13,PB14,PB15 - маска
*GPIOB_CRH |= 0x44440000; // PB12,PB13,PB14,PB15 - Floating input
*GPIOB_CRH &= 0xFFFFFF00; // - маска
*GPIOB_CRH |= 0x00000033;
*GPIOB_CRL &= 0x00FFFFFF; // - маска
*GPIOB_CRL |= 0x77000000;
pinMode(PC13, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(PC13, !digitalRead(PC13));
digitalWrite(PB7, !digitalRead(PB7));
delay(1000);
Serial.println(" Слава Українi! ");
}