ART_ME

STM32 для чайника

1 882 сообщения в этой теме

Oxford    24

Да не только регистр, а вообще синтаксис языка проверяет да и вообще если что-то не обьявлено или не так написано подскажет. Сразу если что-то не так подчеркивает и можно посмотреть что ему не нравиться.

 

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

на сколько я помню эти две среды раньше точно не могли помогать дописывать #include, что очень напрягало запоминать названия и вбивать их руками. Да и нет перехода по Ctrl + ЛКМ, а есть ли хинт при наведении на что угодно и показывает где объявлено (а там и коммент к переменной можно написать).что очень удобно. Не пойму чем не устраивает Atollic на эклипсе просто шикарная среда разработки. Можно форматирование синтаксиса настроить под себя, прекрасный рефакторинг, в отладчике есть что душе угодно, справа в полосе прокрутке есть рисочки цветные по которым можно перемещаться на ошибку или предупреждение, да плюсов очень много без проблем например подхватывает в проект новые файлы их нужно просто скопировать в папку с проектом. Просто очень удобная среда, которая экономит время на написании кода.

Изменено пользователем MasterElectric

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 419

На сколько я помню, атоллик самая свежая среда из всех что есть (обновления не в счет). Поэтому видимо и допиленная хорошо. На счет компилятора только вопрос - там все тот же GCC?

Так то да, эклипс в плане дружественности интерфейса и гибкости редактора пожалуй заплюет всех и все. Основная проблема - тормоза вечные то там то сям, и компилятор

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пока на 407 камне поработал с спи на прерывании на прием, ЮАРТ на передачу, с портами ввода-вывода, и тактированием, все на регистрах прощупал, но тут стал вопрос, о токовой нагрузке 407 камня, цепляю светодиод с напряжением 1,96В, через резистор 100Ом, соответсвенно ток через светодиод должен быть 13,4мА, но светодиод ели светит, и напряжение на нем просаживается до 1,65В и ток 0,013мА., обычно же МК на пин до 20мА должен держать, на сколько помню, добавил резистор чтоы было 200Ом тоже самое, микроамперы, с другими светодиодами тоже самое, может это из за того что использую выхода на максимальную скорость, вычитал что 407 камень на корпус максимум 240мА, на каждый вывод до 25мА, почему тогда у меня не держит ток, может нужно программно отключать энергосбережение, или скорость пинов снизить со 100МГц, до 50МГц?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пин PD13, настраивал регистрами, и кубом только что попробовал одинаково, скорость тоже делал самую маленькую ничего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 419

куб, куб...

а начинаешь разбираться - дело было не в бобине в 99,9% случаев

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
OperAmp    0

Учусь программировать STM32L и сталкиваюсь постоянно со многими вопросами, на которые не могу найти ответы. Например, конфигурирую таймер TIM6, который является базовым, то есть самым простым.

Открываю CubeMX, включаю таймер, ставлю частоту тактирования 1 МГц, устанавливаю Prescaler 999 и Counter Period 499 (типа чтобы каждые 500 мс было переполнение), разрешаю прерывания. Генерирую код и вижу такую последовательность (упрощенно):

TIM_HandleTypeDef htim6; // какая-то структура, связанная с TIM6 ...

int main(void)
{
	MX_TIM6_Init(); // тут понятно что инициализируется таймер

	while (1){ }
}

// Далее сама функция инициализации TIM6
static void MX_TIM6_Init(void)
{
	TIM_MasterConfigTypeDef sMasterConfig;
	sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
	sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

	htim6.Instance = TIM6;
	htim6.Init.Prescaler = 999;
	htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
	htim6.Init.Period = 499;
}
}

// Ну и сам обработчик прерывания
void TIM6_IRQHandler(void)
{
	HAL_TIM_IRQHandler(&htim6);
}

Итак вот в чем вопрос. Вот, допустим, хочу понять как бы мне получить подобный код без использовать Cube.

Я открываю документацию HAL и иду во вкладку 43 - HAL TIM Generic Driver (499 страница).

Далее я вижу последовательно список различных структур и их полей:

