STM32 новичку в ARM что к чему
ну у меня куб подобные файлы сам в папку проекта копирует. Как я понимаю, если CMSIS использовать, то файлы надо самому в проект подсовывать. Хотя я кейл не пользую, может там по другому.
- Реклама
Давайте начнем сначала...
Вот у меня платка с контроллером STM32F103C8
Поставил я Кейл. Накачал библиотек разных. Начитался статей всяких и те книжки, что советовали. Архитектуру АРМ вроде понял. Пусть не все понял, но большинство вполне.
Микроконтроллер умеет оперировать только цифрами. Поэтому для него названия команд, даже на ассемблере и регистров аббревиатурами вообще непонятная билиберда.
Так вот. Среда разработки (IDE) тот же Кейл имеет встроенный компилятор языка, который все эти мнемоники и аббревиатуры переводит в тупые цифры для микроконтроллера, которые в свою очередь мы и прошиваем во Флеш его.
Команды с любого языка программирования он (компилятор) умеет переводить в цифры. А названия регистров меняет на их адреса (тоже цифры). Чтобы человеку не помереть в этих цифрах бесконечных, умные люди взяли и присвоили адресам читабельные мнемоники. И насоздавали немереную кучу файлов хидеров. Также эти же люди подумали и дальше. И создали еще и библиотеку СПЛ (и другие тоже), в которой(ых) описали все основные рутинные функции для микроконтроллера. Еще и разбили их на файлы отдельные, где каждый отвечает за что-то свое (настройка тактирования, портов ввода-вывода, АЦП, ЮАРТ и т.д.).
Все что остается обычному программисту, после того, как он разобрался с МК (точнее понял, что из него можно вытянуть, поиметь, получить и на каких ногах и с какой скоростью и с каким напряжением) - это взять и написать свой код, в котором будет очень "удобно" использовать все вышепредложенное для разработки.
Вопрос.
Откуда люди берут именно эти названия функций? и именно эти названия регистров и битов в них?
Я просто заколебался лазить в каждой библиотеке, чтобы посмотреть как эта функция выглядит и что там объявили для какого-либо регистра.
А если я не знаю, что мне нужна именно эта функция? Т.е. в примерах я ее нигде не нашел. Как я могу знать что мне вообще искать?
З.Ы. у меня по КЕйлу почему-то поиск не хочет в файлах искать по названию функции...
Вот у меня платка с контроллером STM32F103C8
Поставил я Кейл. Накачал библиотек разных. Начитался статей всяких и те книжки, что советовали. Архитектуру АРМ вроде понял. Пусть не все понял, но большинство вполне.
Микроконтроллер умеет оперировать только цифрами. Поэтому для него названия команд, даже на ассемблере и регистров аббревиатурами вообще непонятная билиберда.
Так вот. Среда разработки (IDE) тот же Кейл имеет встроенный компилятор языка, который все эти мнемоники и аббревиатуры переводит в тупые цифры для микроконтроллера, которые в свою очередь мы и прошиваем во Флеш его.
Команды с любого языка программирования он (компилятор) умеет переводить в цифры. А названия регистров меняет на их адреса (тоже цифры). Чтобы человеку не помереть в этих цифрах бесконечных, умные люди взяли и присвоили адресам читабельные мнемоники. И насоздавали немереную кучу файлов хидеров. Также эти же люди подумали и дальше. И создали еще и библиотеку СПЛ (и другие тоже), в которой(ых) описали все основные рутинные функции для микроконтроллера. Еще и разбили их на файлы отдельные, где каждый отвечает за что-то свое (настройка тактирования, портов ввода-вывода, АЦП, ЮАРТ и т.д.).
Все что остается обычному программисту, после того, как он разобрался с МК (точнее понял, что из него можно вытянуть, поиметь, получить и на каких ногах и с какой скоростью и с каким напряжением) - это взять и написать свой код, в котором будет очень "удобно" использовать все вышепредложенное для разработки.
Вопрос.
Откуда люди берут именно эти названия функций? и именно эти названия регистров и битов в них?
Я просто заколебался лазить в каждой библиотеке, чтобы посмотреть как эта функция выглядит и что там объявили для какого-либо регистра.
А если я не знаю, что мне нужна именно эта функция? Т.е. в примерах я ее нигде не нашел. Как я могу знать что мне вообще искать?
З.Ы. у меня по КЕйлу почему-то поиск не хочет в файлах искать по названию функции...
Последний раз редактировалось СКАЗОЧНИК Пн янв 21, 2019 11:13:52, всего редактировалось 1 раз.
Станислав
Вы прослушали краткую историю создания языков программирования 
Никакая контра не уйдёт от нас
И вот еще.
У меня есть код для примера:
В первой же строке его мы заводим переменную port типа структуры заданной в каком-то хидере. А потом настраиваем там по обращениям к переменным:
port.GPIO_Mode = GPIO_Mode_Out_PP; и т.д.
Однако у меня такая структура, которую я нашел в хидере STM32F10x.h выглядит не так:
Или я че то гоню? 
У меня есть код для примера:
Спойлер
Код: Выделить всё
//Объявляем переменную port типа GPIO_InitTypeDef
GPIO_InitTypeDef port;
//Это функция из файла stm32f10x_rcc.c, включает тактирование на GPIOA
//GPIOA сидит на шине APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//Про эту функцию напишу чуть ниже
GPIO_StructInit(&port);
//Заполняем поля структуры нужными значениями
//Первый вывод – вход для обработки нажатия кнопки – PA1
port.GPIO_Mode = GPIO_Mode_IPD;
port.GPIO_Pin = GPIO_Pin_1;
port.GPIO_Speed = GPIO_Speed_2MHz;
//А про эту функцию мы уже говорили
//Отметим только что один из параметров – указатель(!) на
//нашу структуру
GPIO_Init(GPIOA, &port);
//Настраиваем вывод, на котором будет висеть диодик – PA0
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &port);port.GPIO_Mode = GPIO_Mode_Out_PP; и т.д.
Однако у меня такая структура, которую я нашел в хидере STM32F10x.h выглядит не так:
Спойлер
Код: Выделить всё
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
Станислав
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3553708#p3553708"]Давайте начнем сначала...
у меня по КЕйлу почему-то поиск не хочет в файлах искать по названию функции...[/uquote]
Странно, у меня Go To Reference и Go To Defenition прекрасно работает
у меня по КЕйлу почему-то поиск не хочет в файлах искать по названию функции...[/uquote]
Странно, у меня Go To Reference и Go To Defenition прекрасно работает
Никакая контра не уйдёт от нас
- Реклама
Все. Последний вопрос свой сам увидел. Там разные структуры. Я не ту нашел. На него можно не отвечать. )))))
Добавлено after 50 seconds:
Добавлено after 50 seconds:
Где это? Как это включить? Чего нажать?prinv писал(а):Go To Reference и Go To Defenition
Станислав
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3553713#p3553713"]Или я че то гоню?
[/uquote]
GPIO_InitTypeDef != GPIO_TypeDef
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3553717#p3553717"]Где это? Как это включить? Чего нажать?[/uquote]
Правой кнопкой кликнуть на типе
GPIO_InitTypeDef != GPIO_TypeDef
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3553717#p3553717"]Где это? Как это включить? Чего нажать?[/uquote]
Правой кнопкой кликнуть на типе
Никакая контра не уйдёт от нас
Спасибо, но я сам только учусь.
Никакая контра не уйдёт от нас
Хотел лайкнуть вам, а движок форума еще не наладили. ) Поощрения виртуальные не работают.
Станислав
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Допустим нужны функции для RCC. Открываете файл stm32f1xx_rcc.c и смотрите список функций.СКАЗОЧНИК писал(а):А если я не знаю, что мне нужна именно эта функция?
Спойлер
Если имя функции известно, то все гораздо проще. Три первых пункта контекстного меню для поиска объявления, реализации и ссылок на функцию.
Спойлер
Вот и я уже посмотрел, что Кейл не такой простой на самом деле. В плане того, что его отдельно еще надо изучать. Есть там все, просто надо по вкладочкам окон полазить и лучше станет. Ладно, не все сразу приходит. ))))
Вопросов еще будет много... И тупых тоже.
Добавлено after 32 minutes 47 seconds:
Подскажите еще, вот у меня куча библиотек подключилась в дереве проектов и при компиляции он их все по очереди шурудит, чем очень долго соображает. Как их оттуда удалить лишние, если я не использую?
Добавлено after 1 minute 36 seconds:
На них еще ключики нарисованы...
Добавлено after 4 minutes 13 seconds:
З.Ы.
И еще, вот такая штука есть
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Speed = GPIO_Speed_2MHz;
В ней сконфигурирован один вывод порта на ВЫХОД как пуш-пул с частотой тактирования 2 МГц.
А как мне сконфигурировать сразу 8 выводов в таком же виде? от РА0 до РА7?
З.З.Ы. и правильно ли я понимаю, что в данном виде, если не использовать задержки никакие (или таймеры) то светодиод на этом выводе будет моргать с частотой 2 МГц?
Добавлено after 16 minutes 15 seconds:
И маленько меня можно поздравить
Я зажег свой собственный светодиодик!
Вот, кстати, эти платки мне подарили на КотМороз 2019.
Платку с синенькими светодиодиками пришлось чуток доработать.
З.З.З.Ы. А как еще настроить чтобы СТ-Линк 2 прямо из Кейла прошивал ? А то он стирает и что-то типа шьет, но не ХЕКС. Приходится другой программой шить.
Вопросов еще будет много... И тупых тоже.
Добавлено after 32 minutes 47 seconds:
Подскажите еще, вот у меня куча библиотек подключилась в дереве проектов и при компиляции он их все по очереди шурудит, чем очень долго соображает. Как их оттуда удалить лишние, если я не использую?
Добавлено after 1 minute 36 seconds:
На них еще ключики нарисованы...
Добавлено after 4 minutes 13 seconds:
З.Ы.
И еще, вот такая штука есть
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Speed = GPIO_Speed_2MHz;
В ней сконфигурирован один вывод порта на ВЫХОД как пуш-пул с частотой тактирования 2 МГц.
А как мне сконфигурировать сразу 8 выводов в таком же виде? от РА0 до РА7?
З.З.Ы. и правильно ли я понимаю, что в данном виде, если не использовать задержки никакие (или таймеры) то светодиод на этом выводе будет моргать с частотой 2 МГц?
Добавлено after 16 minutes 15 seconds:
И маленько меня можно поздравить
Вот, кстати, эти платки мне подарили на КотМороз 2019.
Спойлер

