Дык просто все, иду в DS, читаю, нахожу нужный регистр и его значащие биты, нахожу в заголовочном файле stm32f4xx названия этих бит, ну а там все уже сразу видно куда их пихать.
Буквально на днях, т к 4хх серией не работал, пришлось напрячся, с 3хх и 1хх серией отличаются настройки DMA. И примеров с dma stream cmsis не нашёл, все по datasheet взлетело.
Я выделил то, что делаю я. На том, что не выделило - экономлю.
Поднимал DMA на STM32F407, исключительно по дэйташиту, никакими cmsis не пользуюсь. И, кстати, взлетает практически всегда. Один раз, когда не взлетело, обнаружил причину в errata.
Но вариант второго источника информации для поиска имен, да еще если там надо тупо искать глазками, меня как-то не очень вдохновляет.
То есть - да, способ существует, но уж очень обременительный. И не факт, что универсальный.
Вы в #define BIT_MASK (1<<12) описываете маски. Это не сдвиги - это маска на 12-й разряд! И это нагляднее чем 0x1000 или 0b0001000000000000.
Как раз длинные наименования тяжело читаются. Всё должно быть в меру. TOIE1 - легко запоминающееся сокращение. Оно не от балды придумано в ДШ. И так всё остальное.
Но маска задается через сдвиг?
Посмотрите сами, что легче читается:
DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
или
(1 << DS_SETFONT) | (1 << DS_MODALFRAME) | (1 << DS_FIXEDSYS) | (1 << WS_POPUP) | (1 << WS_CAPTION) | (1 << WS_SYSMENU)
Да, но они хотя бы читаются. А аббревиатуры типа TOIE1 не читаются совсем!
Если оно одно - возможно. А если таких несколько сотен - то нет, нет и нет! Все не запомнишь.
Конечно, не от балды. Оно нужно, чтобы ссылаться на него в пределах одной главы дэйташита, посвященной конкретному устройству. Вот есть, например в дэйташите глава, которая называется “Таймеры”, как-то нужно в пределах этой главы для описания работы с таймерами ссылаться на их регистры и отдельные поля этих регистров. Вот для этого эти аббревиатуры и нужны. Кстати, даже аббревиатуры верхнего уровня вызывают вопросы. Например, TIMSK0 - это что за слово такое? Что оно обозначает?
Если бы предполагалось использование этих аббревиатур в коде, был бы придуман единый алгоритм записи имен специально для программирования. Или, как в Windows - пусть длинные, но осмысленные названия. Но этого нет, значит, предположение о том, что они должны быть использованы в коде, не соответствует действительности.
Вот вы все говорите “нужно использовать”, а как это технически реализовать, никто не говорит. Либо “запоминайте” несколько сот бессмысленных буквосочетаний, либо ищите в 500 к неструктурированного текста (притом, непонятно, что именно искать).
upd. Исправлена синтаксическая ошибка (вероятно, не последняя)
Если вам трудно - можете не использовать. В конце концов, клиент всегда прав.
в словосочетании
“вы” пишется с маленькой
Я и без даташита тебе скажу, что TIMSK- Timer Interrupt MaSK
И в эту “маску” надо пихать биты включающие те или иные прерывания.
Тут все дело в том, насколько часто ты с этим работаешь.
Если несколько раз самостоятельно по даташиту пинать регистры, то запоминается всё вполне быстро.
Не тот случай. Холивар о другом.
“Есть два мнения. Мое и ошибочное.”
Придумывайте. Каждый придумывает по своему. У нас есть те аббревиатуры, которые в ДШ, они же и хедере на чип. Никто их, при здравом уме, переписывать не будет. Но никто не мешает подняться чуть выше и завести свои - хоть макро, хоть инлайн функции, уже говорил. Типа:
#define rtc_init() (TCCR1B = 1<<WGM12 | 1<<CS11 | 1<<CS10, OCR1A = F_CPU / DIV1)
#define get_rtc_tick() (TIFR & 1<<OCF1A)
Это размещается в хедере, а после этого я в программе в упор не вижу все эти маски, биты, регистры… Используешь ПИК, меняешь только эти дефайны - саму программу не трогаешь. Хочешь сразу и то и это, пишешь для обоих и ставишь условия для препроцессора. Сама программа от этого не меняется.
Мне вот, например, очень не нравятся длинные записи типа
(1 << DS_SETFONT) | (1 << DS_MODALFRAME) | (1 << DS_FIXEDSYS) | (1 << WS_POPUP) | (1 << WS_CAPTION) | (1 << WS_SYSMENU)
я в них теряюсь.
Завёл себе “библиотеку”
и с тех пор всегда и везде пишу короче, типа вот так:
bitMask(DS_SETFONT, DS_MODALFRAME, DS_FIXEDSYS, WS_POPUP, WS_CAPTION, WS_SYSMENU)
Но никому этого не навязываю. Каждый по своему с ума сходит.
C ума сходить нужно правильно, по уставу ![]()
Но даже так всяко лучше, чем пальцем следить в какой разряд единицу поставить, а в какой ноль.
Исправил.
А CMS, OPM, AWD и DIR?
Естественно.
Исходить, как мне кажется, нужно из следующих условий:
- Это хобби.
- Это ни разу не вторая_работа/приработок.
- Приходится иметь дело с существенно различающимися архитектурами, имеющими различный набор периферии, причем, даже функционально близкие устройства управляются существенно по-разному.
И так же быстро забывается, стоит переключиться на другую архитектуру.
Притом, спорщики, признавая этот тезис по существу, расходятся в некоторых малозначительных деталях.
Это называется отсутствием стандарта. Имеет вполне очевидные последствие: читатели не понимают, что пишет писатель.
Ну сколько можно повторяться: этот тезис опровергнут еще в сообщении №52.
Мне они не нравятся еще больше. Первая причина - это неправильно. Ну а вторая - да, из-за сдвигов, которые загромождают код.
И еще: вместо такой конструкции:
bitMask(DS_SETFONT, DS_MODALFRAME, DS_FIXEDSYS, WS_POPUP, WS_CAPTION, WS_SYSMENU)
прекрасно работает:
DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
Разговор о сдвигах шёл в контексте того, что DS_SETFONT, DS_MODALFRAME и т.д. – номера битов, а не готовые маски (что мы и имеем в подавляющем большинстве случаев на практике) и в этом случае, предлагаемый Вами код не работает ни прекрасно, ни даже удовлетворительно.
Я не верю в то, что Вы не понимали контекста, а, значит, Вы просто на ходу передёрнули предмет обсуждения, чтобы продолжить бессмысленный срач. Не ожидал от Вас.
И, да, кстати, в том посте, что Вы цитируете, я прямо написал:
Зачем Вы мне решили что-то навязать?
В общем, давайте прекращать, Вы меня сильно разочаровали.
Просто толчём воду в ступе. Надоело.
да ну))
вы же подискутировать хотели, еще вчера ![]()
А где (и кем) определили вот эти ваши все
ODR, BSSR и так далее?
это другое, тут сдвигать ниче не надо.
я в #39 еще написал.
Оккам (с его знаменитой бритвой) говорил: не умножайте сущности без нужды. Поэтому удобнее юзать те обозначения, что обозначены в даташыте, не переименовывая их без нужды. Обычно они достаточно разумно сделаны, о чем тут уже говорили.
Повторюсь: весь этот побитных гемор как ни маскируй типа-умными дефайнами и тп он так и останется и побитным и гемором. Если заглючило - лезь в даташыт. Если другой проц - тем и более в разы больше.
Пока работает - все эти именования красивы; как заглючило - только мешают ахаха.