Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2739
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Hello, Nucleo!

96

3.3. Подключение Nucleo к ПК

После того, как мы скомпилировали наш тестовый проект, вы можете подключить плату Nucleo к вашему компьютеру с помощью USB-кабеля, подключенного к порту micro-USB (называемому VCP на рисунке 12). Через несколько секунд вы должны увидеть, что как минимум два светодиода загорятся.

Рисунок 12:

Первым является светодиод LD1, который на рисунке 12 называется ST-LINK LED. Это красный/зеленый светодиод, который используется для индикации активности ST-LINK: когда плата подключена к компьютеру, этот светодиод горит зеленым светом; во время сеанса отладки или при загрузке микропрограммы на микроконтроллер он попеременно мигает зеленым и красным.

Другим светодиодом, который включается при подключении платы к компьютеру, является светодиод LD3, который на рисунке 12 называется POWER LED. Это красный светодиод, который включается, когда порт USB заканчивает перечисление (enumeration), то есть интерфейс ST-LINK правильно распознается ОС компьютера как периферийное устройство USB. Целевой микроконтроллер на плате получает питание только тогда, когда данный светодиод включен (это означает, что интерфейс ST-LINK еще и управляет питанием целевого микроконтроллера).

Наконец, если вы до сих пор не загружали на свою плату пользовательскую микропрограмму, вы увидите, что светодиод LD2 – зеленый светодиод с меткой USER LED на рисунке 12, также мигает: это происходит потому, что ST предварительно загружает на плату встроенное ПО, которое заставляет светодиод LD2 мигать. Чтобы изменить частоту мигания, вы можете нажать кнопку USER BUTTON (синюю).

Теперь мы собираемся заменить встроенную микропрограмму на ту, которая была сделана нами ранее.

Hello, Nucleo!

97

3.4. Перепрограммирование Nucleo с

использованием STM32CubeProgrammer

Недавно компания ST представила новый довольно практичный инструмент для загрузки микропрограммы на целевую плату: STM32CubeProgrammer. Его цель – заменить старый инструмент ST-LINK Utility, и хорошая новость заключается в том, что он, наконец, мультиплатформенный. Инструмент еще не совсем стабилен, но я уверен, что в следующих выпусках будут исправлены его ранние ошибки. На рисунке 13 показан основной интерфейс STM32CubeProgrammer.

Рисунок 13: Интерфейс STM32CubeProgrammer после подключения к плате

Мы установили STM32CubeProgrammer в Главе 2, и теперь мы собираемся воспользоваться им. Запустите программу и подключите Nucleo к ПК с помощью USB-кабеля. Как только STM32CubeProgrammer определит плату, ее серийный номер появится в поле с выпадающим списком Serial number, как показано на рисунке 14.

Рисунок 14: Серийный номер ST-LINK, показанный инструментом STM32CubeProgrammer

Прочитайте внимательно

Если вместо серийного номера ST-LINK появляется метка «Old ST-LINK Firmware», вам необходимо обновить микропрограммное обеспечение ST-LINK до последней версии. Нажмите кнопку Firmware upgrade в нижней части панели ST-LINK Configuration и следуйте инструкциям. В качестве альтернативы, следуйте инструкциям по обновлению, приведенным в Главе 2.

Hello, Nucleo!

98

После определения платы ST-LINK нажмите кнопку Connect. Через некоторое время вы увидите содержимое Flash-памяти, как показано на рисунке 13 (убедитесь, что все параметры подключения совпадают с параметрами, указанными на рисунке 13).

Хорошо, давайте загрузим пример микропрограммы на плату. Нажмите на значок Erase & programming (второй зеленый значок слева). Затем нажмите кнопку Browse в

разделе File programming и выберите файл C:\STM32Toolchain\projects\hello-nu-

cleo\Debug\hello-nucleo.hex в Windows или /STM32Toolchain/projects/hello- nucleo/Debug/hello-nucleo.hex в Linux и Mac OS. Проверьте флаги Verify programming и

Run after programming и нажмите кнопку Start Programming, чтобы начать перепро-

