-Og -- это все равно оптимизация и в таких ситуациях лучше запретить вовсе. Следующий шаг -- максимальные варнинги. Я любопытства ради загнал в кейл и там полезли разные вырвиглазные, по мнению компиля, шедевры, типа такого:
Где вы такой индусокод находите?
Зачем вообще, будучи в трезвом уме, пользоваться калом?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Здесь создается указатель RTC_BASE типа структуры RTC_TypeDef и сразу же объявляется для него новое имя попроще RTC?
А здесь:
#define RTC_BASE (APB1PERIPH_BASE + 0x2800)
Указывается, что есть некоторый адрес, который принадлежит шине АРВ1 плюс смещение к нему, получается адрес начала регистров RTC в памяти. И объявляется это все для простоты под одним именем RTC_BASE?
После все этого, т.к. структура была объявлена через ТейпДеф, я могу использовать оператор (->), так и оператор (.)?
Точно! Это же директивы препроцессора... А не объявления переменных
Добавлено after 7 minutes 10 seconds:
Мне потихоньку начинает казаться, что я уже на грани просветления фундамента по работе с этими микроконтроллерами... Все мои проблемы только с языком Си.
Добавлено after 1 minute 56 seconds:
По сути, если разобраться с тем, что написано в этом заголовочном файле и как это работает, больше вопросов и не останется, кроме некоторых нюансов в Рефренс Мануале.
Понимаю, что можно все и проверить в железе... Но спросить все равно гложит...
Правильно ли я настроил тактирование от внешнего кварца 8 МГц, чтобы с ФАПЧ получилось 72 МГц? Или я где-то чего-то не учел и накосячил?
FLASH->ACR |= (FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1); // Сразу включаем задержку для Флеша, т.к. на больших частотах ему плохо работать
RCC->CR |= RCC_CR_HSEON; // Включаем внешний резонатор 8 МГц
while ((RCC->CR & RCC_CR_HSERDY ) != RCC_CR_HSERDY) // Ждем запуска резонатора
{
}
RCC->CFGR |= (RCC_CFGR_PLLMULL_2 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLSRC); // Настраиваем PLL (умножить на 9) и включаем тактирование PLL от HSE
RCC->CR |= RCC_CR_PLLON; // Включаем сам PLL
while ((RCC->CR & RCC_CR_PLLRDY) != RCC_CR_PLLRDY) // Ждем готовности PLL
{
}
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // Включаем делитель PLL на 2 для шины АВР1, т.к. она не более 32 МГц
RCC->CFGR |= RCC_CFGR_SW_PLL; // Включаем тактирование всего в системе!
З.Ы. Есть небольшие непонятки с флешем. А также с последними двумя строками, можно ли их в одну записать?
Понял. Лучше отключить.
А верхние конструкции? и почему у меня работает также запущенный RTC, где я тоже писал |=, а не просто =?
Добавлено after 14 minutes 52 seconds:
Кстати, я не включил CSS... Тоже надо доделать.
А если я выключу HSI и в случае сбоя HSE сам CSS включит его или нет?
Это если нужно обнулить биты масок 1 и 2, а биты масок 3 и 4 выставить.
Добавлено after 9 minutes 35 seconds:
Кстати, хорошо бы "ожидание запуска резонатора" снабдить тайм-аут таймером, чтобы программа не зависла на while в случае проблем с кварцем.
Так биты, которые обозначены в хидере, они уже сами нужные единички? Их можно просто присваивать? Или все же лучше как маску накладывать? Просто везде вроде их через |= используют...
И по поводу АЦП и ЮСБ, тоже надо сразу частоты на них выставлять?
Нет никакого лучше/хуже. Есть как правильно в каждом конкретном случае.
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3898534#p3898534"]И по поводу АЦП и ЮСБ, тоже надо сразу частоты на них выставлять?[/uquote]Можно по сто раз дрюкать идин и тот же регистр, а можно сразу записать правильные параметры.
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3898558#p3898558"]_VAL2FLD(RCC_CR_HSITRIM, 16), что они обозначают,[/uquote]Это макрос из CMSIS. Не знаю ни одной IDE, где по ПКМ не было бы "показать/перейти к определению".