Top.Mail.Ru
Уведомления
Очистить все

[Закреплено] STM32 для начинающих

Страница 22 / 22
(@elvir)
Level 1

@eduard А как программатор обновляется?


ОтветитьЦитата
Размещено : 28.08.2025 08:00
(@elvir)
Level 1

@eduard это в CubeIDE.


ОтветитьЦитата
Размещено : 28.08.2025 08:20
(@elvir)
Level 1

@eduard Если я правильно понимаю, то у меня не собирается пакет из-за того, что нет связи с базой ST. Еще пишет, что нет нужного репозитория. Есть какой-нибудь урок или статья в котором подробно описывается, как установить и запустить программу, чтобы она работала корректно?


ОтветитьЦитата
Размещено : 28.08.2025 08:30
(@elvir)
Level 1

@eduard Вот такое сообщение пишет: Пакет прошивки или одна из его зависимостей, требуемых проектом, отсутствует в вашем репозитории. Вы можете загрузить отсутствующий пакет прошивки, но соединение с сервером st не будет установлено. Или вы можете продолжить и сгенерировать только исходный код без настройки проекта.


ОтветитьЦитата
Размещено : 28.08.2025 08:32
(@eduard)
Level 5 Moderator

Запись от: @elvir

@eduard А как программатор обновляется?

Я не помню сообщение, которое выводится. Там что про Update Firmware.

Нужно согласиться, выйдет окно с кнопкой Update и предложением передёрнуть свисток.
Выдёргиваете его и вставляете снова и нажимается кнопка.

А там как по везёт.

https://disk.yandex.ru/d/Sqb3kIEuMv2MoQ
По этой ссылке скачиваете CubeMX 6.3.0 и CubeIDE 1.14.1,  так же файл Repository.zip и распаковываете его в каталог 

изображение

При запуске CubeMX он должен его увидеть.

изображение

 

изображение

Точно также должно быть и для остальных ядер.
Ни в коем случае не качайте обновление и отключите автоматическое

изображение

 

изображение

 

 

 


ОтветитьЦитата
Размещено : 30.08.2025 16:32
(@eduard)
Level 5 Moderator

Запись от: @elvir

@eduard Если я правильно понимаю, то у меня не собирается пакет из-за того, что нет связи с базой ST. Еще пишет, что нет нужного репозитория. Есть какой-нибудь урок или статья в котором подробно описывается, как установить и запустить программу, чтобы она работала корректно?

Раз нет, нужно написать.

Смогу только в конце Сентября.

 


ОтветитьЦитата
Размещено : 30.08.2025 16:35
(@elvir)
Level 1

@eduard Спасибо! Попробовал, но все плюс минус такое же. Покопаюсь еще!)


ОтветитьЦитата
Размещено : 02.09.2025 16:21
(@elvir)
Level 1

@eduard Всё, заработало! Большое спасибо за советы!


ОтветитьЦитата
Размещено : 04.09.2025 17:02
(@luvver)
New member

Здравствуйте, пытался реализовать мигание светиком с разной скоростью через таймер на микроконтроллере STM32F401CDU6, он шьётся, но светик мигает с одной скоростью и не меняет её. Работаю в STMCubeIDE. Вот мой код:

/* 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(&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(&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(&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(&htim2) != HAL_OK)

{

Error_Handler();

}

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &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, &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->Instance == TIM2)

{

blink_counter++; // Увеличиваем счетчик тиков

uint32_t ticks = blink_periods[blink_speed]; // Текущий период в мс

if (blink_counter >= 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 */

}

ОтветитьЦитата
Размещено : 08.09.2025 16:32
Aveal
(@aveal)
Top level Admin

@luvver Добрый день, попробуй закомментировать:

blink_speed = (blink_speed + 1) % 3;

И затем для разных значений blink_speed протестировать:

uint8_t blink_speed = 0; 
uint8_t blink_speed = 1;
uint8_t blink_speed = 2; 

ОтветитьЦитата
Создатель темы Размещено : 08.09.2025 16:46
(@luvver)
New member

@aveal 
Закомментировать это значит сделать так чтобы строчка не использовалась в коде?
Я просто только учусь, мне это для работы надо сделать

 


ОтветитьЦитата
Размещено : 08.09.2025 16:50
Aveal
(@aveal)
Top level Admin

Запись от: @luvver

@aveal 
Закомментировать это значит сделать так чтобы строчка не использовалась в коде?
Я просто только учусь, мне это для работы надо сделать

Да, все верно.

Я бегло просмотрел код, по всей видимости там логика изменения периода неверная, blink_speed меняется по истечению периода, то есть на практике светодиод должен включаться, через 100 мс гаснуть, через 500 мс загораться, через 1000 мс гаснуть и так далее (100, 500, 1000, 100, 500, 1000).

 


ОтветитьЦитата
Создатель темы Размещено : 08.09.2025 17:02
Страница 22 / 22
Поделиться: