Регистры 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.
Правильно будет так: