Є така приказка — звучить приблизно так : «недолугість законодавства нівелюється необов’язковістю його виконання».
Ситуація з Arduino IDE та stm32f103 blue pill приблизно відповідає цьому принципу. Arduino IDE дозволяє в stm32f103 blue pill робити налаштування безпосередньо в регістрах та портах вводу/виводу тому вміло оперуючи з регістрами можна легко обходити обмеження Arduino IDE.
Якщо порівняти можливості таймерів в Arduino платах з timer STM32 то звичайно захочеться користуватись можливостями stm32f103 blue pill а не arduino nano , arduino Leonardo , Arduino Mega. Але я не дарма виніс цитату в заголовок статті — для того щоб налаштувати таймер stm32f103 blue pill треба добре попрацювати. Виробник заклав в мікроконтролер дуже широкі можливості в плані гнучкості налаштувань та вхідних тактових сигналів. Крім цього вражає кількість вихідних сигналів та пожливості налаштувань вихідних пінів. Але — дивись цитату!
Думаю в межах однієї статті недоцільно пробувати охопити весь діапазон та всі можливості. Таймери stm32f103 blue pill мають дуже розвинутий функціонал. Тому буду поступово описувати деякі можливості таймерів. Почнемо з загальних можливостей stm32f103 blue pill і поступово розберемо особливу переферію деяких таймерів. Все буде відбуватись в рамках Arduino IDE та дозволить використовувати с своїх проектах деякі відрізки коду без необхідності глибокого вивчення Datasheet .
Різниця між stm32f103C6T6 blue pill та stm32f103C8T6 blue pill.
Cпрощення та здешевшання можуть мати деякі сюрпризи в своїй неочевидній частині. Але іноді, насправді дуже часто, китайці вміють здивувати. Тому читаючи уважно Datasheet треба пам’ятати цитату яку я виніс в заголовок статті. Дуже легко може вийти ситуація коли деякі функції які не повинні працювати в stm32f103C6T6 blue pill працюють так як вони повинні працювати в stm32f103C8T6 . Для серйозних проектів на це не потрібно розраховувати, а для хобійних проектів — саме воно.
Тому перед написанням якогось скетчу зовсім не зайвим буде перевірити як функціонує переферія на яку ви хочете розраховувати. Для цьго існує в Datasheet спеціальний розділ — Pinouts and pin description. В stm32f103 blue pill зазвичай паяється два типу мікропроцессорів. Дублювати повністю функціональність пінів з Datasheet не бачу ніякого сенсу, але в якості допомоги дам посилання на Datasheet stm32f103C6T6 та Datasheet stm32f103C8T6 .
Що треба шукати та як цим користуватися ? Загалом stm32f103 blue pill випускається для корпусів LQFP48. Тому в таблиці Pinouts and pin description нас цікавитиме колонка LQFP48 . Далі необхідно знайти альтернативні функції портів вводу/виводу. Що таке альтернативні функції?
Так історично склалось що мікроконтролери в початковому свому варіанті оперували тільки з бітами, байтами, одиничками та нуликами. Потім через надзвичайну затребованість деяких стандартних можливостей, як то , наприклад, лічильник, таймер, АЦП почали з’являтись додаткові функції. Вони були вбудовані в один кристал з мікроконтролером. А для здешевлення була необхідність втискування в маленький DIP корпус значно побільшавшого функціоналу. На ті ж самі лапи DIP корпусів почали виводити й ці — альтернативні з точки зору обчислуючого ядра функції.
Повертаємось до альтернативних функцій stm32f103 blue pill — адже зараз це основна плюшка STM32.
Виявилось що ми маємо чотири канали вихідних сигналів толерантних до 5 Вольт виходів. (рекомендую уважно прочитати що означає толерантність до 5 Вольт і які є обмеження). Це я детально описав в розділі налаштування пінів Blue Pill . Вихідні піни 6,7,8,9 знаходяться в порту В. Це піни 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] тому що можна собі дозволити частоту оновлення 50 MHz.
CNFy = [1:0] якщо ми налаштовуємо вихід на роботу в Push-pull режимі та 3,3 Вольтовим вихідним сигналом.
*GPIOB_CRH &= 0xFFFFFF00; // - маска
*GPIOB_CRH |= 0x000000BB;
*GPIOB_CRL &= 0x00FFFFFF; // - маска
*GPIOB_CRL |= 0xBB000000;
*RCC_APB2ENR |= 0x00000008;
CNFy = [1:1] якщо ми налаштовуємо вихід на роботу в Open-drain режимі та можливою роботою з 5 Вольтовим вихідним сигналом.
*GPIOB_CRH &= 0xFFFFFF00; // - маска
*GPIOB_CRH |= 0x000000FF;
*GPIOB_CRL &= 0x00FFFFFF; // - маска
*GPIOB_CRL |= 0xFF000000;
*RCC_APB2ENR |= 0x00000008;
Треба зразу зазначити що це був stm32f103C8T6 . У даташиті на stm32f103C6T6 в якості альтернативних функцій PB6, PB7, PB8, PB9 функцій TIM4 немає. Тому якщо у Вас stm32f103 blue pill на stm32f103C6T6 то скоріше всього доведеться використовувати інший таймер та інші піни.
Виявилося що для отримання чотирьох каналів доступні тільки виходи не толерантні до 5 Вольт PA0, PA1, PA2, PA3. На платі blue pill це відповідно A0, A1, A2, A3. Поки відкладем розгляд цього варіанту та зосередимося на stm32f103C8T6 blue pill .
TIM4 в режимі PWM в stm32f103 blue pill.
Є дуже гарне відео з налаштування таймеру blue pill для роботи в Arduino IDE . Починати налаштування таймеру треба зі схеми 
Зазвичай після побаченого більшість діє за принципом — та ну його! Це одночасно і погано — адже дуже сладна та незрозуміла схема. Та це й добре — бо дуже гнучке налаштування таймеру.
Спрощена схема вихідного каскаду TIM4 stm32f103C8T6 blue pill.

