Перейти к содержанию

STM32 для чайника


ART_ME

Рекомендуемые сообщения

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

код реализации в библиотеке

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
  }
  else
  {
    GPIOx->BRR = (uint32_t)GPIO_Pin;
  }
}

по моему все очевидно - вместо аргументя PIN передайте маску. В соответствии с аргументом PinState будет изменен статус этих битов.

Можно еще проще сделать, чтобы не насиловать HAL несвойственным функционалом. Написать

GPIOx->BSRR(или BRR) = (uint32_t)(маска) прямо в коде, если уж так сильно приперло пеменять значения всего порта разом

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

тоже годно

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

3 часа назад, mail_robot сказал:

вместо аргументя PIN передайте маску.

С помощью GPIOx->BSRR можно только установить биты или сбросить одновременно.

А чтобы записать значение в порт надо пользовать GPIOx->ODR.

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

спасибо кэп, мы в курсе. Однако BSRR/BRR может устанавливать биты не трогая состояние не нужных, а ODR меняет все к чертям. Считается что через BSRR/BRR работать условно безопаснее и быстрее, за счет исключения операции чтения. Но вообще смотря какая задача

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Почему же, через ODR так же можно менять строго определённые биты. Но работать с ним удобно лишь при записи целого числа в порт. В остальных случаях удобнее и нагляднее BSRR)

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

Спасибо всем за помощь с ODR, запустил дисплей с 16 битной шиной (ILI9325), но это конечно очень расточительно, сейчас буду пытаться переписать инициализацию для работы с 8 битной шиной, попробую разобраться с BSRR/BRR, и присваивать значение только половине порта.

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

5 минут назад, andryxa сказал:

присваивать значение только половине порта

Так все легко, обычные побитовые операции. Регистр 16 бит, просто пиши в нужный кусок, используя маску, и все. Только не забывай сбрасывать значения перед каждой записью. 

Запись: GPIOХ->ODR |= "данные+маска"
Обнуление: GPIOХ->ODR &= ~"маска"

 

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

Получается, если мне нужно записать в старший байт порта В, цифру 3, должно получится как-то так:

GPIOB->ODR &= ~ 0xFF; // обнуление

GPIOB->ODR |= 0x03FF; // запись

 

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

#define MASK 0xFF00 //допустим, работать надо только с битами 9-15, не меняя остальные
uint16_t data = 0x5A00; //какое-то значение, которое хотим записать
...
GPIOx->ODR = (GPIOx->ODR &~ MASK) | data;

//можно и так, это чуть проще в программировании, но сложнее для контроллера
#define DATA_POS 8
uint16_t data2 = 0x00A5; //теперь значащие биты идут с нулевого бита переменной
GPIOx->ODR = (GPIOx->ODR &~ MASK) | (data2<<DATA_POS);

Но надо помнить что это неатомарно. Если какое-то прерывание влезет в середину изменения порта и само будет его менять (в том числе через BRR / BSRR), будет нехорошо.

GPIOx->BRR = MASK;
GPIOx->BSRR = data;

Если проскакивание на пару тактов нулевого значения по всем используемым выводам не критично, можно сделать и так. Каждая из операций атомарна.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

1 час назад, COKPOWEHEU сказал:

Если какое-то прерывание влезет в середину изменения порта

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

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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

  • 1 месяц спустя...

Подскажите еще по HAL. Функция

HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);

не хочет работать в созданном мной файле .c (пишу свою библиотеку для работы с spi flash). При компиляции выдает ошибку "error: 'hspi' undeclared (first use in this function)". Понимаю что не обьявлена hspi, а как исправить не пойму.

Ага, похоже забыл добавить номер спи, должно быть &hspi1, но ошибка все равно не ушла.

Изменено пользователем andryxa
Ссылка на комментарий
Поделиться на другие сайты

ага, а то она обьявлена как extern в библиотеке. Надо в области видимости переобьявлять для компилятора

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

  • 1 месяц спустя...

Добрый день.
Подскажите пожалуйста по такому вопросу.
В статье по повышению надежности работы РЭА говорится, о правильном подключении кварцевого резонатора к МК. Пример 1 http://caxapa.ru/lib/emc_immunity.html

Касательно STM32F407 кварц и 2 конденсатора обвязки должны подключаться к аналоговой земле VSSA или к цифровой VSSD, если есть их разделение? Хотел  бы сделать "правильную" разводку этой цепи на ПП
Нигде не нашел информации  об этом, теоретически этот генератор питается от VDDA соответственно кварц должен подключаться к  VSSA
Спасибо!

STM.jpg

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

  • 3 недели спустя...

Чайниковский вопрос: как запустить счёт таймера одиночным импульсом на входе? Cube, HAL и STM32F103C8T6 в наличии

Изменено пользователем Darth_Vader
Ссылка на комментарий
Поделиться на другие сайты

И где же крутая помощь нахваленного куба новичкам ?
Он же всё может, и даже самый глупый новичок станет в миг крутым программером. Установил и в пару кликов сделал всё, что нужно :)

 

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

Darth_Vader, а что мы огорчаемся, минусы ставим ? :)
Вы же сами, во всё горло, поддерживали маил-робота, который так усердно пиарит калокуб, что он для новичка - самое то в помощи. Типа сам всё делает за программиста и т.д. и т.п. ... :)

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

@Aleх это моё право вам минусы ставить. Разводить пустой срач с модератором мне никакого интереса нет. Собственно этот вопрос и был расчитан на ответ @mail_robot, а не на ваши бессодержательные подколки.

"В таком вот аксепте" :D

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

10 минут назад, Darth_Vader сказал:

это моё право вам минусы ставить

Да без проблем, никто Вам это право не отменял. Ставьте на здоровье, никто не запрещает :)

10 минут назад, Darth_Vader сказал:

Собственно этот вопрос и был расчитан на ответ @mail_robot

Не вижу, чтобы Вы его упомянули в своём посте. На всякий случай напомню (вдруг Вы не в курсе), у нас на форуме есть ЛС. Если хотите конкретно к кому-нибудь обратиться, можно ему туда написать.

Что касается вопроса. Конкретизируйте. Что за таймер, что означает "запустить счёт" ? Каков характер анализируемого импульса ? Что нужно в нём ловить, фронт, длину, ... ? Учитывать ли дребезг (вдруг Вы от кнопки хотите что-то делать) ? И т.д...
Поразвёрнутее нужно вопросы задавать, а не просто "Хочу вот такое. Как мне это сделать ?".

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

2 минуты назад, Aleх сказал:

Что за таймер

Таймер: TIM2-TIM4

5 минут назад, Aleх сказал:

что означает "запустить счёт" ?

Видимо я совсем "чайник" - имеется ввиду, что бы счётчик таймера начал изменять значение согласно своим настройкам.

7 минут назад, Aleх сказал:

Каков характер анализируемого импульса ? Что нужно в нём ловить, фронт, длину, ... ?

Однократный падающий фронт

7 минут назад, Aleх сказал:

Учитывать ли дребезг (вдруг Вы от кнопки хотите что-то делать) ?

Не надо больше ничего учитывать

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

  Разрешено использовать не более 75 эмодзи.

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
    • поняли неправильно. У ТЛ494 никакой защиты нет, усилители ошибки не защита, они не должны приводить к ложным импульсам. Причем тут "микруха" ?  надо нагружать ВСЁ. До сих пор вообще непонятно о каком ИИП идет речь и сколько у него каналов. Бесполезно схему рисовать? - Помогать так бесполезно. Картина кривая по самое "немогу" продолжаются картинки, снятые через ногу и без цены деления.
×
×
  • Создать...