Почему программирование

Регистры CR и CFGR

Открываем Reference manual на микроконтроллер STM32F103x8 и переходим к разделу 7: Low-, medium-, high- and XL-density reset and clock control (RCC). RCC имеет довольно много регистров, целых 10 штук. Однако, для настройки источника тактирования и делителей шин нам понадобится только 2 из них.

Clock control register (RCC_CR)

Рис. 1. Биты регистра CR

Описание основных битов регистра:

PLLRDY — флаг готовности PLL. Устанавливается аппаратно и сигнализирует о том, что PLL заблокирован.

PLLON — Включить PLL. Устанавливается и сбрасывается программно. При переходе в режим Stop или Standby сбрасывается аппаратно. Этот бит не может быть сброшен, если PLL используется как источник системного тактирования.

CSSON — включить систему CSS

HSEBYP — Если вместо кварцевого резонатора HSE мы хотим использовать внешний прямоугольный тактовый сигнал, то этот бит нужно установить в 1

HSERDY — Флаг готовности генератора HSE. Аппаратно устанавливается в 1 после успешного запуска и стабилизации частоты HSE-генератора

HSEON — Запустить HSE генератор. Устанавливается и сбрасывается программно. При переходе в режим Stop или Standby сбрасывается аппаратно и HSE генератор останавливается.  Этот бит не может быть сброшен, если HSE используется как источник системного тактирования.

HSIRDY — то же самое, что и HSERDY, только для встроенного RC-генератора HSI

HSION — то же самое, что и HSEON, только для встроенного RC-генератора HSI

Clock configuration register (RCC_CFGR)

Рис. 2. Биты регистра CFGR

Описание основных битов регистра:

MCO — подача тактового сигнала на MCO-пин микроконтроллера.

  • 0xx: Функция отключена
  • 100: Выбран System clock (SYSCLK)
  • 101: Выбран сигнал с HSI
  • 110: Выбран сигнал с HSE
  • 111: Выбран сигнал с PLL, который поделен на 2

PLLMUL — коэффициент умножения PLL. Эти биты могут быть записаны программно только при отключенном PLL

  • 0000: Входную частота PLL умножить на 2
  • 0001: —//— на 3
  • 0010: —//— на 4
  • 0011: —//— на 5
  • 0100: —//— на 6
  • 0101: —//— на 7
  • 0110: —//— на 8
  • 0111: —//— на 9
  • 1000: —//— на 10
  • 1001: —//— на 11
  • 1010: —//— на 12
  • 1011: —//— на 13
  • 1100: —//— на 14
  • 1101: —//— на 15
  • 1110: —//— на 16
  • 1111: —//— на 16

Два последних значения соответствуют одинаковому коэффициенту умножения.

PLLXTPRE — Делитель частоты с HSE генератора перед подачей на PLL. Этот бит не может быть изменен, если PLL запущен. При установке в 1 частота HSE будет поделена на 2, если 0, то делитель отключен.

PLLSRC — Источник входной частоты PLL. Не может быть изменен, если PLL запущен.

  • 0: частота HSI генератора поделенная на 2
  • 1: частота HSE генератора. Делитель может быть выбран PLLXTPRE битом.

PPRE2 — Делитель шины APB2 prescaler

  • 0xx: HCLK без деления
  • 100: HCLK / 2
  • 101: HCLK / 4
  • 110: HCLK / 8
  • 111: HCLK / 16

PPRE1 — Делитель шины APB1 prescaler. Частота шины APB1 не должна превышать 36 МГц.

  • 0xx: HCLK без деления
  • 100: HCLK / 2
  • 101: HCLK / 4
  • 110: HCLK / 8
  • 111: HCLK / 16

HPRE — AHB prescaler

  • 0xxx: SYSCLK без деления
  • 1000: SYSCLK / 2
  • 1001: SYSCLK / 4
  • 1010: SYSCLK / 8
  • 1011: SYSCLK / 16
  • 1100: SYSCLK / 64
  • 1101: SYSCLK / 128
  • 1110: SYSCLK / 256
  • 1111: SYSCLK / 512

SWS — Состояние переключателя тактирования системы. Устанавливается аппаратно и указывает на текущий источник тактирования.

  • 00: HSI генератор используется как источник тактирования системы
  • 01: HSE генератор используется как источник тактирования системы
  • 10: PLL используется как источник тактирования системы

SW — Переключатель источника тактирования системы. Изменяется программно для выбора источника SYSCLK. Устанавливается аппаратно для принудительного переключения на HSI генератор переходе в режим Stop или Standby или в случае срыва генерации HSE, который используется в качестве источника SYSCLK (только если активна система CSS)

  • 00: HSI выбран в качестве источника системного тактирования
  • 01: HSE выбран в качестве источника системного тактирования
  • 10: PLL выбран в качестве источника системного тактирования

Регистры в CMSIS

Во второй части мы учились подключать библиотеку CMSIS к IAR-у, сейчас нам понадобится этот проект, так как мы переходим к практике. Но перед этим немного поговорим о том, как устроено обращение к регистрам периферии в CMSIS.

Каждый экземпляр периферии является структурой, в которой находятся все регистры, относящиеся к данному устройству. Почти во всех случаях имя структуры совпадает с именем периферийного модуля. Для микроконтроллера STM32F103C8 все структуры периферийных модулей объявлены в файле stm32f103xb.h:

#define TIM2                ((TIM_TypeDef *)TIM2_BASE)
#define TIM3                ((TIM_TypeDef *)TIM3_BASE)
#define TIM4                ((TIM_TypeDef *)TIM4_BASE)
#define RTC                 ((RTC_TypeDef *)RTC_BASE)
#define WWDG                ((WWDG_TypeDef *)WWDG_BASE)
#define IWDG                ((IWDG_TypeDef *)IWDG_BASE)
#define SPI2                ((SPI_TypeDef *)SPI2_BASE)
#define USART2              ((USART_TypeDef *)USART2_BASE)
#define USART3              ((USART_TypeDef *)USART3_BASE)
#define I2C1                ((I2C_TypeDef *)I2C1_BASE)
#define I2C2                ((I2C_TypeDef *)I2C2_BASE)
#define USB                 ((USB_TypeDef *)USB_BASE)
#define CAN1                ((CAN_TypeDef *)CAN1_BASE)
#define BKP                 ((BKP_TypeDef *)BKP_BASE)
#define PWR                 ((PWR_TypeDef *)PWR_BASE)
#define AFIO                ((AFIO_TypeDef *)AFIO_BASE)
#define EXTI                ((EXTI_TypeDef *)EXTI_BASE)
#define GPIOA               ((GPIO_TypeDef *)GPIOA_BASE)
#define GPIOB               ((GPIO_TypeDef *)GPIOB_BASE)
#define GPIOC               ((GPIO_TypeDef *)GPIOC_BASE)
#define GPIOD               ((GPIO_TypeDef *)GPIOD_BASE)
#define GPIOE               ((GPIO_TypeDef *)GPIOE_BASE)
#define ADC1                ((ADC_TypeDef *)ADC1_BASE)
#define ADC2                ((ADC_TypeDef *)ADC2_BASE)
#define ADC12_COMMON        ((ADC_Common_TypeDef *)ADC1_BASE)
#define TIM1                ((TIM_TypeDef *)TIM1_BASE)
#define SPI1                ((SPI_TypeDef *)SPI1_BASE)
#define USART1              ((USART_TypeDef *)USART1_BASE)
#define SDIO                ((SDIO_TypeDef *)SDIO_BASE)
#define DMA1                ((DMA_TypeDef *)DMA1_BASE)
#define DMA1_Channel1       ((DMA_Channel_TypeDef *)DMA1_Channel1_BASE)
#define DMA1_Channel2       ((DMA_Channel_TypeDef *)DMA1_Channel2_BASE)
#define DMA1_Channel3       ((DMA_Channel_TypeDef *)DMA1_Channel3_BASE)
#define DMA1_Channel4       ((DMA_Channel_TypeDef *)DMA1_Channel4_BASE)
#define DMA1_Channel5       ((DMA_Channel_TypeDef *)DMA1_Channel5_BASE)
#define DMA1_Channel6       ((DMA_Channel_TypeDef *)DMA1_Channel6_BASE)
#define DMA1_Channel7       ((DMA_Channel_TypeDef *)DMA1_Channel7_BASE)
#define RCC                 ((RCC_TypeDef *)RCC_BASE)
#define CRC                 ((CRC_TypeDef *)CRC_BASE)
#define FLASH               ((FLASH_TypeDef *)FLASH_R_BASE)
#define OB                  ((OB_TypeDef *)OB_BASE)
#define DBGMCU              ((DBGMCU_TypeDef *)DBGMCU_BASE)