Простіше всього почати з вихідних каскадів. Візьмем до прикладу PB7.
В основного таймеру-лічильнику TIM4_CNT на шині висить чотири регістри співпадіння TIM4_CCR1, TIM4_CCR2, TIM4_CCR3, TIM4_CCR4. В кожен 32-бітний регістр записано 16-бітне значення в молодші біти . Старші біти не мають практичного значення в stm32f103 blue pill .
Як це працює? Лічильник CNT counter постійно порівнюється зі значенням в регістрі TIM4_CCR2 та при співпадінні отримує сигнал. Реакція на співпадіння залежить від налаштувань output control . І в залежності від налаштувань може видати як реакцію в порт В на пін PB7 так і інші дії — наприклад може викликати переривання. Розглянемо ці налаштування детальніше.
За налаштування реакції на співпадіння значення в регістрі TIM4_CCR1 відповідальні регістри TIM4_CCMR1 та . Всі ці налаштування в регістрах призведуть до вихідних сигналів на пін PB6 але не треба забувати що налаштування виведуть активний сигнал на пін в просторі мікроконтролеру. Для того щоб можна було користуватись виходом PB6 в плані підключення вихідних пристроїв чи світлодіодів чи ключових мосфетів треба налаштувати секцію GPIO для цього піну. В тому числі і підключити тактування порту В. Детальніше я це розглядав в цій статті . Це стосується всіх пінів PB6-PB9.
Пін PB7 конектиться відповідно до реакції на співпадіння значення в регістрі TIM4_CCR2 відповідальні регістри TIM4_CCMR2 та
За пін PB8 конектиться відповідно до реакції на співпадіння значення в регістрі TIM4_CCR3 відповідальні регістри TIM4_CCMR3 та
А пін PB9 буде працювати відповідно до реакції на співпадіння значення в регістрі TIM4_CCR4 за його відповідальні регістри TIM4_CCMR4 та
