<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									STM32 для начинающих - STM32				            </title>
            <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/</link>
            <description>Обсуждение вопросов, посвященных программированию микроконтроллеров, разработке электроники и не только.</description>
            <language>ru-RU</language>
            <lastBuildDate>Sat, 04 Apr 2026 04:18:51 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>Реализация TUI на UART с прерываниями</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/23/#post-4099</link>
                        <pubDate>Thu, 12 Feb 2026 11:01:33 +0000</pubDate>
                        <description><![CDATA[Всем привет.
Занимаюсь реализацией TUI через UART на STM32F1xx с HAL. Описание функциональности:
- Неблокирующий ввод
- Завершение ввода при нажатии Enter
- При нажатии на Backspace пред...]]></description>
                        <content:encoded><![CDATA[<p>Всем привет.</p>
<p>Занимаюсь реализацией TUI через UART на STM32F1xx с HAL. Описание функциональности:</p>
<p>- Неблокирующий ввод</p>
<p>- Завершение ввода при нажатии Enter</p>
<p>- При нажатии на Backspace предыдущий символ удаляется (при наличии)</p>
<p>- Видимые символы отображаются</p>
<p>Вывод также хочется реализовать через прерывания, если вызов функции был сделан не из обработчика другого прерывания (в таком случае реализуется блокирующий вывод).</p>
<p>При написании кода использую кольцевой буфер (ring/circular buffer) для хранения строк. Он представляет из себя отдельную библиотеку.</p>
<p>Вот код проекта:</p>
<div>
<pre contenteditable="false">static UART_HandleTypeDef *console_uart = NULL;
static char line_buffer;
static uint16_t line_len = 0;

// TX Buffer
static ring_buffer_t tx_buffer;
static volatile uint8_t tx_busy = 0;
static volatile uint8_t tx_byte;

// RX Buffer
static ring_buffer_t rx_buffer;
static volatile uint8_t rx_byte;
static volatile uint8_t rx_ready = 0;

static void console_rx_callback(UART_HandleTypeDef *);
static void console_tx_callback(UART_HandleTypeDef *);

uint8_t console_init(UART_HandleTypeDef *huart) {
    if (huart == NULL || console_uart != NULL) {
        return 1;
    }

    console_uart = huart;

    ring_buffer_init(&amp;tx_buffer);
    tx_busy = 0;    

    ring_buffer_init(&amp;rx_buffer);
    rx_ready = 0;

    HAL_UART_RegisterCallback(
        console_uart,
        HAL_UART_RX_COMPLETE_CB_ID,
        console_rx_callback
    );

    HAL_UART_RegisterCallback(
        console_uart,
        HAL_UART_TX_COMPLETE_CB_ID,
        console_tx_callback
    );

    HAL_UART_Receive_IT(console_uart, (uint8_t *) &amp;rx_byte, 1);
    return 0;
}

void console_print(const char *str) {
    HAL_UART_Transmit(console_uart, (uint8_t *) str, strlen(str), 10);
    // ring_buffer_write(&amp;tx_buffer, (uint8_t *) str, strlen(str));

    // if (tx_busy == 0) {
    //     tx_busy = 1;
    //     tx_byte = ring_buffer_pop(&amp;tx_buffer);
    //     HAL_UART_Transmit_IT(console_uart, &amp;tx_byte, 1);
    // }
}

void console_clear() {
    console_print("\033[2J\033[H");
}

// Берет на себя всю обработку символов: backspace, enter и echo
void console_poll() {
    while (ring_buffer_get_length(&amp;rx_buffer) &gt; 0 &amp;&amp; rx_ready == 0) {
        uint8_t ch = ring_buffer_pop(&amp;rx_buffer);
        if ((ch == '\b' || ch == 0x7F) &amp;&amp; line_len &gt; 0) {
            line_len--;
            console_print("\b \b");
        }
        else if (ch == '\r' || ch == '\n') {
            line_buffer = '\0';
            rx_ready = 1;
            console_print("\r\n");
            return;
        }
        else if (line_len &lt; CONSOLE_MAX_RX_DATA_LENGTH - 1) {
            line_buffer = ch;
            char echo = {ch, 0};
            console_print(echo);
        }
    }
}

uint8_t console_ready() {
    return rx_ready;
}

void console_read(char *buffer) {
    if (buffer == NULL || rx_ready == 0) {
        return;
    }
    
    strcpy(buffer, line_buffer);
    rx_ready = 0;
    line_len = 0;
    line_buffer = '\0';
}

static void console_tx_callback(UART_HandleTypeDef *console) {
    if (ring_buffer_get_length(&amp;tx_buffer) == 0) {
        tx_busy = 0;
    }
    else {
        tx_byte = ring_buffer_pop(&amp;tx_buffer);
        HAL_UART_Transmit_IT(console_uart, &amp;tx_byte, 1);
    }
}

static void console_rx_callback(UART_HandleTypeDef *console) {
    ring_buffer_push(&amp;rx_buffer, rx_byte);
    HAL_UART_Receive_IT(console_uart, &amp;rx_byte, 1);
}</pre>
<p><br />Использование в приложении примерно такое:</p>
<pre contenteditable="false">while(1) {
    console_poll();
    if (console_ready()) {
        console_read(consoleBuffer);
        // Действия с console buffer
    }
}</pre>
</div>
<p>&nbsp;</p>
<p>При подключении через утилиту screen на скорости 115200 выводит следующее (вводил просто '?'):</p>
<pre contenteditable="false">Rebooeot system
?. menu
cm&gt;&gt;
Unknoan
oy en
symenu
cm</pre>
<p>То есть вывод максимально ломаный.</p>
<p>Знающие люди, подскажите, пожалуйста, что не так с этим кодом и в чем именно проблема. Нейронки не помогают, а в DMA сейчас не планирую лезть - хочу сперва разобраться с прерываниями.</p>
<p>Благодарю за любую помощь, спасибо!</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>arm-programmer</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/23/#post-4099</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/23/#post-3994</link>
                        <pubDate>Mon, 10 Nov 2025 08:05:09 +0000</pubDate>
                        <description><![CDATA[Нашёл ответ на свой вопрос. I2C на плате сделан программный..]]></description>
                        <content:encoded><![CDATA[<p>Нашёл ответ на свой вопрос. I2C на плате сделан программный..  </p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Алекsей</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/23/#post-3994</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3993</link>
                        <pubDate>Mon, 10 Nov 2025 08:04:50 +0000</pubDate>
                        <description><![CDATA[Нашёл ответ на свой вопрос.
Чудес не бывает, если в документации на микроконтроллер нет таких альтернативных функций на нужных выводах, значит их там действительно нет. I2C на данной плате ...]]></description>
                        <content:encoded><![CDATA[<p>Нашёл ответ на свой вопрос.</p>
<p>Чудес не бывает, если в документации на микроконтроллер нет таких альтернативных функций на нужных выводах, значит их там действительно нет. I2C на данной плате сделан программный.. Зачем не понятно.  </p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Алекsей</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3993</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3992</link>
                        <pubDate>Sun, 09 Nov 2025 04:38:36 +0000</pubDate>
                        <description><![CDATA[GPIOI-&gt;AFR &amp;= ~GPIO_AFRL_AFRL7;                   // функция от 0 до 7
GPIOI-&gt;AFR |= (8 &lt;&lt; GPIO_AFRL_AFSEL7_Pos);  // порт 8
 
 GPIOI-&gt;AFR &amp;= ~GPIO_AFRL_AF...]]></description>
                        <content:encoded><![CDATA[<div><span> GPIOI-&gt;AFR &amp;= ~GPIO_AFRL_AFRL7;                   // функция от 0 до 7</span></div>
<div><span>GPIOI-&gt;AFR |= (8 &lt;&lt; GPIO_AFRL_AFSEL7_Pos);  // порт 8</span></div>
<div> </div>
<div><span> GPIOI-&gt;AFR &amp;= ~GPIO_AFRL_AFRL7;                     // функция от 0 до 7</span></div>
<div><span>GPIOI-&gt;AFR |= (11 &lt;&lt; GPIO_AFRL_AFSEL7_Pos);  // порт 11</span></div>
<div> </div>
<div>Так вернее, пока до конца не пойму, как подобрать нужные настройки..</div>
<div>(ещё есть старшый регистр)</div>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Алекsей</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3992</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3991</link>
                        <pubDate>Sun, 09 Nov 2025 04:09:50 +0000</pubDate>
                        <description><![CDATA[Здравствуйте !
Вопрос не очень &quot;понятный&quot;. Пришла плата с контроллером и дисплеем (алиэкспресс). Демо прошивка работает и сенсорный экран тоже работает.
Вопрос по подключению драйвера сенс...]]></description>
                        <content:encoded><![CDATA[<p>Здравствуйте !</p>
<p>Вопрос не очень "понятный". Пришла плата с контроллером и дисплеем (алиэкспресс). Демо прошивка работает и сенсорный экран тоже работает.</p>
<p>Вопрос по подключению драйвера сенсорной панели GT911, по интерфейсу I2C. <br />Она подключена на выводы контроллера (stm32h7) PI11 - SCLK и PI8 - SDA. В документации на контроллер эти выводы нельзя настроить на данный I2C интерфейс. Но повторюсь, демо прошивка работает !</p>
<p>Соответственно, CubEde не даёт настроить эти выводы. </p>
<p>&nbsp;</p>
<p>Тоже ошибку выдаёт, нет такой функции - <span>GPIO_AFRL_AFRL8</span></p>
<div><span> GPIOI-&gt;AFR &amp;= ~GPIO_AFRL_AFRL8;</span></div>
<div><span>GPIOI-&gt;AFR |= (4 &lt;&lt; GPIO_AFRL_AFSEL3_Pos);</span></div>
<p>Если попробовать сделать настройки через регистры напрямую ? (правда не пойму как..) </p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Алекsей</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3991</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3821</link>
                        <pubDate>Mon, 08 Sep 2025 14:02:10 +0000</pubDate>
                        <description><![CDATA[Да, все верно.
Я бегло просмотрел код, по всей видимости там логика изменения периода неверная, blink_speed меняется по истечению периода, то есть на практике светодиод должен включаться, ч...]]></description>
                        <content:encoded><![CDATA[
<p>@aveal <br />Закомментировать это значит сделать так чтобы строчка не использовалась в коде?<br />Я просто только учусь, мне это для работы надо сделать</p>
<p></p>
<p>Да, все верно.</p>
<p>Я бегло просмотрел код, по всей видимости там логика изменения периода неверная, blink_speed меняется по истечению периода, то есть на практике светодиод должен включаться, через 100 мс гаснуть, через 500 мс загораться, через 1000 мс гаснуть и так далее (100, 500, 1000, 100, 500, 1000).</p>
<p>&nbsp;</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3821</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3820</link>
                        <pubDate>Mon, 08 Sep 2025 13:50:41 +0000</pubDate>
                        <description><![CDATA[@aveal Закомментировать это значит сделать так чтобы строчка не использовалась в коде?Я просто только учусь, мне это для работы надо сделать
&nbsp;]]></description>
                        <content:encoded><![CDATA[<p>@aveal <br />Закомментировать это значит сделать так чтобы строчка не использовалась в коде?<br />Я просто только учусь, мне это для работы надо сделать</p>
<p>&nbsp;</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>luvver</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3820</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3819</link>
                        <pubDate>Mon, 08 Sep 2025 13:46:16 +0000</pubDate>
                        <description><![CDATA[@luvver Добрый день, попробуй закомментировать:
blink_speed = (blink_speed + 1) % 3;
И затем для разных значений blink_speed протестировать:
uint8_t blink_speed = 0; 
uint8_t blink_speed...]]></description>
                        <content:encoded><![CDATA[<p>@luvver Добрый день, попробуй закомментировать:</p>
<pre contenteditable="false">blink_speed = (blink_speed + 1) % 3;</pre>
<p>И затем для разных значений <em>blink_speed</em> протестировать:</p>
<pre contenteditable="false">uint8_t blink_speed = 0; </pre>
<pre contenteditable="false">uint8_t blink_speed = 1;</pre>
<pre contenteditable="false">uint8_t blink_speed = 2; </pre>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3819</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих Реализация мигания светодиодом с разной скоростью через таймер</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3818</link>
                        <pubDate>Mon, 08 Sep 2025 13:32:23 +0000</pubDate>
                        <description><![CDATA[Здравствуйте, пытался реализовать мигание светиком с разной скоростью через таймер на микроконтроллере STM32F401CDU6, он шьётся, но светик мигает с одной скоростью и не меняет её. Работаю в ...]]></description>
                        <content:encoded><![CDATA[<p>Здравствуйте, пытался реализовать мигание светиком с разной скоростью через таймер на микроконтроллере STM32F401CDU6, он шьётся, но светик мигает с одной скоростью и не меняет её. Работаю в STMCubeIDE. Вот мой код:</p>
<pre contenteditable="false">/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

TIM_HandleTypeDef htim2;

/* USER CODE BEGIN PV */

uint8_t blink_speed = 0; // Индекс текущего периода

uint32_t blink_counter = 0; // Счетчик тиков таймера

uint32_t blink_periods[] = {100, 500, 1000}; // Периоды мигания в мс

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_TIM2_Init(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_TIM2_Init();

/* USER CODE BEGIN 2 */

// Включаем светодиод

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

// Запускаем таймер

HAL_TIM_Base_Start_IT(&amp;htim2);

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Configure the main internal regulator output voltage

*/

__HAL_RCC_PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLM = 4;

RCC_OscInitStruct.PLL.PLLN = 84;

RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

RCC_OscInitStruct.PLL.PLLQ = 4;

if (HAL_RCC_OscConfig(&amp;RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

/** Initializes the CPU, AHB and APB buses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&amp;RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

{

Error_Handler();

}

}

/**

* @brief TIM2 Initialization Function

* @param None

* @retval None

*/

static void MX_TIM2_Init(void)

{

/* USER CODE BEGIN TIM2_Init 0 */

/* USER CODE END TIM2_Init 0 */

TIM_ClockConfigTypeDef sClockSourceConfig = {0};

TIM_MasterConfigTypeDef sMasterConfig = {0};

/* USER CODE BEGIN TIM2_Init 1 */

/* USER CODE END TIM2_Init 1 */

htim2.Instance = TIM2;

htim2.Init.Prescaler = 8399;

htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

htim2.Init.Period = 9999;

htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_Base_Init(&amp;htim2) != HAL_OK)

{

Error_Handler();

}

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

if (HAL_TIM_ConfigClockSource(&amp;htim2, &amp;sClockSourceConfig) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&amp;htim2, &amp;sMasterConfig) != HAL_OK)

{

Error_Handler();

}

/* USER CODE BEGIN TIM2_Init 2 */

/* USER CODE END TIM2_Init 2 */

}

/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* USER CODE BEGIN MX_GPIO_Init_1 */

/* USER CODE END MX_GPIO_Init_1 */

/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOC_CLK_ENABLE();

__HAL_RCC_GPIOH_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

/*Configure GPIO pin : PC13 */

GPIO_InitStruct.Pin = GPIO_PIN_13;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOC, &amp;GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */

/* USER CODE END MX_GPIO_Init_2 */

}

/* USER CODE BEGIN 4 */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

if (htim-&gt;Instance == TIM2)

{

blink_counter++; // Увеличиваем счетчик тиков

uint32_t ticks = blink_periods; // Текущий период в мс

if (blink_counter &gt;= ticks) // Если достигнут период

{

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // Переключаем светодиод

blink_counter = 0; // Сбрасываем счетчик

blink_speed = (blink_speed + 1) % 3; // Переключаем на следующий период

}

}

}

/* USER CODE END 4 */

/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */

__disable_irq();

while (1)

{

}

/* USER CODE END Error_Handler_Debug */

}</pre>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>luvver</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3818</guid>
                    </item>
				                    <item>
                        <title>НА: STM32 для начинающих</title>
                        <link>https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3808</link>
                        <pubDate>Thu, 04 Sep 2025 14:02:17 +0000</pubDate>
                        <description><![CDATA[@eduard Всё, заработало! Большое спасибо за советы!]]></description>
                        <content:encoded><![CDATA[@eduard Всё, заработало! Большое спасибо за советы!]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Эльвир</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/stm32-dlya-nachinayushhih/paged/22/#post-3808</guid>
                    </item>
							        </channel>
        </rss>
		