RCC_CRHSEON

RCC->CR |= RCC_CR_HSEON_Msk;
RCC->CR |= (1 << RCC_CR_HSEON_Pos);

Сначала идет имя периферийного модуля, в нашем случае «RCC». Затем символ «->», после чего имя регистра «CR».  RCC_CR_HSEON_Msk представляет собой вот такой #define:

#define RCC_CR_HSEON_Msk    (1<<16)

HSEONCRRCC_CR_HSEON_Msk_MskRCC_CR_HSEON_Msk

#define RCC_CR_HSEON    RCC_CR_HSEON_Msk

_Msk.

Второй случай выглядит аналогичным образом:

где

#define RCC_CR_HSEON_Pos    16

RCC_CR_HSEON_Pos_Pos

А как быть с параметрами, которые имеют несколько битов? К примеру в регистре CFGR мы хотим установить значение множителя PLL равное девяти, имеющее код 0111 (см. рис. 2 биты PLLMUL). Тут вот такое решение:

RCC->CFGR |= RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_2;
RCC->CFGR &= ~(RCC_CFGR_PLLMULL_3);

PLLMULPLLMUL

RCC->CFGR |= RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_2;
RCC->CFGR |= (7 << RCC_CFGR_PLLMULL_Pos);

PLLMUL

Сравнение STM32 с Arduino

Сравнение STM32 с Arduino

По техническим характеристикам Ардуино проигрывает STM32. Тактовая частота микроконтроллеров Ардуино ниже – 16 МГц против 72 МГц STM32. Количество выводов GRIO у STM32 больше. Объем памяти у STM32 также выше. Нельзя не отметить pin-to-pin совместимость STM32 – для замены одного изделия на другое не нужно менять плату. Но полностью заменить ардуино конкуренты не могут. В первую очередь это связано с высоким порогом вхождения – для работы с STM32 нужно иметь базис. Платы Ардуино более распространены, и, если у пользователя возникает проблема, найти решение можно на форумах. Также для Ардуино созданы различные шилды и модули, расширяющие функционал. Несмотря на преимущества, по соотношению цена/качество выигрывает STM32.

Семейство микроконтроллеров STM32 отличается от своих конкурентов отличным поведением при температурах от -40С до +80 С. Высокая производительность не уменьшается, в отличие от Ардуино. Также можно найти изделия, работающие при температурах до 105С.

Каналы EXTI

Каналы EXTI имеют следующие названия: EXTI0, EXTI1, EXTI2 .. EXTI19. Всего в нашем распоряжении 20 каналов. Причем EXTI0 — EXTI15 могут быть подключены к одному из портов GPIO. EXTI16 подключен внутри МК к выходу программируемого детектора напряжения PVD, EXTI17 к событию RTC Alarm, EXTI18 к USB микроконтроллера, и EXTI19 к контроллеру Ethernet, если он конечно есть.

В данный момент нас интересуют те каналы EXTI, которые могут быть подключены к портам GPIO. И здесь есть один нюанс. На входе каждого канала EXTI стоит мультиплексор, который позволяет выбрать пин GPIO следующим образом:

Т.е. к EXTI0 можно подключить один из 0-ых выводов портов, к EXTI1 один из 1-ых выводов, и так далее. Для каждой линии значение мультиплексора можно выбрать независимо, т.е. EXTI0 можно подключить к PA0, EXTI1 к PB1, и так далее. Однако такая организация подключений имеет некоторое ограничение, которое необходимо учитывать: мы не можем одновременно регистрировать события от, например, линий PA0 и PB0, так как они подключены к одному и тому же мультиплексору.

