Timer в stm32f103 blue pill та особливості налаштування в Arduino IDE.

Є така приказка — звучить приблизно так :  «недолугість законодавства нівелюється необов’язковістю його виконання».

Ситуація з 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 та