STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

ну у меня куб подобные файлы сам в папку проекта копирует. Как я понимаю, если CMSIS использовать, то файлы надо самому в проект подсовывать. Хотя я кейл не пользую, может там по другому.
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Давайте начнем сначала...

Вот у меня платка с контроллером STM32F103C8
Поставил я Кейл. Накачал библиотек разных. Начитался статей всяких и те книжки, что советовали. Архитектуру АРМ вроде понял. Пусть не все понял, но большинство вполне.

Микроконтроллер умеет оперировать только цифрами. Поэтому для него названия команд, даже на ассемблере и регистров аббревиатурами вообще непонятная билиберда.
Так вот. Среда разработки (IDE) тот же Кейл имеет встроенный компилятор языка, который все эти мнемоники и аббревиатуры переводит в тупые цифры для микроконтроллера, которые в свою очередь мы и прошиваем во Флеш его.
Команды с любого языка программирования он (компилятор) умеет переводить в цифры. А названия регистров меняет на их адреса (тоже цифры). Чтобы человеку не помереть в этих цифрах бесконечных, умные люди взяли и присвоили адресам читабельные мнемоники. И насоздавали немереную кучу файлов хидеров. Также эти же люди подумали и дальше. И создали еще и библиотеку СПЛ (и другие тоже), в которой(ых) описали все основные рутинные функции для микроконтроллера. Еще и разбили их на файлы отдельные, где каждый отвечает за что-то свое (настройка тактирования, портов ввода-вывода, АЦП, ЮАРТ и т.д.).

Все что остается обычному программисту, после того, как он разобрался с МК (точнее понял, что из него можно вытянуть, поиметь, получить и на каких ногах и с какой скоростью и с каким напряжением) - это взять и написать свой код, в котором будет очень "удобно" использовать все вышепредложенное для разработки.

Вопрос.
Откуда люди берут именно эти названия функций? и именно эти названия регистров и битов в них?

Я просто заколебался лазить в каждой библиотеке, чтобы посмотреть как эта функция выглядит и что там объявили для какого-либо регистра.
А если я не знаю, что мне нужна именно эта функция? Т.е. в примерах я ее нигде не нашел. Как я могу знать что мне вообще искать?

З.Ы. у меня по КЕйлу почему-то поиск не хочет в файлах искать по названию функции...
Последний раз редактировалось СКАЗОЧНИК Пн янв 21, 2019 11:13:52, всего редактировалось 1 раз.
Станислав
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Вы прослушали краткую историю создания языков программирования :-)
Никакая контра не уйдёт от нас
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

И вот еще.

У меня есть код для примера:
Спойлер

Код: Выделить всё

//Объявляем переменную 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 типа структуры заданной в каком-то хидере. А потом настраиваем там по обращениям к переменным:
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;
Или я че то гоню? :?
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3553708#p3553708"]Давайте начнем сначала...
у меня по КЕйлу почему-то поиск не хочет в файлах искать по названию функции...[/uquote]
Странно, у меня Go To Reference и Go To Defenition прекрасно работает
Никакая контра не уйдёт от нас
Контактная информация:
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Все. Последний вопрос свой сам увидел. Там разные структуры. Я не ту нашел. На него можно не отвечать. )))))

Добавлено after 50 seconds:
prinv писал(а):Go To Reference и Go To Defenition
Где это? Как это включить? Чего нажать?
Станислав
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3553713#p3553713"]Или я че то гоню? :?[/uquote]
GPIO_InitTypeDef != GPIO_TypeDef

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3553717#p3553717"]Где это? Как это включить? Чего нажать?[/uquote]
Правой кнопкой кликнуть на типе
Никакая контра не уйдёт от нас
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Блин! Вы золотой человек! :beer:
Станислав
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Спасибо, но я сам только учусь.
Никакая контра не уйдёт от нас
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Хотел лайкнуть вам, а движок форума еще не наладили. ) Поощрения виртуальные не работают.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

СКАЗОЧНИК писал(а):А если я не знаю, что мне нужна именно эта функция?
Допустим нужны функции для RCC. Открываете файл stm32f1xx_rcc.c и смотрите список функций.
СпойлерИзображение
Funct.png
(89.98 КБ) 108 скачиваний
Ищите функцию с подходящим названием и кликаете по ней для получения дополнительной информации.
Если имя функции известно, то все гораздо проще. Три первых пункта контекстного меню для поиска объявления, реализации и ссылок на функцию.
СпойлерИзображение
Find.png
(19.78 КБ) 103 скачивания
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот и я уже посмотрел, что Кейл не такой простой на самом деле. В плане того, что его отдельно еще надо изучать. Есть там все, просто надо по вкладочкам окон полазить и лучше станет. Ладно, не все сразу приходит. ))))

Вопросов еще будет много... И тупых тоже.

Добавлено 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:
И маленько меня можно поздравить 8) Я зажег свой собственный светодиодик!
Вот, кстати, эти платки мне подарили на КотМороз 2019. :hunger: Платку с синенькими светодиодиками пришлось чуток доработать.
СпойлерИзображение

З.З.З.Ы. А как еще настроить чтобы СТ-Линк 2 прямо из Кейла прошивал ? А то он стирает и что-то типа шьет, но не ХЕКС. Приходится другой программой шить.
Станислав
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

port.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;

Скорость порта это немного другая штука.
Кого прошивал чет не понял? Вы порой такую хуйню придумываете что диву даешься вы под чем то находитесь?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Oxford писал(а):Вы порой такую хуйню придумываете что диву даешься вы под чем то находитесь?
Я уже пару недель себе мозг взырваю: языком Си, регистрами и библиотеками СТМ32... АРМ архитектурой... Тут из без "под чем-то" можно двинуться.
До сих пор многое понять не могу. Одно ссылается на другое. Структуры ссылаются на структуры. В функции передаются структуры и просто константы... В глазах рябит. С одной подключенной библиотеки прыгает в другую. А тактирование, оказывается по умолчанию CMSYS без меня уже настроил... :facepalm:
И тут ошибся... Ничего он не настроил.
Микроконтроллер получается сам запускается от внутреннего 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

Сообщение dosikus »

Сказочник, прочтите для начала .
http://mcu.goodboard.ru/viewtopic.php?id=15

http://mcu.goodboard.ru/viewtopic.php?id=11
И крайне не советую слушать Мурика.
Это такой же тыкальщик, ничего не соображающий...
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

И это ещё не начали CubeMX и HAL советовать! :-)
Никакая контра не уйдёт от нас
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

СКАЗОЧНИК писал(а):Может ну ее эту SPL. ?! Почему везде пишут, что с нею проще, а я не могу догнать где что в МК происходит, не то, что в МК даже в самой SPL?
Неужели сложно посмотреть код функции и попытаться понят как она устроена? Запустите отладку и посмотрите по шагам что и как выполняется. Что в регистрах и в переменных. Станет намного понятней.

Если непонятна SPL, попробуйте написать код без нее.

Не слушайте dosikus'а. От него нет пользы в большинстве случаев. Он обычно только хамит на форуме.
Последний раз редактировалось Мурик Пн янв 21, 2019 20:29:22, всего редактировалось 2 раза.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

КубМХ я уже попробовал один раз. Он там понаписал всякой кучи... Вроде ничего плохого, но пока рано.

Опять холивар начинается?
Станислав
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Посмотрите http://narodstream.ru/programmirovanie-mk-stm32/ - не идеал, но вполне доступно рассказывает дядька.
Никакая контра не уйдёт от нас
Контактная информация:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

СКАЗОЧНИК, а вообще, надо, все-таки, прочитать описание аппаратуры МК. Поскольку 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:
СКАЗОЧНИК писал(а):Может ну ее эту SPL. ?! Почему везде пишут, что с нею проще, а я не могу догнать где что в МК происходит, не то, что в МК даже в самой SPL?
SPL уже всё. Нет ее.

А воевать с битами GPIO, наверное, проще, все-таки, напрямую. В заголовочном файле stm32f10x.h описаны константные указатели на GPIO, они так и называются - GPIOA, GPIOB, ... Включил тактирование выбранного порта, дальше делаешь

Код: Выделить всё

GPIOC->CRH &= 0xFF0FFFFF; // Очистить CNF13 и MODE13
GPIOC->CRH |= 0x00200000; // GPIOC бит 13 - режим вывода до 2 МГц
и все, можешь мигать светодиодом на GPIOC 13 (второй красный светодиод на основной плате). Да, "магические числа", но без них ни хрена не поймешь, по крайней мере поначалу. А мигать, например, так:

Код: Выделить всё

GPIOC->BSRR = 0x2000; // Погасить светодиод на GPIOC13. 
                      // Он включен между ногой C13 и +3.3, 
                      // поэтому гасит его единица на ноге C13.
...
GPIOC->BRR = 0x2000; // Зажечь светодиод на С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, и хоть исполняй по одной команде, хоть назначай брекпоинты, хоть что хочешь - отладчик у Кейла весьма продвинутый.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Ответить

Вернуться в «ARM»