граммирование. В конце процедуры перепрограммирования зеленый светодиод Nucleo начнет мигать. Поздравляю: добро пожаловать в мир STM32 ;-)

3.5. Изучение сгенерированного кода

Теперь, когда мы воплотили в жизнь мертвое железо, мы можем сначала взглянуть на код, сгенерированный плагином GNU MCU. Открыв файл main.c, мы можем увидеть содержимое функции main() – точки входа9 нашего приложения.

 

Имя файла: src/main.c

 

 

 

 

45

// Удержание светодиода включенным в течение 2/3 секунды.

46

#define BLINK_ON_TICKS

(TIMER_FREQUENCY_HZ

* 3 / 4)

47

#define BLINK_OFF_TICKS

(TIMER_FREQUENCY_HZ

- BLINK_ON_TICKS)

48

 

 

 

49int main(int argc, char* argv[])

50{

51trace_puts("Hello ARM World!");

52trace_printf("System clock: %u Hz\n", SystemCoreClock);

54

timer_start();

55

 

56

blink_led_init();

57

 

58

uint32_t seconds = 0;

59

 

60// Бесконечный цикл

61while (1)

62{

63blink_led_on();

64timer_sleep(seconds == 0 ? TIMER_FREQUENCY_HZ : BLINK_ON_TICKS);

66blink_led_off();

67timer_sleep(BLINK_OFF_TICKS);

69

++seconds;

70

 

71trace_printf("Second %u\n", seconds);

72}

73}

9 Опытные программисты STM32 знают, что неправильно говорить, что функция main() является точкой входа в приложение STM32. Выполнение микропрограммы начинается намного раньше, с вызова некоторых важных процедур конфигурации, которые создают среду выполнения для микропрограммы. Однако с точки зрения приложения его запуск находится внутри функции main(). Глава 22 подробно покажет процесс начальной загрузки микроконтроллера STM32.

Hello, Nucleo!

99

Команды в строках 51, 52 и 71 относятся к отладке10, и мы подробно рассмотрим их в Главе 5. Функция timer_start(); инициализирует таймер SysTick, так что он запускает прерывание каждые 1 мс. Он используется для вычисления задержек, и мы изучим его работу в Главе 7. Функция blink_led_init(); инициализирует вывод GPIO PA5 в качестве выхода. Наконец, бесконечный цикл включает и выключает светодиод LD2, оставляя его включенным в течение 2/3 секунды и выключенным в течение 1/3 секунды.

Единственный способ научиться чему-либо в данной области – это испачкать руки написанием кода и множеством ошибок. Итак, если вы новичок в платформе STM32, неплохо бы начать разбор кода, сгенерированного плагином GNU MCU, и попытаться изменить его.

Например, хорошим упражнением является изменение кода таким образом, чтобы светодиод начинал мигать при нажатии пользовательской кнопки (синей). Намек? Пользовательская кнопка подключена к выводу PC13.

Интермеццо Eclipse

Eclipse позволяет нам легко перемещаться по исходному коду, не переходя между файлами с исходным кодом вручную, в поиске места, где определена функция. Например, предположим, что мы хотим увидеть, как кодируется функция timer_start(). Чтобы перейти к ее определению, выделите вызов функции, щелкните правой кнопкой мыши и выберите Open declaration, как показано на следующем рисунке.

Иногда случается, что Eclipse вносит беспорядок в свои индексные файлы, и невозможно перемещаться внутри исходного кода. Чтобы решить данную проблему, вы можете заставить Eclipse пересоздать свой индекс, перейдя в меню Project → C/C++ Index

→ Rebuild.

Еще одна интересная особенность Eclipse – возможность расширять сложные макросы. Например, щелкните правой кнопкой мыши на макросе BLINK_OFF_TICKS в строке 71 и выберите пункт Explore macro expansion. Появится следующее контекстное окно.

10 Для полноты картины они представляют собой функции трассировки, использующие полухостинг ARM (ARM semihosting) – функцию, позволяющую выполнять код на хост-ПК, вызывая его из микроконтроллера, – своего рода удаленный вызов процедуры.