З.З.З.Ы. А как еще настроить чтобы СТ-Линк 2 прямо из Кейла прошивал ? А то он стирает и что-то типа шьет, но не ХЕКС. Приходится другой программой шить.
Станислав
port.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
Скорость порта это немного другая штука.
Кого прошивал чет не понял? Вы порой такую хуйню придумываете что диву даешься вы под чем то находитесь?
Скорость порта это немного другая штука.
Кого прошивал чет не понял? Вы порой такую хуйню придумываете что диву даешься вы под чем то находитесь?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Я уже пару недель себе мозг взырваю: языком Си, регистрами и библиотеками СТМ32... АРМ архитектурой... Тут из без "под чем-то" можно двинуться.Oxford писал(а):Вы порой такую хуйню придумываете что диву даешься вы под чем то находитесь?
До сих пор многое понять не могу. Одно ссылается на другое. Структуры ссылаются на структуры. В функции передаются структуры и просто константы... В глазах рябит. С одной подключенной библиотеки прыгает в другую. А тактирование, оказывается по умолчанию CMSYS без меня уже настроил...
И тут ошибся... Ничего он не настроил.
Микроконтроллер получается сам запускается от внутреннего RC генератора на 8 МГц?
Тяжело это все дается, когда до этого немного сидел с AVRками и на ассемблере.
А спросить я хотел про это (может не так выразился)... :
У меня плата, та что на фотографии по SWD через ST-LINK V2 подключена к компу. На компе у меня Кейл установлен. Где-то возможно в Кейле есть галочка, чтобы использовать этот СТ-Линк для заливки hex файла прямо в контроллер. Чтобы не использовать другие программы.
P/S
ТАк:
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
port.GPIO_Speed = GPIO_Speed_2MHz;
1. Значит все выводы порта настроились как пуш-пул?
2. Тактирование также для всех?
Добавлено after 13 minutes 3 seconds:
Проверил. Так работает и все светодиоды горят. Тяжело доходит, что мы в переменную структуры сначала запихали целую маску? Потом все это передали в функцию.
Может ну ее эту SPL. ?! Почему везде пишут, что с нею проще, а я не могу догнать где что в МК происходит, не то, что в МК даже в самой SPL?
Станислав
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Сказочник, прочтите для начала .
http://mcu.goodboard.ru/viewtopic.php?id=15
http://mcu.goodboard.ru/viewtopic.php?id=11
И крайне не советую слушать Мурика.
Это такой же тыкальщик, ничего не соображающий...
http://mcu.goodboard.ru/viewtopic.php?id=15
http://mcu.goodboard.ru/viewtopic.php?id=11
И крайне не советую слушать Мурика.
Это такой же тыкальщик, ничего не соображающий...
И это ещё не начали CubeMX и HAL советовать! 
Никакая контра не уйдёт от нас
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Неужели сложно посмотреть код функции и попытаться понят как она устроена? Запустите отладку и посмотрите по шагам что и как выполняется. Что в регистрах и в переменных. Станет намного понятней.СКАЗОЧНИК писал(а):Может ну ее эту SPL. ?! Почему везде пишут, что с нею проще, а я не могу догнать где что в МК происходит, не то, что в МК даже в самой SPL?
Если непонятна SPL, попробуйте написать код без нее.
Не слушайте dosikus'а. От него нет пользы в большинстве случаев. Он обычно только хамит на форуме.
Последний раз редактировалось Мурик Пн янв 21, 2019 20:29:22, всего редактировалось 2 раза.
КубМХ я уже попробовал один раз. Он там понаписал всякой кучи... Вроде ничего плохого, но пока рано.
Опять холивар начинается?
Опять холивар начинается?
Станислав
Посмотрите http://narodstream.ru/programmirovanie-mk-stm32/ - не идеал, но вполне доступно рассказывает дядька.
Никакая контра не уйдёт от нас
СКАЗОЧНИК, а вообще, надо, все-таки, прочитать описание аппаратуры МК. Поскольку STM32 - изделие сложное и объем документации на него во много раз больше, чем у тех же АВР-ок, ST не стали толкать всю документацию в один даташит. Кроме даташита, на каждое семейство ST-шных МК есть еще Programming manual, в котором описаны особенности реализации ядра ARM в конкретном семействе и Reference manual, в котором описана периферия этого семейства.
В частности, для F103 это документы PM0056 и RM0008. Ищутся на st.com в одно движение: набираешь в ST-шном поисковике PM0056 или RM0008 и первая ссылка указывает на нужную ПДФ-ку. И тот самый RM0008 - первоисточник символических наименований для всех регистров и битов этого МК.
Внимание! Кто держит копию RM0008 у себя, обновите ее. В только что прошедшем декабре вышла 20-я ревизия этого документа.
Добавлено after 1 hour 22 minutes 28 seconds:
А воевать с битами GPIO, наверное, проще, все-таки, напрямую. В заголовочном файле stm32f10x.h описаны константные указатели на GPIO, они так и называются - GPIOA, GPIOB, ... Включил тактирование выбранного порта, дальше делаешь и все, можешь мигать светодиодом на GPIOC 13 (второй красный светодиод на основной плате). Да, "магические числа", но без них ни хрена не поймешь, по крайней мере поначалу. А мигать, например, так:
Можно "мигать" и другими способами, например прямой записью в GPIOC->ODR, или записью в старшие 16 битов GPIOC->BSRR. Опять же, "магические числа", но без них не прочувствуешь, как себя ведут эти самые GPIO.
Теперь чуток про Кейл. Давишь ему в строке меню Flash, выбираешь Configure Flash Tools, справа вверху выбираешь ST-Link Debugger и, при подключенном ST-Link'е давишь рядом кнопку Settings. Кейл сам опознает ST-Link V2, порт там будет стоять JTAG, это не годится, замени на SW. Перейди на вкладку Flash Download и добавь там галочку Reset and Run, остальные не трогай. Все. Можешь заливать свежесобранный проект прямо из Кейла, можешь отлаживать "в железе" - нажми кнопку Start/Stop Debugging Session, и хоть исполняй по одной команде, хоть назначай брекпоинты, хоть что хочешь - отладчик у Кейла весьма продвинутый.
В частности, для F103 это документы PM0056 и RM0008. Ищутся на st.com в одно движение: набираешь в ST-шном поисковике PM0056 или RM0008 и первая ссылка указывает на нужную ПДФ-ку. И тот самый RM0008 - первоисточник символических наименований для всех регистров и битов этого МК.
Внимание! Кто держит копию RM0008 у себя, обновите ее. В только что прошедшем декабре вышла 20-я ревизия этого документа.
Добавлено after 1 hour 22 minutes 28 seconds:
SPL уже всё. Нет ее.СКАЗОЧНИК писал(а):Может ну ее эту SPL. ?! Почему везде пишут, что с нею проще, а я не могу догнать где что в МК происходит, не то, что в МК даже в самой SPL?
А воевать с битами GPIO, наверное, проще, все-таки, напрямую. В заголовочном файле stm32f10x.h описаны константные указатели на GPIO, они так и называются - GPIOA, GPIOB, ... Включил тактирование выбранного порта, дальше делаешь
Код: Выделить всё
GPIOC->CRH &= 0xFF0FFFFF; // Очистить CNF13 и MODE13
GPIOC->CRH |= 0x00200000; // GPIOC бит 13 - режим вывода до 2 МГцКод: Выделить всё
GPIOC->BSRR = 0x2000; // Погасить светодиод на GPIOC13.
// Он включен между ногой C13 и +3.3,
// поэтому гасит его единица на ноге C13.
...
GPIOC->BRR = 0x2000; // Зажечь светодиод на С13Теперь чуток про Кейл. Давишь ему в строке меню Flash, выбираешь Configure Flash Tools, справа вверху выбираешь ST-Link Debugger и, при подключенном ST-Link'е давишь рядом кнопку Settings. Кейл сам опознает ST-Link V2, порт там будет стоять JTAG, это не годится, замени на SW. Перейди на вкладку Flash Download и добавь там галочку Reset and Run, остальные не трогай. Все. Можешь заливать свежесобранный проект прямо из Кейла, можешь отлаживать "в железе" - нажми кнопку Start/Stop Debugging Session, и хоть исполняй по одной команде, хоть назначай брекпоинты, хоть что хочешь - отладчик у Кейла весьма продвинутый.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)


