Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Stm32 с чего начать изучение...

Ср янв 15, 2020 17:05:33

К сожалению да(
Изображение

Re: Stm32 с чего начать изучение...

Ср янв 15, 2020 17:38:24

а во вкладке Debugger что выбрано?

Re: Stm32 с чего начать изучение...

Ср янв 15, 2020 18:42:59

Вот як то так
Изображение

Re: Stm32 с чего начать изучение...

Сб фев 01, 2020 23:57:16

Ребят, подскажите - уже устал бороться с системой в одиночку. Довольно долго программировал пики и AVR на ассемблере, привык работать на регистрах без каких-либо библиотек. Сейчас пытаюсь осваивать ARM. Существует ли какая-либо литература с описанием работы с STM32 (на языке C) чисто на регистрах, без всяких там HAL и другого барахла? Желательно на русском языке. На официальную документацию от ST прошу не ссылаться, ибо уровень понятности их документации для новичков, мягко говоря, отстает в сотни раз от того же Микрочипа.

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 00:12:00

Чем вам библиотеки не понравились? SPL к примеру? Не нужно сильно вникать в особенности нового изучаемого МК.
Они с открытым кодом и если что, можно смотреть как организована работа с регистрами.

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 00:29:10

Попытаюсь объяснить, почему я принципиально не использую библиотеки. Вот пример команды инициализации ноги порта из MikroC:

Код:
GPIO_Set_Pin_Mode(&GPIOA_BASE, _GPIO_PIN_0, _GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_PULL_UP);


Вопрос: как Вы считаете, смогу ли я вспомнить это идиотство через год, два, три? Да я спустя 1 минуту уже забыл, как пишутся эти операнды! А мало ли поменяется стандарт? Например, CMSIS и HAL сдохнут, введут что-то новое - и что, мне заново учить бред, как здесь говорилось ранее, индусов? В моем же случае я просто лезу в референс мануал и у меня сразу же в голове всплывает такой код:

Код:
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 с чего начать изучение...

Вс фев 02, 2020 01:05:12

Вопрос: как Вы считаете, смогу ли я вспомнить это идиотство через год, два, три? Да я спустя 1 минуту уже забыл, как пишутся эти операнды!

Я, конечно, не призываю использовать 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;

Причем даже эта "наглядность" приводит к накладным расходам, т.к приходится дважды читать и писать в один и тот же регистр... Более того, у всех остальных серий STM32 регистры портов другие и их больше, соответственно придется лезть в другой RM и писать совершенно другой код. Получается сложновато, по крайней мере для людей считающих официальную документацию не очень понятной...

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 03:46:52

Есть правда в Ваших словах, согласен. Хотя, признаю, здесь, скорее, играет бОльшую роль желание понимать, как работает МК, чем какое-либо отвращение к библиотекам. Не хочется становиться ардуинщиком - для меня это позор :).

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 04:26:58

Если вы программируете другие контроллеры, то что может быть не понятного в рефмане от производителя? В конечном счете это просто список регистров и способ их манипуляции.
В целом я поддерживаю ваш подход, тоже не использую никакие библиотеки, иногда доходит до экстремизма, приходится просто по рефману дефайнить регистры по их адресам, а потом уже к ним обращаться. Немного громоздко, но зато все под контролем.
Вы бы пример привели того, что вам не понятно.

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 05:22:45

Lum1noFor, работать по RM это хорошо и правильно! Но делать это постоянно - пустая трата времени. А если вы ещё и одновременно с разными типами микроконтроллеров работаете? Поэтому, набираемся смелости и пишем свою библиотеку. И тогда пишем всего одно слово PinMode:: и IDE сама для того процессора с которым мы сейчас работаем предлагает выбрать нужный режим.
Изображение
И как заметил Reflector, это будет не только эффективней HAL/SPL, но и эффективней того как пишет среднестатистический программист на CMSIS. И не надо в голове держать какие биты в каком регистре для конкретного контроллера надо задать. Даже в пределах STM32 они могут быть как чуть-чуть разные, так и совершенно другие. Не говоря уже про других производителей.
PinMode.png
(18.93 KiB) Скачиваний: 799

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 13:24:11

Lum1noFor писал(а):Вот пример команды инициализации ноги порта из MikroC:
В MikroC не пишу но из кода сразу понятно что настраивается GPIOA.0 на выход с подтягивающим резистором к плюсу.

Lum1noFor писал(а):Например, CMSIS и HAL сдохнут, введут что-то новое - и что, мне заново учить бред, как здесь говорилось ранее, индусов? В моем же случае я просто лезу в референс мануал и у меня сразу же в голове всплывает такой код:
Знаете что это специфический для MikroC код? И он не работает в других IDE.
Кроме того, код настройки выводов через регистры у F0, F1 и др. отличается, а в случае GPIO_Set_Pin_Mode он скорее всего будет тем же.

Lum1noFor писал(а):И это НИКОГДА не поменяется, пока выпускают данные МК.
Если перестанут поддерживать MikroC ваш код придется полностью переписать, т. к. как уже писал в MikroC нестандартная работа с регистрами. :facepalm:
Зачем вы вообще выбрали MikroC? Есть много других IDE в том числе полностью бесплатных (в отличие от продукции микроэлектроники). Вот к примеру EmBitz http://purebasic.mybb.ru/viewtopic.php?id=575
В ней к примеру довольно легко настроить отладку в памяти или подключение к работающему МК. Как это сделать MikroC я так и не разобрался. На нашел настроек линкера и отладчика. :dont_know:

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 14:58:42

VladislavS писал(а):А если вы ещё и одновременно с разными типами микроконтроллеров работаете?

Все это ни как не мешает работать через регистры. И запоминать их не настолько сложно, а в какой-то мере даже полезно при начальном знакомстве с типом МК.
Обычно программирование микроконтроллера не состоит из одной инициализации периферии, это лишь малая часть выполняемая в самом начале проекта и немного после. Основной функционал обычно содержит лишь короткие однотипные обращения к периферии. "Экономия времени" за счет незнания регистров это экономия на спичках.
Знание регистров само по себе полезно, особенно на этапе освоения.

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 21:48:21

Спасибо всем за ответы! Пол порядку:

Знаете что это специфический для MikroC код? И он не работает в других IDE


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

Если перестанут поддерживать MikroC ваш код придется полностью переписать


Все, что надо будет переписать - это:

Код:
RCC_APB2ENRbits.IOPAEN      = 1


исправить на:

Код:
RCC->APB2EN


А если бы я использовал библиотеки, а не регистры, то пришлось бы переписывать вообще все.

Зачем вы вообще выбрали MikroC


Главная причина: мне нахаляву подарили на работе лицензию с токеном. Не отказываться же, так? Вторая причина: я категорически не приемлю "кастрированные" версии платных продуктов за огромные деньги, такие, как Keli. Считайте это моим заскоком. Единственная нормальная на мой взгляд среда была - Atollic, когда ее купила ST и сделал бесплатной, но ее сейчас загнули полностью. Бесплатные программы для меня сразу отпадают по причине огромнейшего геморроя с первоначальной настройкой (я пока не очень большой специалист в языках высокого уровня). Попробовал настроить Eclipse + GCC по совету знакомого - чуть мозг не вывихнул. А в МикроСи все сделано для полных нубов - никаких первоначальных настроек, никаких инклудов и подключаемых файлов - поставил галочку в менеджере библиотек и все. Позволяет полностью сконцентрироваться на программе, а не на настройке среды.

В ней к примеру довольно легко настроить отладку в памяти или подключение к работающему МК. Как это сделать MikroC я так и не разобрался. На нашел настроек линкера и отладчика.


Да, отладчик в микроси бесполезный. Говорят, поддерживает для отладки только JLink от Segger за космические деньги. И то не знаю как, не пробовал. Софственный отладчик простецкий до жути, не умеет симулировать тики таймеров, переходы в прерывания (только вручную по кнопке) и еще многого. Но, в отличие от MPLAB X хоть правильно считает время выполнения команд.

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


Абсолютно идиотский рефман. Когда на начальном этапе обучения пытался разобраться с прерываниями, долго думал, почему ничего не работает. Оказалось потому, что эти иди... кхм... нехорошие люди из ST запихали описание и настройки NVIC в Programming manual, лишь мельком упомянув его в рефмане. Ну ПОЧЕМУ нельзя было написать 10 лишних страниц?! Дальше: описание конкретного модуля МК может быть раскидано по крупицам по нескольким разным документам в разных местах, порой даже совсем непредсказуемых. Пример - настройка часов реального времени в F103. Половина регистров настройки часов находится, в мать его, разделе управления питанием. Мне после даташитов от микрочипа хочется повеситься от такой документации. Понятное дело, что писали это все в разных отделах компании, может даже в разных странах. Но что у них выйдет ТАКОЕ... Хочу попробовать поработать с контроллерами от NXP - может, у них хоть будет получше документация.


Почему я завел эту тему? Потому что сам застрял на изучении режима PWM таймера. Уж слишком много непонятных мне настроек, подробного описания которых я найти не могу. Это, конечно, хорошо, когда все гибко настраивается, но при условии наличия нормальной документации.

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 22:59:43

Постоянно работаю с таймерами на 103ем процессоре для управления 8кВт преобразователем. Что именно не понятно? Там конечно есть скользкие моменты, что бы первый раз запустить таймер на внешний пин, нужно пройти полосу препятствий.

Re: Stm32 с чего начать изучение...

Вс фев 02, 2020 23:38:08

Lum1noFor писал(а):исправить на:
Вообще-то на
Код:
RCC->APB2EN |=RCC_APB2ENR_IOPAEN;
А теперь представьте что нужно переписать сотни, а то и тысячи строк.

Lum1noFor писал(а):А если бы я использовал библиотеки, а не регистры, то пришлось бы переписывать вообще все.
С MikroC точно тоже самое. Формат работы с регистрами нестандартный.

Lum1noFor писал(а):Не совсем. Такой же формат кода в MPLAB от Микрочипа
Но ведь в нем вы не можете компилировать для STM32.

Lum1noFor писал(а):Попробовал настроить Eclipse + GCC по совету знакомого - чуть мозг не вывихнул.
Уже давал ссылку. http://purebasic.mybb.ru/viewtopic.php?id=575
Все настроено.

Lum1noFor писал(а):Да, отладчик в микроси бесполезный. Говорят, поддерживает для отладки только JLink от Segger за космические деньги.
ST-Link поддерживает. http://purebasic.mybb.ru/viewtopic.php?id=564#p7232
Без аппаратного отладчика не всегда просто найти ошибку. Нарветесь на такую, долго будете искать причину.
И тестируемый код удобно выполнять в ОЗУ (если в МК его достаточно для кода и данных). Каждый раз прошивать это долго и количество стираний страниц ограничено.

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)
    {
    }
}
В отличие от MikroC, библиотека SPL с исходниками и вы можете посмотреть как устроены функции что поможет понять как работать с регистрами.

Re: Stm32 с чего начать изучение...

Пн фев 03, 2020 12:48:16

так CubeIDE тот же самый Эклипс и настроенно из коробки. А джилинк стоит копейки - покупаете свисток стлинк и перешиваете, информации в интеренете куча.

Re: Stm32 с чего начать изучение...

Пн фев 03, 2020 19:45:50

Вопрос: как Вы считаете, смогу ли я вспомнить это идиотство через год, два, три? Да я спустя 1 минуту уже забыл, как пишутся эти операнды!

Я, конечно, не призываю использовать 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;

Причем даже эта "наглядность" приводит к накладным расходам, т.к приходится дважды читать и писать в один и тот же регистр... Более того, у всех остальных серий STM32 регистры портов другие и их больше, соответственно придется лезть в другой RM и писать совершенно другой код. Получается сложновато, по крайней мере для людей считающих официальную документацию не очень понятной...

Зачем убирать комментарии? И, накладные расходы меньше в случае кода с комментариями. Начинающему, код с комментариями более понятен. И, наконец, просто количество буковок, где ошибаться никак нельзя в коде с комментариями меньшее количество. Комментарий можно написать на национальном языке. Я конечно понимаю, что дело в Ваших личных привычках, но не поддерживаю такую "СТАНДАРТИЗАЦИЮ" на основе СУБЪЕКТИВНОГО восприятия реальности конкретным ИНДИВИДУУМОМ. И, наконец, в случае кода с "комментариями" следует согласиться, что и в этом случае имеет место "субъективизм", но, хотя-бы, для такого случая НИКТО не ВОПИТ о СТАНДАРТИЗАЦИИ. А вот мой личный субъективизм "Современная, якобы, стандартизация видится мне, как попытку создания некой СУБКУЛЬТУРЫ, во многом ограниченной!!! (или, если хотите, САМООГРАНИЧЕННОЙ) и, заключенной в оклад церковной иконы"

Re: Stm32 с чего начать изучение...

Пн фев 03, 2020 23:07:19

Постоянно работаю с таймерами на 103ем процессоре для управления 8кВт преобразователем. Что именно не понятно? Там конечно есть скользкие моменты, что бы первый раз запустить таймер на внешний пин, нужно пройти полосу препятствий.


Для начала непонятно вот что:

Как я понял, при досчитывании таймером до значения регистра 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?

Re: Stm32 с чего начать изучение...

Пн фев 03, 2020 23:23:04

Lum1noFor, буферизация ARR означает, что содержимое этого регистра изменится не сразу, а при следующем UEV. Это помогает избежать некоторых косяков (скажем, уменьшили значение ARR, когда текущее значение счетчика уже выше нового значения; и таймер будет досчитывать до переполнения).
Что такое auto-reload, preload?

ARR - auto reload register.
preload - загрузить новое значение с буферизацией.

Re: Stm32 с чего начать изучение...

Вт фев 04, 2020 00:06:36

Eddy_Em, Вам бы книжки писать - умеете объяснить для дебилов, спасибо!

Может, кому понадобится - простейшая инициализация 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.
}
Ответить