STM32 с нуля. Инструменты для отладки в IDE 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

Почему 0x80? Так 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. Если возникли какие то вопросы или что-нибудь отказалось работать как должно, пишите о своей проблеме в комментарии, буду рад помочь!

Поделиться!

Подписаться
Уведомление о
guest
96 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Алиса Алексеева
7 лет назад

мда 🙂 ну, если что я сюда вернусь 🙂

Денис
Денис
7 лет назад

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

Николай
Николай
Reply to  Aveal
2 лет назад

У меня тоже самое:
*** error 34: undefined identifier
если даже вручную ввожу в Кейл5

Даниил
Даниил
7 лет назад

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

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

пушист
пушист
Reply to  Даниил
10 месяцев назад

Если вы делаете так: LogicAnalyzer -> Setup -> New, то писать там надо
porta&0×01
Без la.

Nemo
Nemo
7 лет назад

У меня тоже не работает STM32F407VGT6

Nemo
Nemo
Reply to  Aveal
7 лет назад

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

Nemo
Nemo
Reply to  Aveal
7 лет назад

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

Иван
Иван
7 лет назад

Все конечно ничего но размещать картинки в BMP это изврат в наш век, IMHO

Иван
Иван
Reply to  Aveal
7 лет назад

Размер первой картинки в BMP 3,57 МБ, в PNG 76,0 КБ в JPG 345 КБ на мой взгляд очевидно.

Виталий
Виталий
6 лет назад

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

Виталий
Виталий
Reply to  Aveal
6 лет назад

Спасибо, попробую)

Виталий
Виталий
Reply to  Aveal
6 лет назад

И ещё, а откуда вы получили такую информацию, про корректную поддержку только STM32F103?

Alex
Alex
6 лет назад

Подскажите как в Keil настроить чтобы он показывал строку с ошибкой .

Александр
Александр
6 лет назад

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

Александр
Александр
Reply to  Aveal
6 лет назад

https://www.dropbox.com/s/2c32p6q8r0lpy71/test.rar

Наверно следовало добавить, что писал проект под stm32f407vg да?:) Извините.

Александр
Александр
Reply to  Aveal
6 лет назад

Да, там походу одно ядро, так же как и в IAR’е. Спасибо.

Гордон Фриман
Гордон Фриман
6 лет назад

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

Валерий
Валерий
6 лет назад

Здравствуйте.
Как возможно с Вами связаться?
Не получается через Aveal.MicroTechnics@gmail.com. Гугловский Mail Delivery Subsystem возвращает письмо.

Валерий
Валерий
6 лет назад

Здравствуйте.
Вы не могли бы заглянуть на http://kazus.ru/forums/showthread.php?p=698803#post698803. Там у меня вопрос в третьем моем посте.
Заранее благодарен.

Игорь
Игорь
6 лет назад

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

Илья
Илья
6 лет назад

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

Илья
Илья
6 лет назад
Илья
Илья
6 лет назад

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

Илья
Илья
6 лет назад

У меня он же стоит( … Вот для наглядности снял…
http://yadi.sk/d/DgiRoSAvJ78WK

Илья
Илья
6 лет назад

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

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

Илья
Илья
6 лет назад

Ага…

Илья
Илья
6 лет назад

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

Илья
Илья
6 лет назад

На Офф. только Version 4.73. Пойдёт?

Илья
Илья
6 лет назад

Поставил, 4.73. Меню появилось))

Иван
Иван
6 лет назад

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

Alexander
Alexander
6 лет назад

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

Михаил
Михаил
5 лет назад

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

Михаил
Михаил
5 лет назад

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

masta
masta
5 лет назад

Как правильно вставить gpio.ini, с ним не компилится проект

masta
masta
5 лет назад

Как правильно вставить gpio.ini, с ним не компилится проект.

masta
masta
5 лет назад

Получилось!!!
Где почитать про команды командной строки???

amv
amv
5 лет назад

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

Андрей
Андрей
5 лет назад

при нажатии 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

ali00ff
5 лет назад

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

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

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

Андрей
Андрей
5 лет назад

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

Дмитрий
Дмитрий
4 лет назад

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

Дмитрий
Дмитрий
4 лет назад

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

Дмитрий
Дмитрий
4 лет назад

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

Дмитрий
Дмитрий
4 лет назад

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

Дмитрий
Дмитрий
4 лет назад

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

Алекс
Алекс
4 лет назад

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

Андрей
Андрей
4 лет назад

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

Сергей
2 лет назад

Помогло в 5-ом Keil-e, спасибо) И меню появилось, и ошибка error 34: undefined identifier исчезла. Только в параметрах прописал Parameter: -pSTM32F103СB тот камень который выбран в проекте.

Сергей
Сергей
2 лет назад

Добрый день.

Подскажите, как начать работать с STM32 для управления светодиодной матрицей 5х7 TA07-11?

Сергей
Сергей
Reply to  Aveal
2 лет назад

Добрый день!

Спасибо за ответ. Знания пока что очень поверхностные, ваш ресурс довольно понятен для новичка.

Финальная задача состоит в том, чтобы сделать простую программную среду с матрицей кнопок 5х7 в windows. Каждая кнопка должна включать соответствующий светодиод на матрице и выключать его. Возможно ли это реализовать средствами только STM32CubeMx?

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

Сергей
Сергей
Reply to  Aveal
2 лет назад

Добрый день!

Плата STM32F103C8T6.
Устройства планировал коммутировать через макетную плату с дополнительными резисторами, т.к. по даташиту на светодиодную матрицу напряжение питания должно быть 2,1-2,5 В, а с GPIO STM32, насколько я понял, снять можно 3,3 В.

Сергей
Сергей
2 лет назад

Доброй ночи!

Научился подавать на выводы 3,3 В, но землю беру с земляного вывода платы. Подскажите, пожалуйста, как прописать на с++ землю на нужный вывод.

P.S. начал работать в CooCox, но примеров такого не нашёл.

Сергей
Сергей
Reply to  Aveal
2 лет назад

Добрый день!

Работал по примерам. Честно говоря, не знаю что такое HAL библиотека.

Насколько понял, проще всего выход снять с
GPIO_Mode_Out_PP – выход с двумя состояниями (Push-Pull).

Подскажите, пожалуйста, как его инициировать чтобы ключ был закрыт в состоянии “земли”. Я использую подобную конструкцию объявления GPIO, если можно так выразиться:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;
GPIO_Init(GPIOB, &GPIO_InitStructure);

Сергей
Сергей
Reply to  Сергей
2 лет назад

Всё, разобрался сам. Извиняюсь, за глупые вопросы)

Alexander
Alexander
1 год назад

Добрый день!
Жму кнопку отладки, вылетает сообщение – No ULINK2/ME device founded. Я так понимаю, он просит отладчик присоединить к компу, но в Вашем примере про железо ничего не говорится.
Как быть?

Денис
1 год назад

Как включить симулятор?

Присоединяйтесь!

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Июнь 2020
Пн Вт Ср Чт Пт Сб Вс
« Май    
1234567
891011121314
15161718192021
22232425262728
2930  

© 2013-2020 MicroTechnics.ru