LINUX.ORG.RU

включить тактирование

 


0

1

здрасьте здрасьте люди добрые. скажите пожалуйста как правильно включить тактирование? МК 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 битом
поправте пожалуйста уважаемые форумчане меня. я не совесем понимаю как правильно считать



Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

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

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

EtherealPhantom
()
Ответ на: комментарий от EtherealPhantom

Зачем ломать то, что и так работает?

Я не осуждаю ваше нежелание разбираться во внутреннем устройстве. Я лишь говорю, что ваши «советы» не несут пользы.

А на счет «ломать» так ссылку я кидал. Код на HAL своих задач не выполняет.

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

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

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Для того же SPI сделать универсальную реализацию с DMA вряд ли возможно

чего только не услышишь тут, ОС без драйверов с DMA - деньги на ветер

anonymous
()
Ответ на: комментарий от Eddy_Em

Я и сейчас не считаю, что регистры это страшно, но без веских причин это потеря времени и источник трудночитаемого кода.

Например, в STM32 есть встроенный датчик температуры, но из HAL доступа к нему нет, есть ли что-то про него в CMSIS/SPL/LL не в курсе. Для одного процессора - да, я написал коротенькую вставку. Но если нужно будет сделать хотя бы для двух разных - уберу все эти потроха нафиг в функцию. Будет bool hasTemperatureSensor() и [float|int] getTemperature() и все, дальше с новыми МК будут только добавляться внутренности, код снаружи и знать не будет как там что делается.

#ifdef STM32F303xC
#define VREFINT_CAL  (*(uint16_t*)((uint32_t)0x1FFFF7BA))
#define TS_CAL1_30C  (*(uint16_t*)((uint32_t)0x1FFFF7B8))
#define TS_CAL2_110C (*(uint16_t*)((uint32_t)0x1FFFF7C2))
#endif // STM32F303xC

hadc1.Instance->CR |= ADC12_CCR_TSEN;

uint32_t data = HAL_ADC_GetValue(&hadc1);
float temp_c = (80.0/(float)(TS_CAL2_110C-TS_CAL1_30C))*(data-(int32_t)TS_CAL1_30C)+30.0;
EtherealPhantom
()
Последнее исправление: EtherealPhantom (всего исправлений: 1)
Ответ на: комментарий от COKPOWEHEU

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

EtherealPhantom
()
Ответ на: комментарий от EtherealPhantom

Разбираться нужно когда на то есть основания, когда по другому никак.

Ну вот я пытался разобраться с HAL и не преуспел. Регистры проще.

COKPOWEHEU
()
Ответ на: комментарий от EtherealPhantom

Все легко и просто:

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 выполняет медианное усреднение по девяти последним измерениям для уменьшения шумов (АЦП молотит через ПДП непрерывно).

Флоаты в МК без их поддержки стараюсь использовать только в крайних случаях. Обхожусь числами с фиксированной запятой.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

Флоаты в МК без их поддержки стараюсь использовать только в крайних случаях

а деление используешь - неполноценный у тебя секс

anonymous
()
Ответ на: комментарий от anonymous

Согласен, в F0 деление — жирная софтовая операция, но флоаты там еще хуже...

А вот в F1 деление нативно, а флоаты — нет.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Да я тоже упростил пример, чтение ADC реально не так делается, там DMA на несколько каналов на таймере висит и постоянно все сканирует, и потом вычитка и фильтрация по событию, но это для примера несущественно, поэтому вырезал. Усреднение по степеням 2, чтобы без деления, но не медианное, что есть минус.

float - да, обычно зло, но проц специально с FPU и там этих вычислений в прошивке херова гора, температура это так, бонус, состояние мониторить.

EtherealPhantom
()
Ответ на: комментарий от Eddy_Em

А вот в F1 деление нативно

а остаток от деления?

anonymous
()
Ответ на: комментарий от Eddy_Em

О, тот вендузятник на БХ наши с тобой USB-CDC тестировать взялся ☺

Быдохабр быдлохабром, а мониторить не забываете. Меня восхищает ваша оперативность.

Бесит просто!

Хм, а я наоборот предлагал ему это сделать. Мне тестировать лень, а так получим относительно объективное сравнение плюс бесплатный пиар.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

мониторить не забываете

Мне на мыло уведомления приходят, а он меня процитировал. Иначе я бы это и не увидел, возможно.

бесплатный пиар

Разве что ☺

P.S. Что-то у него там до сих пор всего лишь 9 плюсиков, 0 минусов и 0 комментариев. Похоже, тема вообще никому не интересна, либо заголовок народу не нравится. И школоботы почему-то не минусуют, как обычно в таких случаях… Неужто все гуляют до сих пор?

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Мне на мыло уведомления приходят, а он меня процитировал. Иначе я бы это и не увидел, возможно.

А я подобное отключил. Еще не хватало спам с подобных форумов получать. Захочу - прочитаю.

P.S. Что-то у него там до сих пор всего лишь 9 плюсиков, 0 минусов и 0 комментариев.

Ну, я проплюсую, наверное. Какая-никакая, а техническая статья - лучше, чем очередное нытье собеседующихся.

COKPOWEHEU
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.