TIM_Base_InitTypeDef // что-то мне подсказывает что это как раз на самый простой случай работы таймера и надо бы использовать эту структуру, но нет...
TIM_OC_InitTypeDef
TIM_OnePulse_InitTypeDef
…
TIM_SlaveConfigTypeDef
TIM_HandleTypeDef // это как раз та структура, которая в сгенерированном коде. Его поля выглядят так:
	TIM_TypeDef * Instance
	TIM_Base_InitTypeDef Init
	HAL_TIM_ActiveChannel Channel
	DMA_HandleTypeDef * hdma
	HAL_LockTypeDef Lock
	__IO HAL_TIM_StateTypeDef State

От сюда первый вопрос — почему именно эту структуру надо использовать (TIM_HandleTypeDef)? Если она такая важная, то почему находится в конце списка и почему нет толком никакого описания какая структура для каких целей ;)?Ладно, фиг с ним, идем дальше по документу, раздел 43.2 - TIM Firmware driver API description и подраздел 43.2.2 - How to use this driver. И там написано следующее:

1. Initialize the TIM low level resources by implementing the following functions

depending from feature used :

Time Base : HAL_TIM_Base_MspInit()

Input Capture : HAL_TIM_IC_MspInit()

Output Compare : HAL_TIM_OC_MspInit()

PWM generation : HAL_TIM_PWM_MspInit()

One-pulse mode output : HAL_TIM_OnePulse_MspInit()

Encoder mode output : HAL_TIM_Encoder_MspInit()

Вроде для моей простейшей задачи надо использовать базовую функцию HAL_TIM_Base_MspInit(), но ее нет в сгенерированном коде! Так же я не нашел и включение тактирования, как требует второй пункт:

2. Initialize the TIM low level resources :

a. Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); …

Короче вообще не понятно что происходит! А теперь снова смотрим на сгенерированный код и видим что в функции инициализации используется структура TIM_MasterConfigTypeDef (ска откуда она взялась???). Оказывается из документа через 40 страниц, пункт 44 - HAL TIM Extension Driver и сразу же описание этой структуры.

По какому принципы все это работает? Как новичку можно во всем этом разобраться если не понятна сама концепция использования библиотекой? Даже когда пытаешься решить задачу задом наперед (по сгенерированому коду понять как надо выбирать структуры и как пользоваться библиотекой), то все равно не получается. Просьба не проходите мимо, думаю что большинство людей сталкиваются с такими вопросами. Буду благодарен за любую помощь.

Изменено пользователем OperAmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 419

это сначала туговато. Потом недельки через две-три становится все ясно как день. Помочь тут сложно, практика нужна. Чем больше, тем лучше.

Если не охота вникать в хал (а многие думают что он говно, и не стесняются об этом говорить), то можно как все по старинке на регистрах это дело быстренько замутить. Да будет не очень читабельно, но работать будет. Я вот на хал все пишу и мне пофик. Поначалу было сложновато вникнуть, но потом прошло само собой и отвыкать уже не охота.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
OperAmp    0

Уважаемый mail_robot, именно Ваш пост надоумил меня перейти на HAL. 

И все же, хотелось бы получить немного ответов по моему вопросу. Вот представьте себе что перед Вами есть документация на HAL и вам надо настроить TIM6 чтобы переполнялся каждые 500 мс и вызывал прерывания.

Напишите логичный, вытекающий из документации, алгоритм действий, чтобы настроить таймер! Хочу понять логику вещей, так как то что генерит Cube и то что написано в доках не совсем для меня логично. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 419

@OperAmp

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

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Darth_Vader    64
11 час назад, OperAmp сказал:

Уважаемый mail_robot, именно Ваш пост надоумил меня перейти на HAL

Посмотрите https://www.youtube.com/playlist?list=PLJTlt64jBcCuRgAMGImQzxRlYdSKa5Ifk

Много вопросов отпадёт

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
OperAmp    0
12 часа назад, Darth_Vader сказал:

Посмотрите https://www.youtube.com/playlist?list=PLJTlt64jBcCuRgAMGImQzxRlYdSKa5Ifk

Много вопросов отпадёт

