STM32 с нуля. Отладка в Keil.

Продолжаем изучение STM32 с нуля. Пришло время убедиться в том, что наша программа работает так, как задумано, и в этом нам поможет отладка в Keil (в статье используется Keil 4). Запускаем проект из предыдущей статьи про GPIO, компилируем и жмем на значок в виде лупы на панели инструментов. Также можно нажимать Ctrl+F5 или через меню – Debug->Start/Stop Debug Session. Итак, мы оказались в режиме отладки. Тут можно посмотреть, какие значения записаны в регистры общего назначения, также есть окошко дизассемблера. В общем можно найти много интересного =).

Отладка для микроконтроллера STM32

Для увеличения картинки тыкайте на нее =)

Мы же идем в меню, в Peripherals->General Purpose I/O и в появившемся подменю выбираем наш GPIOA, задействованный в этом проекте. Появляется специальное окно для работы с портом A:

Работа с GPIOA в отладчике Keil

Здесь мы видим, в каком режиме работают выводы порта, какие значения в регистрах ODR, IDR, CRL, CRH, LCKR. Короче, тут есть в принципе все, связанное с GPIOA.

Давайте наконец-то это все опробуем и получим уже долгожданный результат ) Идем в меню и во вкладке Debug находим Run. Также можно нажать F5. Программа полетела выполняться. Сразу же видим, что в окне GPIOA изменились режимы работы выводов 0 и 1.

Порты ввода-вывода в симуляторе Keil

Конечно, это радует, но все же где же мигание диодика?

А для того, чтобы диод заморгал нам надо нажимать кнопку, которую у нас символизирует вывод PA1. То есть нам необходимо проэмулировать нажатие кнопки. Вспоминаем про входной регистр GPIOA_IDR, запускаем программу и тыкаем первый бит в строке Pins:

Отладко программы в Keil

Замечаем, что при этом у нас выставляется нужный бит регистра IDR, что нам собственно и надо. А одновременно с нажатием кнопки (выставлением первого бита GPIOA_IDR) видим, что загорается диод (выставляется первый бит регистра GPIOA_ODR). Нажимаем кнопку – горит, отпускаем – гаснет )

Работы портов ввода-вывода

Это конечно, довольно извращенский способ отладки, нагляднее собрать в железе, хотя и так все видно и понятно, что программа работает верно.

Но только тыканием регистров механизм отладки в Keil’е не ограничивается (к счастью =) ). На панели инструментов находим значок Analysis Windows.

Логический анализатор

Нажимаем – появляется окошко логического анализатора. В нем мы можем посмотреть сигнал на любой ножке микроконтроллера. Полезнейшее средство отладки ). Осталось только все настроить. В нижней части окна Keil есть командная строка. Пишем в ней:

la porta&0x01

и жмем Enter.

Возникает вопрос, а что же мы вообще такое сделали?

А мы отдали команду логическому анализатору, чтобы он нам показал сигнал на выходе нулевого бита порта A. Если бы нам понадобился, например, седьмой бит того же порта, надо было бы написать

la porta&0x80

Почему 80? Так 0x80 при переводе в двоичную систему дает не что иное, как 0b10000000 – наш седьмой бит.

Двигаемся дальше, в окне логического анализатора жмем правой кнопкой мыши и в появившемся меню выбираем Bit. Мы же будем отслеживать только единички и нолики на выходе PA0. Итак, все настроено, запускаем программу и в окне GPIOA эмулируем нажатие кнопки (выставляем бит). И вот что мы видим в окне анализатора:

Симулятор Keil, логический анализатор

В соответствии с нажатием кнопки меняется уровень логического сигнала на выходе PA0, что равнозначно миганию диода =). Вообще логический анализатор в Keil’е – очень удобное и во многих случаях полезное средство отладки программ.

Теперь, когда мы разобрались с основными средствами отладки программ в Keil, рассмотрим еще один способ, а именно использование языка сценариев отладчика. Операторы и синтаксис языка сценариев соответствует Си, правда есть некоторые отличия:

  • В языке сценариев не поддерживаются структуры
  • Есть ограничения по работе с указателями и адресами
  • Прописные символы эквивалентны строчным
  • При помощи языка сценариев невозможно вызвать функции из отлаживаемой программы

Язык сценариев позволяет реализовать взаимодействие внешних устройств с отлаживаемой программой. Что это значит, увидим на примере.

Вернемся к нашей программе. Светодиод загорается при нажатии кнопки  — то есть при логической единице на входе PA1. Попробуем вместо нажатия кнопки выставлением бита регистра IDR проэмулировать периодический внешний сигнал, поданный все на тот же вход PA0. Для этого воспользуемся языком сценариев.

Итак, приступаем. Создаем новый файл в редакторе Keil’а и набиваем следующий код:

/********************************************************************/
signal void start(void)
{
    while(1)
    {
	PORTA |= 0x02;
	twatch(400);	
	PORTA &= ~0x02;
	twatch(400);
    }
}
/********************************************************************/

