Более или менее сложная программа обычно требует отладки. Методы могут быть разные. В простейшем случае, для отладки можно использовать светодиод (например если не мигает, значит что-то пошло не так). В более сложных случаях, отладочные сообщения могут отображаться на индикаторе или отправляться по USART. Но наиболее продвинутый метод отладки непосредственно в МК, с возможностью пошагового выполнения программы (что позволяет визуально наблюдать как выполняется программа, например где она виснет) и с возможностью просмотра регистров МК, переменных и всей памяти и при необходимости изменения значения в них. STM32 все это предоставляет. У МК есть интерфейсы JTAG и SWD которые можно использовать как для прошивки, так и для отладки. Для этого нужен программатор-отладчик. Их есть несколько. Я использую ST-Link v2. Конечно лучше купить фирменный, но цена у него завышена. Китайцы как обычно выручают. У них можно купить подделку аналог по небольшой цене - примерно 120 рублей (1.8$ по текущему курсу).
Выглядит этот аналог таким образом.
Драйверы для ST-Link http://www.st.com/web/en/catalog/tools/PF260219
У платы на боковой стороне есть 4 контакта для програматора-отладчика - выводы 3.3, DIO, DCLK и GND. Их нужно соединить с контактами отладчика 3.3, SWDIO, SWCLK и GND.
Среда EmBitz поддерживает ST-Link и по умолчанию при создании проекта использует его. Никаких дополнительных настроек производить не нужно, кроме разве что установки галочки в "Run to main()", чтобы отладка начиналась с функции main(), а не с кода инициализации. Это окно доступно в меню Отладка --> Interfaces.
Для примера, давайте выполним пошагово ранее рассмотренную программу Blink_2, в которую добавим переменную x и будем увеличивать число в ней.
/* USER CODE BEGIN 2 */ volatile uint8_t x=0; // Объявляем однобайтную переменную. /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // Инвертирование состояние выхода. HAL_Delay(500); // Пауза 500 миллисекунд. x++; // Увеличиваем число в переменной. } /* USER CODE END 3 */
На панели инструментов EmBitz есть выпадающий список конфигураций. Для отладки в нем нужно выбрать Debug. Затем скомпилировать программу выбрав в меню Сборка пункт "Rebuild all target files".
Теперь подключаем плату к ST-Link, а его к USB порту компьютера и в меню Отладка кликаем по "Start/Stop Dedug Session".
В МК будет загружена прошивка и он перейдет в режим отладки. Выполнение программы остановится на 70 строке функции main(), рядом с которой появится желтая стрелка.
Теперь программу можно выполнять пошагово, просматривать и изменять содержимое переменных и т. д. Все эти действия доступны в меню Отладка.
Есть несколько вариантов пошагового выполнения. Если кликать по пункту "Следующая строка", то программа будет пошагово выполняться без захода в функции (они выполняются, но не в пошаговом режиме). Если кликать по пункту "Войти", то программа будет выполняться с заходом в функции. Если нужно выполнить программу до конца функции, нужно кликнуть по пункту "Выйти". Если нужно выполнить программу по определенной строки, то можно поставить точку останова в этой строке и запустить выполнение или просто кликнуть по строке чтобы на нее переместился курсор и в меню Отладка кликнуть по пункту "Run to cursor line". Если нужно перезапустить отладку, то следует кликнуть по пункту Reset.
Итак, при запуске отладки, текущей строкой стала HAL_Init() как показано на скриншоте выше. Теперь давайте кликнем по пункту"Следующая строка" чтобы пропустить пошаговое выполнение функции HAL_Init(), а затем кликнем по пункту "Войти" чтобы выполнить строку кода с заходом в функцию, в данном случае в SystemClock_Config(). Выполнение программы переместится в эту функцию.
Несколько раз покликаем по пункту "Следующая строка", пока не доберемся до конца функции - строки 124 с функцией HAL_NVIC_SetPriority().
Теперь если навести курсор на строку 102 где создается экземпляр структуры с именем RCC_OscInitStruct, то можно увидеть что находится в полях (переменных) структуры. Так же можно поступать с переменными, массивами и т. д.
Аналогичные данные можно получить в окне Watches (меню "Отладка" --> "Окна отладчика" --> "Наблюдать").
Сделаем еще несколько шагов (пункт "Следующая строка") пока не доберемся до цикла в котором мигает светодиод.
По пошаговом выполнении этого участка кода, светодиод будет вспыхивать и тухнуть при каждом выполнении функции HAL_GPIO_TogglePin(). Число в переменой x будет увеличиваться.
При создании скриншота я навел мышку на переменную x и т. к. цикл отработал 4 раза, то в ней соответственно число 4. Бывают случаи когда нужно изменить число в переменной. Для этого открываем окно Watches и в нем дважды кликаем по строке с переменной x. Появится окно редактирования и в нем вводим нужное значение переменной, например 100 и сохраняем его.
Теперь в переменной x число 100.
А теперь посмотрим как работает функция HAL_GPIO_TogglePin(). Когда до нее дойдет очередь, нужно вместо пункта "Следующая строка", нажать "Войти" и выполнение переместится с файла "main.c", в файл "stm32f1xx_hal_gpio.c".
В функции производится исключающее ИЛИ (XOR) регистра ODR из группы GPIO с данными переменной GPIO_Pin.
Проект. http://pure-basic.narod.ru/forum_files/ … _Debug.zip