Данный курс, конечно, лучик света в тоннеле HAL, но там он ничего не объясняет. Видео "просто возьми эту функцию и скопируй себе в прогу".

12 часа назад, MasterElectric сказал:

@OperAmp перейти на HAL, это откуда?

Ну громко сказал - ПЕРЕШЕЛ ))). Начинал на SPL писать, потом узнал что он больше не поддерживается и взамен ему HAL выпустили, плюс очень удобный конфигуратор Cube.

16 часов назад, mail_robot сказал:

@OperAmp

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

Напишите, пжл, чем в документации отличаются описания перифирии в пунктах Generic и Extension? 

43 HAL TIM Generic Driver

44 HAL TIM Extension Driver

На каждую периферию есть эти Generic  и Extension...

(Нашел ответ в самом начале документации. Для особо талантливых написано ;)

The HAL driver APIs are split into two categories: generic APIs which provide common and generic functions for all the STM32 series and extension APIs which include specific and customized functions for a given line or part number.)

Изменено пользователем OperAmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Darth_Vader    64
18 минут назад, OperAmp сказал:

Данный курс, конечно, лучик света в тоннеле HAL, но там он ничего не объясняет. Видео "просто возьми эту функцию и скопируй себе в прогу".

Ну не знаю. По-моему, работа с таймерами в CubeMX и HAL прекрасно разжёвана (хоть и не без ошибок, о чём я автору в камментах указал)

Программирование МК STM32. УРОК 5. Библиотека HAL. STM32 CUBE MX. Таймеры

Что вам ещё нужно - не могу представить.

 

Вот ещё можно посмотреть - прям ваши хотелки про 500 мс

STM32Cube. Таймер и прерывания.

Изменено пользователем Darth_Vader

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
OperAmp    0
10 минут назад, Darth_Vader сказал:

Что вам ещё нужно - не могу представить.

Я хочу понять как люди пользуются документацией. Повторю вопрос, который задавал ранее:

Вот представьте себе что перед Вами есть документация на HAL и вам надо настроить TIM6 чтобы переполнялся каждые 500 мс и вызывал прерывания. Напишите логичный, вытекающий из документации, алгоритм действий, чтобы настроить таймер!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Darth_Vader    64
3 минуты назад, OperAmp сказал:

Вот представьте себе что перед Вами есть документация на HAL и вам надо настроить TIM6 чтобы переполнялся каждые 500 мс и вызывал прерывания. Напишите логичный, вытекающий из документации, алгоритм действий, чтобы настроить таймер!

Я так не делал, помочь не смогу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Darth_Vader    64

Читаю/смотрю/слушаю всю информацию, которую могу получить, а не только документацию.

Изменено пользователем Darth_Vader

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 419

ответ на вопрос - почему профессиональные программисты стремятся к более высоким уровням абстракции вопреки логике самоучки дерьмокодера

философия высокоуровневого языка:

    Красивое лучше, чем уродливое.
    Явное лучше, чем неявное.
    Простое лучше, чем сложное.
    Сложное лучше, чем запутанное.
    Плоское лучше, чем вложенное.
    Разреженное лучше, чем плотное.
    Читаемость имеет значение.
    Особые случаи не настолько особые, чтобы нарушать правила.
    При этом практичность важнее безупречности.
    Ошибки никогда не должны замалчиваться.
    Если не замалчиваются явно.
    Встретив двусмысленность, отбрось искушение угадать.
    Должен существовать один — и, желательно, только один — очевидный способ сделать это.
    Хотя он поначалу может быть и не очевиден
    Сейчас лучше, чем никогда.
    Хотя никогда зачастую лучше, чем прямо сейчас.
    Если реализацию сложно объяснить — идея плоха.
    Если реализацию легко объяснить — идея, возможно, хороша.
    Пространства имён — отличная вещь! Давайте будем делать их больше!

здесь ответы на все, что кажется странным или громоздким или неправильным в HAL. И именно поэтому он и появился. И если вы все еще пытаетесь поспорить с мировой практикой программирования, то вы просто еще недозревший фрукт

представленная в посте информация носит обезличенный справочно-информационных характер

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...