В целом, это обычная функция, за исключением ключевого слово signal, которое необходимо для эмуляции входных сигналов. Организуем вечный цикл, в котором сначала подаем логическую единицу на вход PA1, затем реализуем временную задержку, затем ноль на вход и снова задержка. То есть на входе у нас будет периодический сигнал. Сохраняем этот файл с расширением .ini, в той же папке(!), где находятся файлы проекта. Теперь запускаем режим отладки и идем в командную строку. Необходимо подключить наш созданный файл:

Include gpio.ini

(у меня файл назван gpio.ini)

Просим логический анализатор показать интересующие нас выводы:

la porta&0x01 (PA0)

la porta&0x02 (PA1)

И теперь остается только вызвать функцию для генерации сигнала. Для этого просто пишем в командной строке название функции, у меня это —  start(). Можно запускать программу (F5)

Язык сценариев в симуляторе Keil

Видим на экране анализатора периодический сигнал на входе PA1, и в соответствии с ним то зажигается, то гаснет светодиод на выводе PA0. То есть все работает, как задумано, можно радоваться =)

P. S. Если возникли какие то вопросы или что-нибудь отказалось работать как должно, пишите о своей проблеме в комментарии.

Понравилась статья? Поделись с друзьями!

STM32 с нуля. Отладка в Keil.: 77 комментариев
  1. А куда конкретно вписывать la porta&0×01 ? Если я туда вписываю то у меня высвечиватся такое
    la porta&0?01
    ___^
    *** error 34: undefined identifier

    • если ты копировал эту строку, попробуй просто вручную это напечатать в командной строке

  2. Здравствуйте, использую бесплатную версию Keil на 32 кб, в полях логического анализатора все закрашено серым цветом, при последовательности действий LogicAnalyzer -> Setup -> New выдает ошибку Unknown signal.

    Во вкладке Peripherials нет ничего кроме Core Peripherials. Проблема в ограниченной функциональностью или в «кривых руках»?

      • пишу такое la portd&0×0C высвечиватся такое:
        la portd&0x0C
        *** error 34: undefined identifier
        STM32F407VGT6 используеться в STM32F4 Discovery

        • Вообще логический анализатор — это фишка отладки в режиме симулятора(!). А ты в железе отлаживаешь ведь. Тут нужен внешний ЛА или осцил, ну или диод повесь на нужную ногу

          • как в железе отлаживать я знаю,думал в симуляторе должно тоже работь…

  3. Ну симулятор у Keil’а вообще нормально работает по сути только для f103 серии, для всех остальных процессоров, что мне попадались, в лучшем случае половина функций обрезана

  4. Здравствуйте. написал простенькую программу, нажимаешь на кнопку горит один светодиод, отпускаешь другой. Если в свойствах проекта в keil выбрать камень как у, Вас, STM32F103RB (в одной из ваших статей вы его использовали), в режиме отладки все работает хорошо. А если взять тот, который мне нужно STM32F100RB то всё компилируется,а при нажатии в режиме отладки «F5» программа не запускается, в чём может быть дело?

    • Мне кажется, невозможно его так настроить, чтобы он этого не делал) Всегда показывает строку с ошибкой

  5. А у меня без платы в режим симуляции не входит. Из startUp’а не выходит в главную функцию. В чем может быть проблема?

  6. а как уйти от пошаговой отладки, т.е. сделать так чтоб отладка была до брейк-пойнта? я никак не могу понять

    • Вообще логический анализатор этот в Кейле крайне нестабильный какой-то. Лучше, чем-нибудь еще пользоваться при отладке, во всяком случае у меня такие остались впечатления от него )

  7. У меня на 32F303VC в Uvision4 пункт меню Peripherals->General Purpose I/O вырезан вообще. Ну да ладно, проживём)

  8. Здравствуйте….
    Установил с оф. сайта кейл, не крякал. Начал изучать программирование STM (пока нет железного отладчика, решил потренироваться в симуляторе) по этой статье , но у меня нет в меню Peripherals> пункта General Purpose I/O. Где его найти?
    http://img.radiokot.ru/files/39352/thumbnail/9mfr8y5zi.jpg

  9. Прообовал и тот, что вы указывали в начале курса и другие, результат одинаковый….

    • Я вот сейчас попробовал, открыл проект, там не оказалось тоже ничего в этом меню, как только выбрал STM32F103CB, сразу все появилось

    • Наверно Кейл другой просто, немного отличается меню) В system viewer можно все посмотреть, gpio и остальную периферию

  10. А здесь точно ничего отмечать не надо?
    [url=http://img.radiokot.ru/files/39352/medium/9o6hgmbdp.jpg]

    Посмотреть то можно, а вот как выставить пин в 1 или 0 (кнопку эмулировать)?

    • Я 5 не пользовался ) Может там в другом месте где-то это меню, а могли и вообще урезать функционал влегкую )

  11. Ясно… Попробую тогда поставить 4-ю версию…. Спасибо за помощь, и за проект обучалки в целом. Очень просто и понятно всё описано)))

  12. Чтобы в 5 в симуляторе были эти менюхи, нужно в настройках проекта Project -> Options for Target -> Debug -> в левой части окна (которая относится к симулятору) в поле Dialog DLL: прописать DARMSTM.DLL, а в поле Parameter: -pSTM32F103RB и все появится.

  13. Почему возникает
    FCARM — Output Name not specified, please check ‘Options for Target — Utilities’
    Что делать?

  14. Что-то я не допонял как указать порт. Я уже и копировал из этого урока и вписывал и «х» и «×» и как уже не извращался. Все таки, что там за буква или символ такой?

    • Эта фишка почему-то некорректно работает в Кейле. У меня, например, на одном компе работало как надо, а на остальных никак. То ли там какая то версия уникальная была Кейла, то ли еще что…

  15. Да уж вот теперь и думаю где искать осциллограф. А то даже не знаю корректно я портировал на 407 камень или нет. Тем не менее спасибо за урок.

  16. При каждом нажатии (F10, F11) во время пошаговой отладки курсор перескакивает на страницу system_stm32f4xx.c Надо переходить на main.c вручную, однако следующее нажатие опять тоже.
    Keil (Vision V4.74.0.22 — Demo)
    меню Peripherals> пункта General Purpose I/O — нет

  17. при нажатии F5(run) стопорится на строчке RCC->CR |= (uint32_t)0x00000001; файла sustem_stm32f10x.c выдает
    *** error 65: access violation at 0x40021000 : no ‘read’ permission
    И вкладки General Purpose I/O нет в Peripherals, только System Viewer и Core Peripherals
    (версия Keil’a 4.74)
    скриншот: http://s012.radikal.ru/i319/1502/d7/5948a6070de6.jpg

  18. =======================================
    Так же добавлю мое мнение + 3 мнения друзей
    довольно серьезных MCUшников

    по STM32(да и по аналогу) излагаешь лучше всех !
    На сей день это лучший сайт в рунете по STM
    По мне так единственный из РУ (ну еще ютуб уроки STM)

    От большинства остальных только голова болит
    и время в пустую теряешь 🙁
    Не хочу показывать пальцам на разных «могучих» дихалтов :))))))))))))))

  19. Вы правы я ошибся и выбрал STM32F103TB вместо STM32F103СB. Все заработало и вкладка General Purpose I/O появилась =D Огромное спасибо!
    Подписываюсь к хвалебным отзывам об ваших уроках, материал излагаете очень доступно + поддержка, о которой даже на оф.форумах производителя забывают (diolan.com к примеру)

  20. Уважаемые знатоки! Будьте так добры, подскажите следующий момент. Имею в наличии следующее: микроконтроллер stm32f100c4, связанный с компом через swd интерфейс. Режим отладки в Keil работает, светодиодиком, как показано в примере помигать могу. Но вот графики, как бы я не выводил в logic analyser не отображаются, просто пусто. Я так понимаю, туда выводятся графики только в режиме симуляции (если я не прав, поправьте), а как в таком случае мне в Keil график построить, чтоб в реальном времени, и реальное железо отлаживать? Какие тут варианты и как конкретно реализуется? Заранее спасибо)

  21. н о ведь на ходу состояние переменных Keil отображает, что мешает ему график строить?

    • Насколько я помню он только в режиме симулятора может строить. Да и вообще, в целом, ради интереса можно пару раз построить в Кейловском симуляторе, но для чего-то серьезного это все не подходит.

  22. Вот сейчас в реальном времени наблюдаю изменение состояния глобальной переменной в окне watch. И как же все вот эти описания, неужели это все для режима симуляции?
    http://www.arm.com/files/pdf/mcbstm32c_lab.pdf
    Просто, на моей прежней работе для отладки ti микроконтроллеров использовался JTAG интерфейс. Там строили графики, смотрели переменные находу — то, что надо для отладки серьезного устройства. Вот у меня и появился вопрос, можно ли это все реализовать на stm32 swd, и судя по тому, что пишут в интернете, не все так однозначно (может не прав )

  23. И кстати, Keil начинает позволять запихивать в logic analyzer переменные только после установки галочки trace enable, может там чего настроить надо

    • Я честно говоря только в целях тестирования возможностей Кейла задавался этими вопросами, поэтому не могу особо подсказать…

  24. Хотелось бы заметить, что после долгого копания в интернете мне удалось найти инструкцию, как таки подстроить график в Keil в реальном времени на реальной железке. Там пример под stm32f4fiscovery, которая у меня и была под рукой. И о чудо, оно заработало)
    Вот ссылка, если кому интересно:
    http://www.keil.com/appnotes/files/apnt_230.pdf

  25. Все работает.
    В тексте набрана русская буква х
    Набирите «la portA» без маски для начала, а потом «la portA & 0x02»

  26. В командной строке пишу
    la porta&0х01
    la porta&0х02
    la porta&0х04
    в логическом анализаторе все равно выводится весь порт A.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *