здрасьте здрасьте люди добрые. скажите пожалуйста как правильно включить тактирование? МК stm32f103c8. нарыл что порты ввода|вывода расположены на шине APB2. причем все порты. нельзя включить отдельно порт допустим
GPIO A
GPIO B
можно только подать тактирование на шину
APB2
нахожу
RCC_APB2ENR
в этом регистре нахожу бит
IOPC// так как светодиод висит у меня на PC13
и теперь видимо мне нужно его выставить в едниницу.
нахожу в memory map вижу адрес не APB2 а RCC
RCC 0x40021000
и правильно ли я понимаю что теперь чтобы мне включить бит нужно вычислить адрес по формуле
40021000-40000000=offset
(offset*32)+(4*4)
потому что (4*4) IOPC=4 битом
поправте пожалуйста уважаемые форумчане меня. я не совесем понимаю как правильно считать
Про структуры согласен, это действительно излишне жрет память и не всегда удобно, особенно на мелких контроллерах, но с другой стороны все равно а) нужно передать вниз все эти же параметры, б) для некоторой периферии неплохо бы хранить пресеты заранее, до отправки на исполнение, а описатели а-ля HAL примерно эту функцию и выполняют.
В регистры писать может быть проще только если вы наизусть все их знаете со всем битами, как МК дальше с ними работает и. т.п., в противном случае это не так. Типичный код на регистрах это мешанина из ни о чем не говорящих аббревиатур, магических чисел и битовых операций из которой совершенно непонятно, что она вообще должна делать.
Я не осуждаю ваше нежелание разбираться во внутреннем устройстве. Я лишь говорю, что ваши «советы» не несут пользы.
А на счет «ломать» так ссылку я кидал. Код на HAL своих задач не выполняет.
Типичный код на регистрах это мешанина из ни о чем не говорящих аббревиатур, магических чисел и битовых операций из которой совершенно непонятно, что она вообще должна делать.
Верно. Поэтому в случае если невозможно сделать абстракцию общей, ее надо делать на уровне приложения. Для того же SPI сделать универсальную реализацию с DMA вряд ли возможно. Но можно сделать локальную абстракцию, в которой прокомментировать важные функции
Я и сейчас не считаю, что регистры это страшно, но без веских причин это потеря времени и источник трудночитаемого кода.
Например, в STM32 есть встроенный датчик температуры, но из HAL доступа к нему нет, есть ли что-то про него в CMSIS/SPL/LL не в курсе. Для одного процессора - да, я написал коротенькую вставку. Но если нужно будет сделать хотя бы для двух разных - уберу все эти потроха нафиг в функцию. Будет bool hasTemperatureSensor() и [float|int] getTemperature() и все, дальше с новыми МК будут только добавляться внутренности, код снаружи и знать не будет как там что делается.
Разбираться нужно когда на то есть основания, когда по другому никак. Если HAL или еще что-то там не работает - тогда да, есть повод его заменить его или поправить, но так или иначе да, разбираться с уровнем ниже, но если работает - нужно использовать. Слишком много сложных вещей вокруг, во все подряд углубляться жизни не хватит.
int32_t getMCUtemp(){
int32_t ADval = getADCval(4);
int32_t temperature = (int32_t) *TEMP30_CAL_ADDR - ADval;
temperature *= (int32_t)(1100 - 300);
temperature /= (int32_t)(*TEMP30_CAL_ADDR - *TEMP110_CAL_ADDR);
temperature += 300;
return(temperature);
}
Накалякал эту функцию исключительно по данным из даташита. А функция getADCval выполняет медианное усреднение по девяти последним измерениям для уменьшения шумов (АЦП молотит через ПДП непрерывно).
Флоаты в МК без их поддержки стараюсь использовать только в крайних случаях. Обхожусь числами с фиксированной запятой.
Да я тоже упростил пример, чтение ADC реально не так делается, там DMA на несколько каналов на таймере висит и постоянно все сканирует, и потом вычитка и фильтрация по событию, но это для примера несущественно, поэтому вырезал. Усреднение по степеням 2, чтобы без деления, но не медианное, что есть минус.
float - да, обычно зло, но проц специально с FPU и там этих вычислений в прошивке херова гора, температура это так, бонус, состояние мониторить.
Мне на мыло уведомления приходят, а он меня процитировал. Иначе я бы это и не увидел, возможно.
бесплатный пиар
Разве что ☺
P.S. Что-то у него там до сих пор всего лишь 9 плюсиков, 0 минусов и 0 комментариев. Похоже, тема вообще никому не интересна, либо заголовок народу не нравится. И школоботы почему-то не минусуют, как обычно в таких случаях… Неужто все гуляют до сих пор?