axillent писал(а):что вышло в итоге
Прекрасно и светит хорошо, поздравляю.
a5021 писал(а):Если вам такие "прекрасные" комментарии заменяют даташит, а это ракообразие и вправду кажется удобством, то нет никакого смысла продолжать данный разговор
разве я написал что заменяют? Что-то вы все время врете. На картинке комментарии почему то не видим. Очки какие то разборчивые.
Дальше битовые поля EXTSEL тоже не видят очки - а ведь можно с легкостью установить любой бит, а не писать магическое число 2.
Код: Выделить всё
#define ADC_CFGR1_EXTSEL ((uint32_t)0x000001C0) /*!< EXTSEL[2:0] bits (External Event Select for regular group) */
#define ADC_CFGR1_EXTSEL_0 ((uint32_t)0x00000040) /*!< Bit 0 */
#define ADC_CFGR1_EXTSEL_1 ((uint32_t)0x00000080) /*!< Bit 1 */
#define ADC_CFGR1_EXTSEL_2 ((uint32_t)0x00000100) /*!< Bit 2 */
Комментарии очень помогают разбираться в коде - разве их уже отменили? Разговор можете не продолжать, а я продолжу...
И так продолжим рассмотрение примера по ссылке a5021:
видим такую строку:
PD_ODR_ODR3 = !PD_ODR_ODR3; // Toggle Port D, pin 3.
начинаем разбираться что бы это значило
Ликбез:
Для языка Си определены битовые операции:
& битовое И (AND)
| битовое ИЛИ (OR)
^ битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)
~ битовое ОТРИЦАНИЕ (NOT) — унарная операция.
В Си существует три логические операции:
Код: Выделить всё
Логическая операция И &&;
Логическая операция ИЛИ ||;
Логическая операция НЕ ! или логическое отрицания
Пример для применения операции "!":
!( a == 3) Условие истинно, если a не равно 3.
есть рекомендации по стилю написания программ на Си:
Именованные константы (включая значения перечислений) должны быть записаны в верхнем регистре с нижним подчеркиванием в качестве разделителя.
Примеры: MAX_ITERATIONS, COLOR_RED, PI
скоро тут будет весь учебник по Си для первого класса
а теперь расшифровываем "PD_ODR_ODR3 = !PD_ODR_ODR3;": бит ODR3 равен НЕ биту ODR3 - вынос мозга, но можно и привыкнуть и стать инвалидом умственного труда. А зачем все это, если можно просто сделать - "^" "битовое ИСКЛЮЧАЮЩЕЕ ИЛИ" значения порта с константой, уже любезно прописанной в дефайне: "GPIOD->ODR ^= GPIO_PIN_3;". Запись "PD_ODR_ODR3" в первом варианте вообще говорит о том, что это константа по рекомендациям, но это бит - полный бред. Заметим второй способ соответствует всем правилам и канонам языка Си. Шаг и мат.
Домашнее задание

:
Условие:
Есть переменная для флагов, обозначенная так:
uint8_t flags;
Есть однобитный флаг, обозначенный так:
#define POWER_ON (uint8_t)(1<<0);
Вопрос:
Как с точки зрения приверженца иаровского хидера установить, сбросить и инвертировать флаг "POWER_ON" в переменной "flags"?
Подсказка:
Типа "POWER_ON = 1;" не прокатит.
Еще подсказка:
Для приверженцев нормальных решений, которые знают битовые операции как отче наш, очевидно будет так:
flags |= POWER_ON; // установить бит
flags &= ~POWER_ON; // сбросить бит
flags ^= POWER_ON; // инвертировать бит
Как быть хидероиаровцам?
Ответ:
?
p.s. для STM32 тоже все хорошо и тоже иногда в даташит можно не заглядывать:
