Починаємо працювати в STM32CubeMX. Частина 1

Вітаю аудиторію хабра, і хочу запропонувати вашій увазі перший пост, присвячений використанню середовища розробки STM32CubeMX, написаний для тих, хто хоче почати вивчення STM32 «з нуля».



Я планував написати кілька постів, розглянувши кілька периферійних пристроїв мікроконтролера та їх конфігурування в STM32CubeMX. Але ці пости не замінюють фірмової документації і не претендують на повноту. У них будуть розглянуті тільки деякі, найбільш, на мій погляд, типові, приклади використання периферії STM32.
Сподіваюся, кому-то цей матеріал буде корисний.

1. Невелике введення
Спочатку зроблю невелике пояснення. Для вивчення даного матеріалу вам знадобиться налагоджувальна плата з мікроконтролером STM32. Я використовую плату STM32F746G Discovery, яка на сьогоднішній день є однією з найкращих, і, відповідно, дорогих плат сімейства Discovery.


Однак для освоєння більшої частини матеріалу буде достатньо будь-якої, навіть самої простої плати на STM32. Я рекомендую саме плати Discovery, т. к. вони вже містять відладчик ST-Link, і для роботи вам знадобиться тільки кабель MiniUSB. Для початку не потрібен навіть джерело живлення, плата живиться через той же кабель.

Природно, при використанні мікроконтролера, відмінного від STM32F746G потрібно буде робити поправки у проектах на іншу тактову частоту, іншу терморегулятори і т. п., але суть залишається тією ж. Рекомендую відразу завантажити документацію до вашої платі з принциповою схемою і pdf на мікроконтролер.

Для подальшої роботи буде непогано мати осцилограф, практично будь-який, однак почати можна і без нього.

Знову ж таки, передбачаючи питання про покупку плати, я купував на aliexpress, і це обійшлося набагато дешевше, ніж у вітчизняних продавців.

Ще нам знадобиться сам STM32CubeMX (скачується безкоштовно), і будь-яка IDE для роботи з проектом на С і підтримкою ST-Link. Їх багато, є комерційні, є безкоштовні, і я навмисно не буду наводити ніяких назв. Кожен вибирає для себе.

2. Hello World, або управління світлодіодом
Спочатку вам потрібно завантажити і встановити STM32CubeMX. Завантажити можна безкоштовно з сайту st.com. Скажу відразу, STM32CubeMX існує тільки в Windows-версії. Пишуть, що нормально працює під wine, я особисто не пробував.

Заходимо в File/New Project, вибираємо потрібний мікроконтролер. Для цього зручно користуватися фільтрами у верхній частині вікна.



У нашому випадку це STM32F746NGHx.

Далі налаштовуємо тактовий генератор. У вкладці Pinout вибираємо роботу з зовнішнім кварцем:


У вкладці Clock Configuration в поле HCLK (MHz) пишемо 216. У відповідь отримуємо повідомлення «No solution found using the current selected sources. Do yoy want to use other sources?» Відповідаємо «OK» і вибираємо джерело HSE в мультиплексорі PLL Source Mux. Значення PLLM, PLLN і PLLP встановлюємо, як показано на рисунку. Перевіряємо, що HCLK = 216MHz.



Тепер треба конфігурувати GPIO, керуючий світлодіодом. Це порт PI1. На вкладці Pinout знаходимо висновок PI1, натискаємо на нього і встановлюємо значення GPIO_Output.



Для подальшого зручності можна присвоїти піну ім'я. Це робити необов'язково, але давайте це зробимо, щоб код був більш читабельним. Для цього перейдіть на вкладку Configuration у стовпці System натискаємо кнопку GPIO.



Потрапляємо у вікно «Pin Configuration» і в полі User Label пишемо «Led».



Зараз можна згенерувати код (Project/Generate Code). STM32CubeMX генерує не тільки вихідний код, але і файли проекту для ряду популярних IDE. Звернемо увагу, що в коді розставлені коментарі види:

/* USER CODE BEGIN 3 */
/* USER CODE END 3 */

Свій код можна писати тільки в них, інакше при повторної генерації исходника ваш код буде затертий.

Отже, знаходимо цикл while(1) в main() і пишемо в ньому наступне:

HAL_GPIO_TogglePin(Led_GPIO_Port, Led_Pin); //Toggle the state of pin
HAL_Delay(500); //затримка в мс

Зараз можна запустити проект. Підключаємо плату і завантажуємо прошивку. Світлодіод на платі повинен мигати з частотою 1Гц.

Однак наведений вище підхід не ідеальний. Функція HAL_Delay містить всередині порожній цикл, і наша програма не може займатися в цей час ще чимось корисним. Для вирішення проблеми є два шляхи: використання переривань і використання операційної системи реального часу. Про операційну систему я напишу іншим разом, а роботу з перериваннями ми освоїмо зараз.

3. Таймер і переривання
Налаштуємо таймер, наприклад TIM1. Для цього у вкладці Pinout вибираємо для цього таймера джерело тактирования:


Джерелом тактирования стала внутрішня тактова частота периферії, рівна для нашого випадку 108MHz. Уточнити це значення або змінити його шляхом ділення головною тактової частоти можна на вкладці Clock Configuration.

Тепер переходимо на вкладку Configuration і налаштовуємо частоту спрацьовування таймера. Натискаємо на кнопку TIM1 і у вікні на вкладці Parameter Settings задаємо значення Prescaler і Counter Period. Зверніть увагу, коефіцієнти розподілу повинні бути зменшені на 1 від потрібних значень. Насправді, частота переривань таймера може бути знайдена за формулою:

Update_event = TIM_CLK/((PSC + 1)*(ARR + 1)*(RCR + 1))
У нашому випадку частота дорівнює 108e6 / ((53999 + 1) * (999 + 1)) = 2Hz. При цьому частота мигання світлодіода складе 1Hz, як у попередньому прикладі.

Тепер на вкладці контролера переривань (NVIC Settings) потрібно дозволити переривання TIM1 Update:



На цьому робота у STM32CubeMX закінчена, можна згенерувати код. В исходнике нам в першу чергу потрібно запустити сам таймер, а потім вставить обробник переривання, який буде блимати світлодіод:

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance==TIM1) //check if the interrupt comes from TIM1
{
HAL_GPIO_TogglePin(Led_GPIO_Port, Led_Pin); //Toggle the state of pin
}
}
/* USER CODE END 0 */

int main(void)
{
...
/* USER CODE BEGIN 2 */
//запуск таймера
HAL_TIM_Base_Start_IT(&htim1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//головний цикл порожній, у ньому можна робити що завгодно.
}
/* USER CODE END 3 */
}

Компілюємо і заливаємо прошивку. Як і очікувалося, світлодіод блимає точно так само, як і в попередньому прикладі. Однак, так як зараз це відбувається переривання, процесор вільний для виконання будь-яких інших завдань.

4. Що далі?
На цьому я закінчую першу частину. Що планується далі? У наступній частині я планую описати роботу з вбудованим ЦАП і зачепити тему DMA. В якості невеличкого анонсу: ми навчимося генерувати ось таку красиву синусоїду:


(Ця синусоїда не дуже красива, насправді, але буде краще).

У подальших планах: робота з контролерами USB (для початку в режимі VCP, віртуального COM-порту), контролери Ethernet, АЦП, і, можливо, торкнемося тему використання FreeRTOS.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.