
Stm32 с чего начать изучение...
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Stm32 с чего начать изучение...
К сожалению да(


- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: Stm32 с чего начать изучение...
а во вкладке Debugger что выбрано?
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Stm32 с чего начать изучение...
Вот як то так


Re: Stm32 с чего начать изучение...
Ребят, подскажите - уже устал бороться с системой в одиночку. Довольно долго программировал пики и AVR на ассемблере, привык работать на регистрах без каких-либо библиотек. Сейчас пытаюсь осваивать ARM. Существует ли какая-либо литература с описанием работы с STM32 (на языке C) чисто на регистрах, без всяких там HAL и другого барахла? Желательно на русском языке. На официальную документацию от ST прошу не ссылаться, ибо уровень понятности их документации для новичков, мягко говоря, отстает в сотни раз от того же Микрочипа.
Re: Stm32 с чего начать изучение...
Чем вам библиотеки не понравились? SPL к примеру? Не нужно сильно вникать в особенности нового изучаемого МК.
Они с открытым кодом и если что, можно смотреть как организована работа с регистрами.
Они с открытым кодом и если что, можно смотреть как организована работа с регистрами.
Re: Stm32 с чего начать изучение...
Попытаюсь объяснить, почему я принципиально не использую библиотеки. Вот пример команды инициализации ноги порта из MikroC:
Вопрос: как Вы считаете, смогу ли я вспомнить это идиотство через год, два, три? Да я спустя 1 минуту уже забыл, как пишутся эти операнды! А мало ли поменяется стандарт? Например, CMSIS и HAL сдохнут, введут что-то новое - и что, мне заново учить бред, как здесь говорилось ранее, индусов? В моем же случае я просто лезу в референс мануал и у меня сразу же в голове всплывает такой код:
И это НИКОГДА не поменяется, пока выпускают данные МК. И самое главное, здесь я контролирую каждый бит, каждый такт. А что понаписали в своей библиотеке микроэлектрониковцы - непонятно, также, как непонятно зачем в режиме выхода порта они включают подтяжку к питанию.
Я никому не навязываю свое мнение или видение, просто, мало ли, здесь еще найдутся люди, которые также устали искать информацию по крупицам среди тонн статей с использованием библиотек.
Кстати, поделюсь сайтом, где человек довольно просто и грамотно объясняет все на регистрах: http://narodstream.ru/stm-urok-144-rezh ... p-chast-1/. Там много статей по STM32.
Код: Выделить всё
GPIO_Set_Pin_Mode(&GPIOA_BASE, _GPIO_PIN_0, _GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_PULL_UP);Код: Выделить всё
RCC_APB2ENRbits.IOPAEN = 1 ; // Enable PORTA clock.
GPIOA_CRHbits.CNF12 = 0b00 ; // PA12 as Push-Pull.
GPIOA_CRHbits.MODE12 = 0b10 ; // Output mode, max speed 2 MHz.
Я никому не навязываю свое мнение или видение, просто, мало ли, здесь еще найдутся люди, которые также устали искать информацию по крупицам среди тонн статей с использованием библиотек.
Кстати, поделюсь сайтом, где человек довольно просто и грамотно объясняет все на регистрах: http://narodstream.ru/stm-urok-144-rezh ... p-chast-1/. Там много статей по STM32.
Re: Stm32 с чего начать изучение...
[uquote="Lum1noFor",url="/forum/viewtopic.php?p=3783579#p3783579"]Вопрос: как Вы считаете, смогу ли я вспомнить это идиотство через год, два, три? Да я спустя 1 минуту уже забыл, как пишутся эти операнды![/uquote]
Я, конечно, не призываю использовать HAL/SPL, но в одном случая по крайней мере ясно что происходит:
а в другом, если убрать комментарии, непонятно ничего:
Причем даже эта "наглядность" приводит к накладным расходам, т.к приходится дважды читать и писать в один и тот же регистр... Более того, у всех остальных серий STM32 регистры портов другие и их больше, соответственно придется лезть в другой RM и писать совершенно другой код. Получается сложновато, по крайней мере для людей считающих официальную документацию не очень понятной...
Я, конечно, не призываю использовать HAL/SPL, но в одном случая по крайней мере ясно что происходит:
Код: Выделить всё
GPIO_Set_Pin_Mode(&GPIOA_BASE, _GPIO_PIN_0, _GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_PULL_UP);Код: Выделить всё
GPIOA_CRHbits.CNF12 = 0b00;
GPIOA_CRHbits.MODE12 = 0b10;
Re: Stm32 с чего начать изучение...
Есть правда в Ваших словах, согласен. Хотя, признаю, здесь, скорее, играет бОльшую роль желание понимать, как работает МК, чем какое-либо отвращение к библиотекам. Не хочется становиться ардуинщиком - для меня это позор
.
- Alex-lab
- Потрогал лапой паяльник
- Сообщения: 308
- Зарегистрирован: Ср ноя 20, 2013 11:29:26
- Откуда: Манчестер
- Контактная информация:
Re: Stm32 с чего начать изучение...
Если вы программируете другие контроллеры, то что может быть не понятного в рефмане от производителя? В конечном счете это просто список регистров и способ их манипуляции.
В целом я поддерживаю ваш подход, тоже не использую никакие библиотеки, иногда доходит до экстремизма, приходится просто по рефману дефайнить регистры по их адресам, а потом уже к ним обращаться. Немного громоздко, но зато все под контролем.
Вы бы пример привели того, что вам не понятно.
В целом я поддерживаю ваш подход, тоже не использую никакие библиотеки, иногда доходит до экстремизма, приходится просто по рефману дефайнить регистры по их адресам, а потом уже к ним обращаться. Немного громоздко, но зато все под контролем.
Вы бы пример привели того, что вам не понятно.
При решение наиболее сложных задач, большинство, как правило, ошибается...
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Stm32 с чего начать изучение...
Lum1noFor, работать по RM это хорошо и правильно! Но делать это постоянно - пустая трата времени. А если вы ещё и одновременно с разными типами микроконтроллеров работаете? Поэтому, набираемся смелости и пишем свою библиотеку. И тогда пишем всего одно слово PinMode:: и IDE сама для того процессора с которым мы сейчас работаем предлагает выбрать нужный режим.

И как заметил Reflector, это будет не только эффективней HAL/SPL, но и эффективней того как пишет среднестатистический программист на CMSIS. И не надо в голове держать какие биты в каком регистре для конкретного контроллера надо задать. Даже в пределах STM32 они могут быть как чуть-чуть разные, так и совершенно другие. Не говоря уже про других производителей.
И как заметил Reflector, это будет не только эффективней HAL/SPL, но и эффективней того как пишет среднестатистический программист на CMSIS. И не надо в голове держать какие биты в каком регистре для конкретного контроллера надо задать. Даже в пределах STM32 они могут быть как чуть-чуть разные, так и совершенно другие. Не говоря уже про других производителей.
Re: Stm32 с чего начать изучение...
В MikroC не пишу но из кода сразу понятно что настраивается GPIOA.0 на выход с подтягивающим резистором к плюсу.Lum1noFor писал(а):Вот пример команды инициализации ноги порта из MikroC:
Знаете что это специфический для MikroC код? И он не работает в других IDE.Lum1noFor писал(а):Например, CMSIS и HAL сдохнут, введут что-то новое - и что, мне заново учить бред, как здесь говорилось ранее, индусов? В моем же случае я просто лезу в референс мануал и у меня сразу же в голове всплывает такой код:
Спойлер
Если перестанут поддерживать MikroC ваш код придется полностью переписать, т. к. как уже писал в MikroC нестандартная работа с регистрами.Lum1noFor писал(а):И это НИКОГДА не поменяется, пока выпускают данные МК.
Зачем вы вообще выбрали MikroC? Есть много других IDE в том числе полностью бесплатных (в отличие от продукции микроэлектроники). Вот к примеру EmBitz http://purebasic.mybb.ru/viewtopic.php?id=575
В ней к примеру довольно легко настроить отладку в памяти или подключение к работающему МК. Как это сделать MikroC я так и не разобрался. На нашел настроек линкера и отладчика.
- Alex-lab
- Потрогал лапой паяльник
- Сообщения: 308
- Зарегистрирован: Ср ноя 20, 2013 11:29:26
- Откуда: Манчестер
- Контактная информация:
Re: Stm32 с чего начать изучение...
Все это ни как не мешает работать через регистры. И запоминать их не настолько сложно, а в какой-то мере даже полезно при начальном знакомстве с типом МК.VladislavS писал(а):А если вы ещё и одновременно с разными типами микроконтроллеров работаете?
Обычно программирование микроконтроллера не состоит из одной инициализации периферии, это лишь малая часть выполняемая в самом начале проекта и немного после. Основной функционал обычно содержит лишь короткие однотипные обращения к периферии. "Экономия времени" за счет незнания регистров это экономия на спичках.
Знание регистров само по себе полезно, особенно на этапе освоения.
При решение наиболее сложных задач, большинство, как правило, ошибается...
Re: Stm32 с чего начать изучение...
Спасибо всем за ответы! Пол порядку:
исправить на:
А если бы я использовал библиотеки, а не регистры, то пришлось бы переписывать вообще все.
Почему я завел эту тему? Потому что сам застрял на изучении режима PWM таймера. Уж слишком много непонятных мне настроек, подробного описания которых я найти не могу. Это, конечно, хорошо, когда все гибко настраивается, но при условии наличия нормальной документации.
Не совсем. Такой же формат кода в MPLAB от Микрочипа, а в нем я работал довольно много. В связи с чем и привык к такому представлению.Знаете что это специфический для MikroC код? И он не работает в других IDE
Все, что надо будет переписать - это:Если перестанут поддерживать MikroC ваш код придется полностью переписать
Код: Выделить всё
RCC_APB2ENRbits.IOPAEN = 1Код: Выделить всё
RCC->APB2ENГлавная причина: мне нахаляву подарили на работе лицензию с токеном. Не отказываться же, так? Вторая причина: я категорически не приемлю "кастрированные" версии платных продуктов за огромные деньги, такие, как Keli. Считайте это моим заскоком. Единственная нормальная на мой взгляд среда была - Atollic, когда ее купила ST и сделал бесплатной, но ее сейчас загнули полностью. Бесплатные программы для меня сразу отпадают по причине огромнейшего геморроя с первоначальной настройкой (я пока не очень большой специалист в языках высокого уровня). Попробовал настроить Eclipse + GCC по совету знакомого - чуть мозг не вывихнул. А в МикроСи все сделано для полных нубов - никаких первоначальных настроек, никаких инклудов и подключаемых файлов - поставил галочку в менеджере библиотек и все. Позволяет полностью сконцентрироваться на программе, а не на настройке среды.Зачем вы вообще выбрали MikroC
Да, отладчик в микроси бесполезный. Говорят, поддерживает для отладки только JLink от Segger за космические деньги. И то не знаю как, не пробовал. Софственный отладчик простецкий до жути, не умеет симулировать тики таймеров, переходы в прерывания (только вручную по кнопке) и еще многого. Но, в отличие от MPLAB X хоть правильно считает время выполнения команд.В ней к примеру довольно легко настроить отладку в памяти или подключение к работающему МК. Как это сделать MikroC я так и не разобрался. На нашел настроек линкера и отладчика.
Абсолютно идиотский рефман. Когда на начальном этапе обучения пытался разобраться с прерываниями, долго думал, почему ничего не работает. Оказалось потому, что эти иди... кхм... нехорошие люди из ST запихали описание и настройки NVIC в Programming manual, лишь мельком упомянув его в рефмане. Ну ПОЧЕМУ нельзя было написать 10 лишних страниц?! Дальше: описание конкретного модуля МК может быть раскидано по крупицам по нескольким разным документам в разных местах, порой даже совсем непредсказуемых. Пример - настройка часов реального времени в F103. Половина регистров настройки часов находится, в мать его, разделе управления питанием. Мне после даташитов от микрочипа хочется повеситься от такой документации. Понятное дело, что писали это все в разных отделах компании, может даже в разных странах. Но что у них выйдет ТАКОЕ... Хочу попробовать поработать с контроллерами от NXP - может, у них хоть будет получше документация.Если вы программируете другие контроллеры, то что может быть не понятного в рефмане от производителя?
Почему я завел эту тему? Потому что сам застрял на изучении режима PWM таймера. Уж слишком много непонятных мне настроек, подробного описания которых я найти не могу. Это, конечно, хорошо, когда все гибко настраивается, но при условии наличия нормальной документации.
- Alex-lab
- Потрогал лапой паяльник
- Сообщения: 308
- Зарегистрирован: Ср ноя 20, 2013 11:29:26
- Откуда: Манчестер
- Контактная информация:
Re: Stm32 с чего начать изучение...
Постоянно работаю с таймерами на 103ем процессоре для управления 8кВт преобразователем. Что именно не понятно? Там конечно есть скользкие моменты, что бы первый раз запустить таймер на внешний пин, нужно пройти полосу препятствий.
При решение наиболее сложных задач, большинство, как правило, ошибается...
Re: Stm32 с чего начать изучение...
Вообще-то наLum1noFor писал(а):исправить на:
Код: Выделить всё
RCC->APB2EN |=RCC_APB2ENR_IOPAEN; С MikroC точно тоже самое. Формат работы с регистрами нестандартный.Lum1noFor писал(а):А если бы я использовал библиотеки, а не регистры, то пришлось бы переписывать вообще все.
Но ведь в нем вы не можете компилировать для STM32.Lum1noFor писал(а):Не совсем. Такой же формат кода в MPLAB от Микрочипа
Уже давал ссылку. http://purebasic.mybb.ru/viewtopic.php?id=575Lum1noFor писал(а):Попробовал настроить Eclipse + GCC по совету знакомого - чуть мозг не вывихнул.
Все настроено.
ST-Link поддерживает. http://purebasic.mybb.ru/viewtopic.php?id=564#p7232Lum1noFor писал(а):Да, отладчик в микроси бесполезный. Говорят, поддерживает для отладки только JLink от Segger за космические деньги.
Без аппаратного отладчика не всегда просто найти ошибку. Нарветесь на такую, долго будете искать причину.
И тестируемый код удобно выполнять в ОЗУ (если в МК его достаточно для кода и данных). Каждый раз прошивать это долго и количество стираний страниц ограничено.
Без отладчика сложно согласен.Lum1noFor писал(а):Когда на начальном этапе обучения пытался разобраться с прерываниями, долго думал, почему ничего не работает.
Вот поэтому проще использовать библиотеки.Lum1noFor писал(а):Потому что сам застрял на изучении режима PWM таймера.
Вот к примеру настройка PWM с использованием SPL.
Код: Выделить всё
#include "stm32f10x_conf.h"
extern uint32_t SystemCoreClock;
int main(void)
{
SystemCoreClockUpdate(); // Узнаем тактовую частоту. Результат в SystemCoreClock.
// Тактирование.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// Конфигурация выводов.
GPIO_InitTypeDef GPIO;
GPIO.GPIO_Pin = GPIO_Pin_6; // Выход ШИМ.
GPIO.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO);
// Настройка таймера.
TIM_TimeBaseInitTypeDef Tim;
TIM_TimeBaseStructInit(&Tim);
Tim.TIM_Prescaler = SystemCoreClock / 10000 -1; // После предделителя 10 кГц.
Tim.TIM_Period = 10000 / 1 -1; // Частота переполнений 1 Гц.
TIM_TimeBaseInit(TIM3, &Tim); // Инициализация таймера.
// Настройка ШИМ.
TIM_OCInitTypeDef PWM;
TIM_OCStructInit(&PWM);
PWM.TIM_Pulse = Tim.TIM_Period / 2;
PWM.TIM_OCMode = TIM_OCMode_PWM1;
PWM.TIM_OutputState = TIM_OutputState_Enable;
PWM.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &PWM);
TIM_Cmd(TIM3, ENABLE);
while(1)
{
}
}- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: Stm32 с чего начать изучение...
так CubeIDE тот же самый Эклипс и настроенно из коробки. А джилинк стоит копейки - покупаете свисток стлинк и перешиваете, информации в интеренете куча.
Re: Stm32 с чего начать изучение...
[uquote="Reflector",url="/forum/viewtopic.php?p=3783590#p3783590"][uquote="Lum1noFor",url="/forum/viewtopic.php?p=3783579#p3783579"]Вопрос: как Вы считаете, смогу ли я вспомнить это идиотство через год, два, три? Да я спустя 1 минуту уже забыл, как пишутся эти операнды![/uquote]
Я, конечно, не призываю использовать HAL/SPL, но в одном случая по крайней мере ясно что происходит:
а в другом, если убрать комментарии, непонятно ничего:
Причем даже эта "наглядность" приводит к накладным расходам, т.к приходится дважды читать и писать в один и тот же регистр... Более того, у всех остальных серий STM32 регистры портов другие и их больше, соответственно придется лезть в другой RM и писать совершенно другой код. Получается сложновато, по крайней мере для людей считающих официальную документацию не очень понятной...[/uquote]
Зачем убирать комментарии? И, накладные расходы меньше в случае кода с комментариями. Начинающему, код с комментариями более понятен. И, наконец, просто количество буковок, где ошибаться никак нельзя в коде с комментариями меньшее количество. Комментарий можно написать на национальном языке. Я конечно понимаю, что дело в Ваших личных привычках, но не поддерживаю такую "СТАНДАРТИЗАЦИЮ" на основе СУБЪЕКТИВНОГО восприятия реальности конкретным ИНДИВИДУУМОМ. И, наконец, в случае кода с "комментариями" следует согласиться, что и в этом случае имеет место "субъективизм", но, хотя-бы, для такого случая НИКТО не ВОПИТ о СТАНДАРТИЗАЦИИ. А вот мой личный субъективизм "Современная, якобы, стандартизация видится мне, как попытку создания некой СУБКУЛЬТУРЫ, во многом ограниченной!!! (или, если хотите, САМООГРАНИЧЕННОЙ) и, заключенной в оклад церковной иконы"
Я, конечно, не призываю использовать HAL/SPL, но в одном случая по крайней мере ясно что происходит:
Код: Выделить всё
GPIO_Set_Pin_Mode(&GPIOA_BASE, _GPIO_PIN_0, _GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_PULL_UP);Код: Выделить всё
GPIOA_CRHbits.CNF12 = 0b00;
GPIOA_CRHbits.MODE12 = 0b10;
Зачем убирать комментарии? И, накладные расходы меньше в случае кода с комментариями. Начинающему, код с комментариями более понятен. И, наконец, просто количество буковок, где ошибаться никак нельзя в коде с комментариями меньшее количество. Комментарий можно написать на национальном языке. Я конечно понимаю, что дело в Ваших личных привычках, но не поддерживаю такую "СТАНДАРТИЗАЦИЮ" на основе СУБЪЕКТИВНОГО восприятия реальности конкретным ИНДИВИДУУМОМ. И, наконец, в случае кода с "комментариями" следует согласиться, что и в этом случае имеет место "субъективизм", но, хотя-бы, для такого случая НИКТО не ВОПИТ о СТАНДАРТИЗАЦИИ. А вот мой личный субъективизм "Современная, якобы, стандартизация видится мне, как попытку создания некой СУБКУЛЬТУРЫ, во многом ограниченной!!! (или, если хотите, САМООГРАНИЧЕННОЙ) и, заключенной в оклад церковной иконы"
"Every profession is a conspiracy against the uninitiated" (B. Shaw)
"A textbook can be defined as a book unsuitable for reading" (B. Shaw)
Tautology is humor in "this" place (Vigo Carpathian)
"A textbook can be defined as a book unsuitable for reading" (B. Shaw)
Tautology is humor in "this" place (Vigo Carpathian)
Re: Stm32 с чего начать изучение...
[uquote="Alex-lab",url="/forum/viewtopic.php?p=3784018#p3784018"]Постоянно работаю с таймерами на 103ем процессоре для управления 8кВт преобразователем. Что именно не понятно? Там конечно есть скользкие моменты, что бы первый раз запустить таймер на внешний пин, нужно пройти полосу препятствий.[/uquote]
Для начала непонятно вот что:
Как я понял, при досчитывании таймером до значения регистра ARR таймер сбрасывается и генерируется событие, так? Это аналог регистра периода в PIC, правильно я понимаю?
Далее: регистр TIMx control register 1 (TIMx_CR1).
Что такое ARPE: Auto-reload preload enable
0: TIMx_ARR register is not buffered
1: TIMx_ARR register is buffered
Что такое auto-reload, preload?
Для начала непонятно вот что:
Как я понял, при досчитывании таймером до значения регистра ARR таймер сбрасывается и генерируется событие, так? Это аналог регистра периода в PIC, правильно я понимаю?
Далее: регистр TIMx control register 1 (TIMx_CR1).
Что такое ARPE: Auto-reload preload enable
0: TIMx_ARR register is not buffered
1: TIMx_ARR register is buffered
Что такое auto-reload, preload?
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Stm32 с чего начать изучение...
Lum1noFor, буферизация ARR означает, что содержимое этого регистра изменится не сразу, а при следующем UEV. Это помогает избежать некоторых косяков (скажем, уменьшили значение ARR, когда текущее значение счетчика уже выше нового значения; и таймер будет досчитывать до переполнения).
preload - загрузить новое значение с буферизацией.
ARR - auto reload register.Что такое auto-reload, preload?
preload - загрузить новое значение с буферизацией.
Re: Stm32 с чего начать изучение...
Eddy_Em, Вам бы книжки писать - умеете объяснить для дебилов, спасибо!
Может, кому понадобится - простейшая инициализация TIM2 на регистрах (включение прерывания на регистрах приводить не буду, ибо смысла от этого мало, а сложность приличная - использую родную функцию NVIC_IntEnable). Код на МикроСи, но в довольно понятном виде:
Может, кому понадобится - простейшая инициализация TIM2 на регистрах (включение прерывания на регистрах приводить не буду, ибо смысла от этого мало, а сложность приличная - использую родную функцию NVIC_IntEnable). Код на МикроСи, но в довольно понятном виде:
Код: Выделить всё
void TIM2_Init() { // TIM2 1us delay. F = 8 MHz.
RCC_APB1ENRbits.TIM2EN = 1 ; // Enable TIM2 clock.
TIM2_CR1bits.CEN = 0 ; // Disable TIM2.
TIM2_CR1bits.DIR_ = 0 ; // Counter used as upcounter.
TIM2_PSC = 0 ; // TIM2 prescaler value is 0.
TIM2_ARR = 7 ; // Set TIM2 period.
TIM2_DIERbits.UIE = 1 ; // Allow interrupt on the update event.
NVIC_IntEnable(IVT_INT_TIM2) ; // Enable TIM2 interrupt.
TIM2_CR1bits.CEN = 1 ; // Start TIM1!
}
void Timer2_interrupt() iv IVT_INT_TIM2 {
//Enter your code here
TIM2_SRbits.UIF = 0 ; // Clear TIM2 interrupt flag.
}