Символы кириллицы или пробелы в пути к разрабатываемой программе

Это следствие той же проблемы, что и в предыдущем случае. Программист нормально установил среду программирования, все работает, но вдруг какая-то новая программа отказывается компилироваться. Обычно описание ошибки выглядит как: «No such file or directory» при этом имя файла отображается в нечитаемой кодировке.

Как правило, причина в том, что путь к проекту содержит символы кириллицы или пробелы. Например проект был размещен в каталоге с именем типа: «c:\Новая папка».

Решение: Создавайте проекты в папке «c:\Work» или в любой другой папке, в пути к которой нет пробелов или кириллицы.

Как автоматизировать создание комментариев

В различных IDE есть возможность автоматизировать создание комментариев. Это делается с использованием тегов — дескрипторов, которые начинаются с символа @. Вот самые популярные:

  • @author — идентифицирует автора исходного кода;
  • @param — определяет параметр метода;
  • @see — ссылка;
  • @since — версия программного обеспечения;
  • @return — тип возвращаемых процедурой или функцией данных.

Из таких комментариев автоматически формируется документация программы. Для этого используют генераторы документации, например, javadoc для языка Java, phpDocumentor для PHP, doxygen для C и C++, Epydoc для Pithon и другие.

Принцип работы прост. Генератор обрабатывает файл с исходным текстом, находит там имена классов, их членов, свойств, методов, процедур и функций, а затем связывает их с данными из наших комментариев с тегами. Из этой информации формируется документация в формате HTML, PDF, RTF или других.

При разработке библиотек и фреймворков обычно создается документация для API. Со временем она устаревает — в неё не успевают или просто забывают вносить изменения.

Правила, которых принято придерживаться

У разработчиков принято использовать при комментировании несколько простых правил. Так легче работать — больше пользы и не нужно плодить лишние строки кода.

1. Комментарии помещаются прямо над кодом, к которому они относятся. Так проще понять, о чём речь, не вникая в содержание каждой строчки. Совсем короткие пояснения можно писать справа.

2. Комментируют все основные элементы кода: модули, функции, константы, глобальные переменные, интерфейсы, классы и их составные элементы (методы, свойства, константы).

3. Пишут коротко и по делу. Комментарии без смысловой нагрузки страшно раздражают. Не нужно писать комментарии типа «это гениальный код», «таблица1», «! №; %:? *» и подобные.

Заметки, связанные с программным сбросом STM32

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>yle=»margin-bottom:5px;»>Теги:  Примечания STM32  stm32

1. Аппаратный сброс

Аппаратный сброс выполняется, как показано на рисунке ниже, просто потяните вывод RESET на низкий уровень, как показано ниже:

Функция программного сброса: NVIC_SystemReset ();

В серии STM32F1XX функция сброса находится в файле core_cm3.h:

В серии STM32F4XX функция сброса находится в файле core_cm4.h:

Он инкапсулирован в библиотеке HAL. В stm32f4xx_hal_cortex.c эффект от вызова двух функций выше и ниже одинаков.

Отключить функцию прерывания: __set_FAULTMASK (1);

По мнению некоторых блоггеров в Интернете, все еще существует задержка между вызовом функции сброса и настоящим сбросом. В течение этого времени микроконтроллер все еще может нормально обрабатывать прерывания и другие программы. Во избежание этой ситуации соответствующие прерывания следует замаскировать. Здесь будут использоваться следующие функции, связанные с маской прерывания; Можно заметить, что имена этих функций в M3 и M4 совпадают. Определение функций в M3 находится в core_cm3.h, а именно:

В авторитетном руководстве M3 вы можете видеть, что функция этого регистра — запрещать всеМаскируемое прерывание,следующим образом:

Интеллектуальная рекомендация

1. Для реальных сигналов (для понимания): A (ω) является соотношением амплитуды выходного сигнала и амплитуды входного сигнала, называемого частотой амплитуды. Φ (ω) — это разница межд…

