LPCXpresso Урок 1. Изучаем примеры. Введение в среду разработки.
Вступление
Этот первый урок в рамках курса для новичков желающих ознакомится с семейством контроллеров LPC1xxx, и LPC1343 в первую очередь, так как именно её я и буду рассматривать. Ознакомимся со средой CodeRed, предоставляемой для работы с отладочной платой LPCXpresso.
При покупке LPCXpresso вы получите «купон» с кодом для регистрации одноименной среды от CodeRed. Скачать её можно с сайта http://lpcxpresso.code-red-tech.com/LPCXpresso/ после регистрации (моя версия 3.5.0 которую и рекомендую к использованию, но на момент написания статьи доступна уже 4.2). Процесс её установки я описывать не буду, это повествование о знакомстве с контроллерами, а не урок по работе в ОС Windows. В картинках процесс установки и активации изложен в документе LPCXpresso Getting Started.pdf
Импорт примеров
Первое с чего следует начать – это импорт существующих проектов. CodeRed поставляется с примерами, кроме того, NXP на своем сайте публикует примеры работы со своими контроллерами. Грех будет не воспользоваться всем этим добром. Приступим.
На панели Quickstart Panel выбираем Import Example project(s):
Либо же на тулбаре нажимаем соответствующую кнопку
В поле Project arcive указываете путь к *.zip файлу примера. Начнем, пожалуй, с Examples\NXP\LPC1000\LPC13xx\LPCXpresso1343.zip. Выбираем и ждем Next >. Нам будет предложено, какие из имеющихся в архиве проектов следует импортировать. Выбираем:
- CMSISv1p30_LPC13xx – будем считать, что это базовая библиотека и без неё ничего не работает.
- LPC13xx_Lib – библиотека для работы с периферией на контроллере LPC1343. Реализация не полная и возможно не самая удачная, но зато оно работает сразу.
- LPCXpresso1343_blinky – мигаем светодиодом.
Жмем Finish и получаем результат:
Запуск примера
Что ж, нам осталось подключить нашу плату LPCXpresso к USB порту компьютера и выбрать в панели Quickstart panel появившийся пункт Debug ‘LPCXpresso1343_blinky’
Либо нажав кнопку отладки в тулбаре
Среда начнет компиляцию проектов и запустит отладку.
Если получите сообщение, что отладочный модуль не найден,
то либо вы просто не подключили плату к компьютеру, либо же уже был запущен другой сеанс отладки на подключенном модуле (мораль: не фиг жать кнопки яки угорелый). Устраняем причины, и повторяем действие.
Отладка
Самая святая-святых процесса разработки. Самая главная и ресурсоемкая его составляющая. И поскольку в отладке вам предстоит провести большую часть своего времени, то следует подойти к изучению имеющихся средств со всей ответственностью.
В режиме отладки компоновка среды разработки несколько меняется. Появляется окно отладки с отображением стека вызовов, и курсор устанавливается на первую инструкцию в функции main().
Управление в режиме отладки осуществляется панелью в окне Debug:
перечислю функции всех кнопок по очереди:
- Remove All Terminated Launches – удаляет из окна отладки записи о завершенных сеансах отладки. «Удаляет мусор» так сказать. Полезно. А главное нажимать её безопасно в любое время – ничего не испортите.
- Connect to a process – нам не нужно.
- Restart – начать отладку с начала. Иными словами нажать Reset. Полезно если не надо менять прошивку. Доступно только если отладка приостановлена (стоит пауза).
- Resume (F8) – продолжить выполнение/выйти из приостановленного состояния (снять паузу).
- Suspend – приостановить выполнение (поставить на паузу). Если вдруг программа зависла, можно узнать, где именно. Курсор будет установлен на следующую исполняемую инструкцию.
- Terminate (Ctrl + F2) – завершить процесс отладки. Среда вернется обратно в режим разработки, а железка продолжит выполнять загруженную в неё программу. Это важно помнить.
- Disconnect – нам не нужно.
- Step into (F5) – сделать шаг с входом в функцию. Если в очередной строке есть вызов функции, то мы перейдем внутрь этой функции.
- Step over (F6) – сделать шаг без входа в функцию. Если в очередной строке есть вызов функции, то она будет полностью выполнена «за один шаг» (не такт процессора, а шаг отладки – не путайте). Курсор же будет установлен на следующую строку.
- Step Return (F7) – выйти из функции. Выполнение будет продолжено до возврата из текущей функции. Полезно что бы ни выполнять по шагам каждую строчку функции, если нам она больше не интересна.
- Drop to Frame – нам не надо.
- Instruction stepping mode – нам не понадобится. Позволяет проводить выполнение каждой инструкции процессора по отдельности.
- Refresh – обновить информацию.
Собственно теперь можно нажать <F8> Resume и программа начнет выполняться, а светодиод на плате вместо тусклого свечения начнет мигать. При выборе <Ctrl>+<F2> Terminate программа в контроллере так же продолжит выполнение, только мы больше не сможем повлиять на ход её выполнения до запуска нового сеанса отладки.
Но для более любознательных рекомендуется нажать <F5> Step into и увидеть первый камень тех, кто не читает мануалы:
void GPIOInit( void )
{
/* Enable AHB clock to the GPIO domain. */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
}
Вот оно великое! Разрешение тактирования портов ввода-вывода. Без установки этого бита, никакие операции вывода в порт не отразились бы на физических уровнях ножек контроллера. В прочем об этом вы уже могли читать у DI HALT’а и не только.
В режиме пошаговой отладки в проекте примера вы можете ознакомиться со всей последовательностью действий, которые были выполнены для работы примера. Где, что и как было сделано. Вообще отладка хорошее средство не только для поиска ошибок, но и для изучения.
Библиотеки
При пошаговой отладке вы могли обнаружить весь ужас функции GPIOSetDir. И наверняка задались вопросом «почему так сложно и непонятно». Суть в том, что GPIOSetDir – это библиотечная функции. Она написана для вас, что бы вы ей пользовались. А использовать её крайне легко и понятно:
// Set port for LED to output
GPIOSetDir( LED_PORT, LED_BIT, 1 );
Задача библиотеки «скрыть» низкий уровень, оставив для разработчика простой и понятный интерфейс для выполнения задачи. Это хорошо и это полезно. Не спешите делать своё «крутое» и «мегаоптимальное». Вы всегда сможете это сделать. Другой момент – вам предоставляют уже готовое средство, для использования которого вам не нужно знать ровным счетом ничего, про регистры контроллера, внутреннее устройство памяти и прочее. Вы берёте инструмент и начинаете им работать. Вам не надо быть гуру, для того, что бы начать писать свои рабочие проекты. Библиотека от NXP позволяет вам приступить к изучению платформы. Пользуйтесь ею.
Так же отмечу проект CodeBase. Он представляет собой переписанную библиотеку NXP и на мой взгляд больше подходит для изучения, т.к. в ней «магические числа» заменены именованными константами. Те же строки включения тактирования портов ввода-вывода выглядят следующим образом:
/* Enable AHB clock to the GPIO domain. */
SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_GPIO);
Во-первых, вам уже не надо думать, что означает 1<<6 и почему используется именно такое значение. Во-вторых, в именах констант заложено ещё и имя регистра, для которого константа предназначена. В-третьих, имена легче читаются.
Вообще всё это субъективно. Кому-то удобнее одно, кому-то другое. Я для изучения использую обе библиотеки. NXP – так как она написана «по юзер мануалу», CodeBase – так как в ней убрана «магия». Кроме того, в CodeRed есть готовые библиотеки для подключения дисплеев, памяти (в том числе и SD карточек) и прочего.
В качестве завершения
Как-то резко всё закончилось. Но добавить мне больше нечего. Так что давайте на этом завершим первый урок. Попробуйте все приведённые действия повторить самостоятельно.
Ссылки на материалы приведены в анонсе.