Продолжаем изучение STM32 с нуля! Пришло время убедиться в том, что наша программа работает так, как задумано, и в этом нам поможет отладка в Keil (в статье используется Keil 4). Запускаем проект из предыдущей статьи про GPIO, компилируем и жмем на значок в виде лупы на панели инструментов. Также можно использовать сочетание Ctrl + F5 или пункт меню – Debug - Start/Stop Debug Session.
Итак, мы оказались в режиме отладки. Тут можно посмотреть, какие значения записаны в регистры общего назначения, также есть окошко дизассемблера и куча других инструментов:
Мы же идем в меню, в Peripherals->General Purpose I/O и в появившемся подменю выбираем наш GPIOA, задействованный в этом проекте. Появляется специальное окно для работы с портом A:
Здесь мы видим, в каком режиме работают выводы порта, какие значения в регистрах ODR, IDR, CRL, CRH, LCKR. В общем, тут есть все, связанное с GPIOA.
Давайте наконец-то это все опробуем и получим уже долгожданный результат. Идем в меню и во вкладке Debug находим Run. Также можно нажать F5. Программа полетела выполняться. Сразу же видим, что в окне GPIOA изменились режимы работы выводов 0 и 1.
Конечно, это радует, но все же где мигание диода?
А для того, чтобы диод заморгал нам надо нажимать кнопку, которую у нас символизирует вывод PA1. То есть нам необходимо сэмулировать нажатие кнопки. Вспоминаем про входной регистр GPIOA_IDR, запускаем программу и "включаем" первый бит в строке Pins:
Замечаем, что при этом у нас выставляется нужный бит регистра IDR, что нам собственно и надо. А одновременно с нажатием кнопки (выставлением первого бита GPIOA_IDR) видим, что загорается диод (выставляется первый бит регистра GPIOA_ODR). Нажимаем кнопку – горит, отпускаем – гаснет:
Но только выставлением значений регистров механизм отладки в Keil’е не ограничивается. На панели инструментов находим значок Analysis Windows.
Нажимаем – появляется окошко логического анализатора. В нем мы можем посмотреть сигнал на любой ножке микроконтроллера. Полезнейшее средство отладки, осталось только все настроить. В нижней части окна Keil есть командная строка. Пишем в ней:
la porta&0x01
и жмем Enter... Возникает вопрос, а что же мы вообще такое сделали? А мы отдали команду логическому анализатору, чтобы он нам показал сигнал на выходе нулевого бита порта A. Если бы нам понадобился, например, седьмой бит того же порта, надо было бы написать
la porta&0x80
Почему 0x80? Так 0x80 при переводе в двоичную систему дает не что иное, как 0b10000000 – наш седьмой бит.
Двигаемся дальше, в окне логического анализатора жмем правой кнопкой мыши и в появившемся меню выбираем Bit. Мы же будем отслеживать только единички и нолики на выходе PA0. Итак, все настроено, запускаем программу и в окне GPIOA эмулируем нажатие кнопки (выставляем бит). И вот что мы видим в окне анализатора:
В соответствии с нажатием кнопки меняется уровень логического сигнала на выходе PA0, что равнозначно миганию диода 🙂 Вообще логический анализатор в 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)
Видим на экране анализатора периодический сигнал на входе PA1, и в соответствии с ним то зажигается, то гаснет светодиод на выводе PA0. То есть все работает, как задумано )
P. S. Если возникли какие либо вопросы или что-нибудь отказалось работать должным образом, пишите о своей проблеме в комментарии, буду рад помочь!
мда 🙂 ну, если что я сюда вернусь 🙂
А куда конкретно вписывать la porta&0×01 ? Если я туда вписываю то у меня высвечиватся такое
la porta&0?01
___^
*** error 34: undefined identifier
если ты копировал эту строку, попробуй просто вручную это напечатать в командной строке
У меня тоже самое:
*** error 34: undefined identifier
если даже вручную ввожу в Кейл5
Добрый день!
Это в 4 Кейле была такая штука... Может быть в 5 и убрали, поскольку особой популярностью не пользовалось...
Здравствуйте, использую бесплатную версию Keil на 32 кб, в полях логического анализатора все закрашено серым цветом, при последовательности действий LogicAnalyzer -> Setup -> New выдает ошибку Unknown signal.
Во вкладке Peripherials нет ничего кроме Core Peripherials. Проблема в ограниченной функциональностью или в "кривых руках"?
А какой контроллер используете?
Если вы делаете так: LogicAnalyzer -> Setup -> New, то писать там надо
porta&0×01
Без la.
У меня тоже не работает STM32F407VGT6
что именно не работает? А у кого еще?)
пишу такое la portd&0×0C высвечиватся такое:
la portd&0x0C
*** error 34: undefined identifier
STM32F407VGT6 используеться в STM32F4 Discovery
Вообще логический анализатор - это фишка отладки в режиме симулятора(!). А ты в железе отлаживаешь ведь. Тут нужен внешний ЛА или осцил, ну или диод повесь на нужную ногу
как в железе отлаживать я знаю,думал в симуляторе должно тоже работь...
Ну симулятор у Keil'а вообще нормально работает по сути только для f103 серии, для всех остальных процессоров, что мне попадались, в лучшем случае половина функций обрезана
Все конечно ничего но размещать картинки в BMP это изврат в наш век, IMHO
А в чем лучше?
Размер первой картинки в BMP 3,57 МБ, в PNG 76,0 КБ в JPG 345 КБ на мой взгляд очевидно.
Ну ок) в будущем будет другой формат)
Здравствуйте. написал простенькую программу, нажимаешь на кнопку горит один светодиод, отпускаешь другой. Если в свойствах проекта в keil выбрать камень как у, Вас, STM32F103RB (в одной из ваших статей вы его использовали), в режиме отладки все работает хорошо. А если взять тот, который мне нужно STM32F100RB то всё компилируется,а при нажатии в режиме отладки "F5" программа не запускается, в чём может быть дело?
Вообще, насколько я помню, в Кейле нормально реализована работа симулятора только для контроллеров STM32F103, для всех остальных лучше в железе отлаживать
Спасибо, попробую)
И ещё, а откуда вы получили такую информацию, про корректную поддержку только STM32F103?
Это установлено когда-то было опытным путем )
Подскажите как в Keil настроить чтобы он показывал строку с ошибкой .
Мне кажется, невозможно его так настроить, чтобы он этого не делал) Всегда показывает строку с ошибкой
А у меня без платы в режим симуляции не входит. Из startUp'а не выходит в главную функцию. В чем может быть проблема?
А скиньте проект, я попробую у себя
https://www.dropbox.com/s/2c32p6q8r0lpy71/test.rar
Наверно следовало добавить, что писал проект под stm32f407vg да?:) Извините.
Я тогда попробую завтра и отпишу )
Что-то не сразу придал значение используемому процессору) STM32F4 же вообще не поддерживаются симулятором Кейла
Да, там походу одно ядро, так же как и в IAR'е. Спасибо.
а как уйти от пошаговой отладки, т.е. сделать так чтоб отладка была до брейк-пойнта? я никак не могу понять
F5, а брейкпоинт на F9 ставится
Здравствуйте.
Как возможно с Вами связаться?
Не получается через Aveal.MicroTechnics@gmail.com. Гугловский Mail Delivery Subsystem возвращает письмо.
Странно, что с почтой какие-то проблемы..
Здравствуйте.
Вы не могли бы заглянуть на http://kazus.ru/forums/showthread.php?p=698803#post698803. Там у меня вопрос в третьем моем посте.
Заранее благодарен.
Вообще логический анализатор этот в Кейле крайне нестабильный какой-то. Лучше, чем-нибудь еще пользоваться при отладке, во всяком случае у меня такие остались впечатления от него )
У меня на 32F303VC в Uvision4 пункт меню Peripherals->General Purpose I/O вырезан вообще. Ну да ладно, проживём)
В Кейле вообще симулятор полноценно работает только для STM32F10x =)
Здравствуйте....
Установил с оф. сайта кейл, не крякал. Начал изучать программирование STM (пока нет железного отладчика, решил потренироваться в симуляторе) по этой статье , но у меня нет в меню Peripherals> пункта General Purpose I/O. Где его найти?
http://img.radiokot.ru/files/39352/thumbnail/9mfr8y5zi.jpg
Тоесть http://img.radiokot.ru/files/39352/medium/9mfr8y5zi.jpg
Наверно не тот контроллер выбран при создании проекта
Прообовал и тот, что вы указывали в начале курса и другие, результат одинаковый....
Я вот сейчас попробовал, открыл проект, там не оказалось тоже ничего в этом меню, как только выбрал STM32F103CB, сразу все появилось
У меня он же стоит( ... Вот для наглядности снял...
http://yadi.sk/d/DgiRoSAvJ78WK
Наверно Кейл другой просто, немного отличается меню) В system viewer можно все посмотреть, gpio и остальную периферию
А здесь точно ничего отмечать не надо?
[url=http://img.radiokot.ru/files/39352/medium/9o6hgmbdp.jpg]
Посмотреть то можно, а вот как выставить пин в 1 или 0 (кнопку эмулировать)?
Аа стоп, как то я упустил из виду, это 5 Кейл чтоли?
Ага...
Я 5 не пользовался ) Может там в другом месте где-то это меню, а могли и вообще урезать функционал влегкую )
Ясно... Попробую тогда поставить 4-ю версию.... Спасибо за помощь, и за проект обучалки в целом. Очень просто и понятно всё описано)))
=) Попробуй 4.70 Keil)
На Офф. только Version 4.73. Пойдёт?
Поставил, 4.73. Меню появилось))
Отлично!))
Чтобы в 5 в симуляторе были эти менюхи, нужно в настройках проекта Project -> Options for Target -> Debug -> в левой части окна (которая относится к симулятору) в поле Dialog DLL: прописать DARMSTM.DLL, а в поле Parameter: -pSTM32F103RB и все появится.
Почему возникает
FCARM - Output Name not specified, please check 'Options for Target - Utilities'
Что делать?
Что-то я не допонял как указать порт. Я уже и копировал из этого урока и вписывал и "х" и "×" и как уже не извращался. Все таки, что там за буква или символ такой?
Эта фишка почему-то некорректно работает в Кейле. У меня, например, на одном компе работало как надо, а на остальных никак. То ли там какая то версия уникальная была Кейла, то ли еще что...
Да уж вот теперь и думаю где искать осциллограф. А то даже не знаю корректно я портировал на 407 камень или нет. Тем не менее спасибо за урок.
Как правильно вставить gpio.ini, с ним не компилится проект
Как правильно вставить gpio.ini, с ним не компилится проект.
Получилось!!!
Где почитать про команды командной строки???
Лучше вообще на самом деле в железе а не в симуляторе все отлаживать..
При каждом нажатии (F10, F11) во время пошаговой отладки курсор перескакивает на страницу system_stm32f4xx.c Надо переходить на main.c вручную, однако следующее нажатие опять тоже.
Keil (Vision V4.74.0.22 - Demo)
меню Peripherals> пункта General Purpose I/O - нет
при нажатии 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
А какой контроллер выбран в настройках проекта?
=======================================
Так же добавлю мое мнение + 3 мнения друзей
довольно серьезных MCUшников
по STM32(да и по аналогу) излагаешь лучше всех !
На сей день это лучший сайт в рунете по STM
По мне так единственный из РУ (ну еще ютуб уроки STM)
От большинства остальных только голова болит
и время в пустую теряешь 🙁
Не хочу показывать пальцам на разных "могучих" дихалтов :))))))))))))))
Вы правы я ошибся и выбрал STM32F103TB вместо STM32F103СB. Все заработало и вкладка General Purpose I/O появилась =D Огромное спасибо!
Подписываюсь к хвалебным отзывам об ваших уроках, материал излагаете очень доступно + поддержка, о которой даже на оф.форумах производителя забывают (diolan.com к примеру)
=)
Уважаемые знатоки! Будьте так добры, подскажите следующий момент. Имею в наличии следующее: микроконтроллер stm32f100c4, связанный с компом через swd интерфейс. Режим отладки в Keil работает, светодиодиком, как показано в примере помигать могу. Но вот графики, как бы я не выводил в logic analyser не отображаются, просто пусто. Я так понимаю, туда выводятся графики только в режиме симуляции (если я не прав, поправьте), а как в таком случае мне в Keil график построить, чтоб в реальном времени, и реальное железо отлаживать? Какие тут варианты и как конкретно реализуется? Заранее спасибо)
Так не получится) Тут один есть хороший вариант - осциллограф )
н о ведь на ходу состояние переменных Keil отображает, что мешает ему график строить?
Насколько я помню он только в режиме симулятора может строить. Да и вообще, в целом, ради интереса можно пару раз построить в Кейловском симуляторе, но для чего-то серьезного это все не подходит.
Вот сейчас в реальном времени наблюдаю изменение состояния глобальной переменной в окне watch. И как же все вот эти описания, неужели это все для режима симуляции?
http://www.arm.com/files/pdf/mcbstm32c_lab.pdf
Просто, на моей прежней работе для отладки ti микроконтроллеров использовался JTAG интерфейс. Там строили графики, смотрели переменные находу - то, что надо для отладки серьезного устройства. Вот у меня и появился вопрос, можно ли это все реализовать на stm32 swd, и судя по тому, что пишут в интернете, не все так однозначно (может не прав )
И кстати, Keil начинает позволять запихивать в logic analyzer переменные только после установки галочки trace enable, может там чего настроить надо
Я честно говоря только в целях тестирования возможностей Кейла задавался этими вопросами, поэтому не могу особо подсказать...
Хотелось бы заметить, что после долгого копания в интернете мне удалось найти инструкцию, как таки подстроить график в Keil в реальном времени на реальной железке. Там пример под stm32f4fiscovery, которая у меня и была под рукой. И о чудо, оно заработало)
Вот ссылка, если кому интересно:
http://www.keil.com/appnotes/files/apnt_230.pdf
Все работает.
В тексте набрана русская буква х
Набирите "la portA" без маски для начала, а потом "la portA & 0x02"
В командной строке пишу
la porta&0х01
la porta&0х02
la porta&0х04
в логическом анализаторе все равно выводится весь порт A.
Помогло в 5-ом Keil-e, спасибо) И меню появилось, и ошибка error 34: undefined identifier исчезла. Только в параметрах прописал Parameter: -pSTM32F103СB тот камень который выбран в проекте.
Привет) Расскажи поподробнее
Добрый день.
Подскажите, как начать работать с STM32 для управления светодиодной матрицей 5х7 TA07-11?
Добрый день!
Попробуйте утилиту STM32CubeMx от ST. Там возможно очень легко настроить любую необходимую периферию и создать базовый проект для дальнейшей работы.
Добрый день!
Спасибо за ответ. Знания пока что очень поверхностные, ваш ресурс довольно понятен для новичка.
Финальная задача состоит в том, чтобы сделать простую программную среду с матрицей кнопок 5х7 в windows. Каждая кнопка должна включать соответствующий светодиод на матрице и выключать его. Возможно ли это реализовать средствами только STM32CubeMx?
Помогите, пожалуйста, советом последовательности действий с чем после чего разбираться чтобы получилось задуманное.
Добрый день!
Распишите, пожалуйста, чуть поподробнее проект... Какой микроконтроллер? Как планируете коммутировать все устройства между собой?
Добрый день!
Плата STM32F103C8T6.
Устройства планировал коммутировать через макетную плату с дополнительными резисторами, т.к. по даташиту на светодиодную матрицу напряжение питания должно быть 2,1-2,5 В, а с GPIO STM32, насколько я понял, снять можно 3,3 В.
Добрый вечер!
В STM32CubeMx можно сконфигурировать всю периферию, в данном случае GPIO. В результате Cube сгенерирует готовый проект с уже прописанной инициализацией. А дальше уже в этом проекте надо добавлять уже непосредственно функционал устройства (работа с матрицей итд).
Доброй ночи!
Научился подавать на выводы 3,3 В, но землю беру с земляного вывода платы. Подскажите, пожалуйста, как прописать на с++ землю на нужный вывод.
P.S. начал работать в CooCox, но примеров такого не нашёл.
Добрый день!
Если Вы через HAL библиотеку управляете выводами, то там одна функция и для вывода логической единицы и для нуля.
Добрый день!
Работал по примерам. Честно говоря, не знаю что такое 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);
Всё, разобрался сам. Извиняюсь, за глупые вопросы)
Прошу прощения, что не успел ответить ) Задавайте любые вопросы, если возникнут, постараюсь помочь!
Добрый день!
Жму кнопку отладки, вылетает сообщение - No ULINK2/ME device founded. Я так понимаю, он просит отладчик присоединить к компу, но в Вашем примере про железо ничего не говорится.
Как быть?
Добрый день!
Я здесь просто в целом хотел процесс отладки описать, без привязки к железу. Вообще я обычно ST-Link использую.
Кроме того, Keil может в режиме симулятора отладку проводить, т. е. эмулировать выполнение программы без железа. В статье как раз такой режим, логический анализатор, если я не ошибаюсь, работает только для симулятора...
Как включить симулятор?
Добрый вечер!
Симулятор был в 4-ом Кейле, если у Вас 5-ый, то, возможно, его убрали оттуда... Но это не точно.