Один. вести Многие люди задавали некоторые вопросы о создании проекта Flex + LCDS (FDS) в сообщениях и группах. Из-за операции ее трудно четко объяснить, поэтому я написал простой учебник (я обещал эт…

package com.example.phonehttp; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.widget.ScrollView; import android.widget.TextView; public class MainActi…

Он предназначен для реализации подкласса того же родительского класса с родительским классом. Полиморфизм Один и тот же ссылочный тип использует разные экземпляры для выполнения разных операций; Идея …

тема: Объедините два упорядоченных слоя в новый заказанный список и возврат. Новый список состоит из всех узлов двух связанных списков, данных сплавным. Пример: Анализ: два связанных списка состоит в …

Вам также может понравиться

D. Самая ценная строка Пример ввода 2 2 aa aaa 2 b c Образец вывода aaa c На самом деле, будучи задетым этим вопросом, вы должны быть осторожны. После инвертирования строки, если две строки имеют один…

Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surro…

calc () может быть очень незнакомым для всех, и трудно поверить, что calc () является частью CSS. Поскольку он выглядит как функция, почему он появляется в CSS, поскольку это функция? Этот момент такж…

Основываясь на дереве регрессии, сформированном CART, а также на предварительной и последующей обрезке дерева, код выглядит следующим образом:…

Откат Обновление в режиме онлайн с версии Centos (CentOS Linux версии 7.3.1611 (Core) до CentOS Linux версии 7.5.1804 (Core)) # ошибка соединения yum-ssh после обновления yexpected key exchange group …

Чем комментарии могут помочь программисту

Комментарии, в зависимости от ситуации, делают сразу несколько полезных вещей:

Помогают быстрее разобраться в коде — если появилась ошибка или нужно что-то изменить d программе

Это важно и разработчику, и тем, кто будет заниматься кодом после него.
Не дают запутаться в логике — при создании новых библиотек, процедур, функций и системных переменных.
Объясняют результаты работы — при отладке или проверке программы. Это понимание необходимо тестировщикам из отдела QA.
Описывают сложные алгоритмы и формулы — в математических, физических или экономических расчётах и других сложных вычислениях

Это позволяет разобраться в готовом коде тем, у кого нет глубоких знаний в какой-то предметной области.

Не хватает нужных компонентов (компилятора, отладчика, библиотек)

Нужно понимать, что CodeBlocks — это просто каркас для подключения различных инструментов. Если вы просто скачаете пустой CodeBlocks с официального сайта и попытаетесь писать и отлаживать программу, то у вас ничего не получится. CodeBlocks не сможет запустить ни комплятор, ни отладчик. Все это нужно скачивать и устанавливать отдельно.

Но тут будет новая проблема — проблема выбора. CodeBlocks поддерживает все существующие компиляторы Си, какой выбрать? То же относится к любому другому инструментарию: отладчикам, профайлерам, плагинам и т.д.

Именно поэтому я и сделал сборку Си-экспресс, чтобы можно было сразу распаковать и работать. Все нужные компоненты уже установлены. Если вы точно знаете, что вам нужен другой компонент, то просто найдите и замените его на тот, который вам нужен.

Решение: Скачайте сборку Си-экспресс.

Софт

Перейдем теперь к программной составляющей. Нам понадобится драйвер для программатора и управляющая софтина, через через которую мы будем загружать прошивку в микроконтроллер. Для этого нам нужно на официальном сайте www.st.com скачать пакет STM32 ST-LINK utility. А что нужно сделать перед скачиванием чего-нибудь с www.st.com? Правильно! Надо у них зарегистрироваться!!!

Кину ссылку на архив в конце статьи.

Итак, мы добыли архив с пакетом STM32 ST-LINK Utility. После установки подключаем программатор к ПК по USB и подключаем питание к отладочной плате. Если драйвера на программатор не установились автоматически, то идем в диспетчер устройств, там находим наш STM32 STLink, выбираем Обновить драйвер->Выполнить поиск на этом компьютере. После этого все должно заработать. Затем, из меню «Пуск» запускаем программу «STM32 ST-LINK Utility«:

Выглядит интерфейс ST-LINK Utility вот так:

Далее, нам необходимо произвести небольшие настройки. В меню выбираем Target->Settings…

Открывается вот такое окошко:

Выставляем настройки, как на скриншоте и нажимаем OK. После этого программатор автоматически подключится к прошиваемому микроконтроллеру. Пробежимся по кнопкам управления:

«Подключиться к микроконтроллеру» — выполняет подключение программатора к МК. При этом работа прошивки останавливается. После этого можно выполнять дальнейшие манипуляции с flash-памятью МК.

«Отключиться от микроконтроллера» — после того, как мы все сделали, нажимаем на эту кнопку и SL-Link отключается от МК, при этом запускается загруженная во flash-память прошивка.

«Очистить чип» — при нажатии на эту кнопку стирается вся flash-память микроконтроллера. Это необходимо делать перед загрузкой другой прошивки в МК.

Для того, чтобы прошить наш .hex или .bin файл в МК нужно сделать следующее. В меню выбираем Target->Programm…

После этого у нас открывается окошко выбора файла прошивки. Выбираем нужный нам файл, после чего появляется вот такое окно:

Здесь нам нужно нажать Start чтобы запустить процесс. После того, как прошивка была загружена в МК, нажимаем на кнопку «Отключиться от микроконтроллера«.

Те, кто раньше работал с микроконтроллерами AVR знают о такой вещи как фьюз-биты. Если в AVR-ках неправильно их выставить, то прошивка может работать некорректно. Для вас хорошая новость: в STM32 фьюз-битов нет! Достаточно просто залить в МК файл с управляющей программой и все будет работать.

Ну что ж, на этом, пожалуй, закончу, всем кто дочитал, спасибо за внимание Продолжение тут

Перечень проектов

Example_First_Programm — GPIO. Первая программа. Мигание светодиодом

Example_GPIO — GPIO. Пример работы с входами и выходами

Example_StepMotor — GPIO. Пример работы с шаговым двигателем 28BYJ-48

Example_Nokia5110 — GPIO. Remap. Пример работы с выходами

Example_WG12864A — GPIO. Пример работы с LCD дисплеем WG12864A (KS0108/KS0107)

Example_ADC — ADC. Простой пример работы с АЦП

Example_ADC_DMA — ADC. Работа с АЦП с использованием DMA

Example_ADC_Injected — ADC. Работа с АЦП с настройкой Injected каналов

Example_ADC_Temperature — ADC. Использование встроенного термометра

Example_ADC_Watchdog — ADC. Аналоговый Watchdog

Example_Sonar — EXTI. Пример работы с сонаром HC-SR04

Example_USART1 — USART. Пример простого терминала

Example_USART_DMA — USART. Отправка данных через последовательный порт с помощью DMA

Example_DFPlayerMini — USART. Пример работы с MP3 плеером DFPlayer Mini. Функция произнесения числа

Example_SysTick — Таймер. Системный таймер SysTick. Задержка на SysTick

Example_TIM_CLK — Таймер. Генерирование прерывания через равные промежутки времени

Example_TIM_Time — Таймер. Измерение времени между двумя событиями

Example_PPM — Таймер. Захват сигнала

Example_Encoder — Таймер. Работа с энкодером

Example_Encoder_IT — Таймер. Работа с энкодером

Example_PWM_LED — Таймер. PWM. Управление яркостью светодиода

Example_PWM_RGB — Таймер. PWM. Управление цветом RGB светодиода

Example_PWM_Servo — Таймер. PWM. Управление сервоприводом

Example_PWM_Sound — Таймер. PWM. Генерирование звука

Example_RTC — RTC. Пример работы с часами реального времени

Example_BKP — BKP. Пример работы с регистрами Backup registers

Example_FLASH — FLASH. Пример сохранения настроек во FLASH память

Example_Watchdog — Watchdogs. Пример использование IWDG и WWDG

Example_I2C_Master — I2C. Работа с шиной I2C на примере датчика атмосферного давления BMP280

Example_I2C_Slave — I2C. Работа с шиной I2C в качестве Slave устройства

Example_BMP280 — I2C. Пример работы с датчиком атмосферного давления BMP280

Example_MS5611 — I2C. Пример работы с датчиком атмосферного давление MS5611

Example_USB_Virtual_Com_Port — USB. Пример работы с USB. Виртуальный последовательный порт

Example_USB_Keyboard — USB. Пример работы с USB. Эмуляция клавиатуры и мышки

Example_USB_Mass_Storage — USB. Пример работы с USB. STM32F103 в качестве Mass Storage Device

Example_PWR_Sleep — PWR. Использование энергосберегающего режима SLEEP

Example_PWR_Stop — PWR. Использование энергосберегающего режима STOP

Example_PWR_Standby — PWR. Энергосберегающий режим Standby. Пробуждение от Wake Up Pin

Example_PWR_Standby_RTC — PWR. Энергосберегающий режим Standby. Пробуждение от RTC

Example_Bootloader — Bootloader. Пример собственного загрузчика

Example_BLDC — Управление бесколлекторным двигателем с датчиками Холла (Sensored Brushless)

Example_PMSM — Управление PMSM с датчиками Холла с помощью STM32

Смотри также:

  • 1. STM32. Программирование STM32F103. Тестовая плата. Прошивка через последовательный порт и через ST-Link программатор
  • 2. STM32. Программирование. IDE для STM32
  • 3. STM32. Программирование STM32F103. GPIO
  • 4. STM32. Программирование STM32F103. Тактирование
  • 5. STM32. Программирование STM32F103. USART
  • 6. STM32. Программирование STM32F103. NVIC
  • 7. STM32. Программирование STM32F103. ADC
  • 8. STM32. Программирование STM32F103. DMA
  • 9. STM32. Программирование STM32F103. TIMER
  • 10. STM32. Программирование STM32F103. TIMER. Захват сигнала
  • 11. STM32. Программирование STM32F103. TIMER. Encoder
  • 12. STM32. Программирование STM32F103. TIMER. PWM
  • 13. STM32. Программирование STM32F103. EXTI
  • 14. STM32. Программирование STM32F103. RTC
  • 15. STM32. Программирование STM32F103. BKP
  • 16. STM32. Программирование STM32F103. Flash
  • 17. STM32. Программирование STM32F103. Watchdog
  • 18. STM32. Программирование STM32F103. Remap
  • 19. STM32. Программирование STM32F103. I2C Master
  • 20. STM32. Программирование STM32F103. I2C Slave
  • 21. STM32. Программирование STM32F103. USB
  • 22. STM32. Программирование STM32F103. PWR
  • 23. STM32. Программирование STM32F103. Option bytes
  • 24. STM32. Программирование STM32F103. Bootloader
  • STM32. Скачать примеры
  • System Workbench for STM32 Установка на Ubuntu
  • Keil uVision5 – IDE для STM32
  • IAR Workbench – IDE для STM32
  • Управление бесколлекторным двигателем постоянного тока (BLDC) с помощью STM32
  • Управление PMSM с помощью STM32

Когда нужны пояснения в коде, а когда — нет

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

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

Если вы вставили промежуточные комментарии для отладки или объяснения результатов, после окончания работы их нужно убрать. Иначе они будут захламлять код.

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

После отладки их лучше удалить, оставив строки:

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

Но бывают исключения. Допустим, разработчик попробовал несколько вариантов решения и выбрал один, не самый очевидный. Потом забыл ход своих мыслей, открыл код и решил использовать «более правильный и оптимальный вариант». И тут он понимает, что новое решение хуже старого; более того, раньше он уже это пробовал делать. Приходится откатывать всё назад. Чтобы не попасть в такую ситуацию, пишите поясняющие комментарии.

Пример на языке JavaScript:

Здесь и сам метод Number.isFinite (), и глобальная функция isFinite () проверяют, является ли параметр value конечным числом (то есть не ± ∞). Но если value = null, то isFinite (value) возвращает true, а Number.isFinite (value) возвращает false. Поэтому Number.isFinite (value) нельзя менять на isFinite (value).

Обязательно комментируйте код, если в нём есть какие-то тонкости и неочевидные вещи. Например:

Это неудачный комментарий: непонятно, зачем количество умножать на 2.

Правильно будет так:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: