Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
0 / 0 / 0
Регистрация: 08.09.2025
Сообщений: 1

STM реализация мигания светодиодом с разной скоростью через таймер

08.09.2025, 15:51. Показов 3447. Ответов 61

Студворк — интернет-сервис помощи студентам
Здравсвтвуйте, пытаюсь реализовать мигание светодиодом с разной скоростью через таймер на микроконтроллере STM32F401CDU6, но он мигает только с одной скоростью не меняя её. Написал такой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/* 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 */
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2025, 15:51
Ответы с готовыми решениями:

Мигание светодиодов с разной скоростью и направлением
Возникли проблемы с реализацией цикличного мигания светодиодов с переключением скорости и...

STM 32L1Discovery. Реализовать переключение светодиодов с некоторой частотой
Есть задание: Реализовать переключение светодиодов с некоторой частотой. По нажатию кнопки «USER»...

ATmega128. Мигание светодиодом через таймер0
Добрый вечер, столкнулся с тупиком. Суть задания- на лабораторном стенде атмега128 организовать...

61
1182 / 458 / 68
Регистрация: 22.09.2023
Сообщений: 1,384
11.09.2025, 15:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от wizard41 Посмотреть сообщение
что-то типа такого:
Оппа!! Тут даже я не понял, куда уж новичку разобраться. Поясните.
- Где тут собственно управление светодиодом?
- Если Delay - это задержка, то зачем вообще TIM1?
- Если TIM1 как-то формирует период - то как? Где это происходит? И зачем тогда задержка(?) Delay()?
- что такое xxx?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
11.09.2025, 15:30
Dushevny, не корячьте из себя не пойми кого... Я думаю вы просто докапываетесь..
Очевидно же, что у таймера ТИМ1 настроено (должно быть) прерывание по переполнению, в котором тогглится светодиод.
Задержка для того, чтобы автор зрительно узрел смену частот моргания светика.
ххх - это желаемое время задержки перед очередной сменой частоты.

Вы же не думаете что для такой фигни я буду открывать студию и писать код там?
Написал прямо здесь, в редакторе форума..
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
11.09.2025, 17:47
Цитата Сообщение от wizard41 Посмотреть сообщение
Все!
Жесть-то какая! И на кой черт там вообще таймер использовать, если какой-то "delay" вызывается?
Похоже, ты вообще не понимаешь, что такое ШИМ!
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
11.09.2025, 17:55
Eddy_Em, что такое ШИМ я знаю лучше вас всех вместе взятых.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
на кой черт там вообще таймер
В тексте вопроса написан! Человек хочет управлять таймером. Выскочки, сядьте на место.
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
11.09.2025, 17:59
Цитата Сообщение от wizard41 Посмотреть сообщение
у таймера ТИМ1 настроено (должно быть) прерывание по переполнению, в котором тогглится светодиод.
Зачем прерывать выполнение суперлупа из-за такой тупой задачи? Если уж все равно ты хочешь мигать ногодрыгом, так делай так (Tms - счетчик миллисекунд, инкрементируется посредством SysTick):
Code
1
2
3
4
5
6
7
8
9
10
11
12
void main(){
...
  uint32_t T0 = 0;
...
  while(1){
    if(Tms - T0 >= BLINK_MS){
      PIN_TOGGLE(LED_PORT, LED_PIN);
      T0 = Tms;
    }
...
  }
}
BLINK_MS - полупериод "блымканья" в миллисекундах, PIN_TOGGLE - макрос, который читает ODR, а затем пишет в BSRR, чтобы инвертировать пин.

Добавлено через 1 минуту
Цитата Сообщение от wizard41 Посмотреть сообщение
что такое ШИМ я знаю лучше вас всех вместе взятых.
А пишешь, что, мол, нельзя ШИМ использовать, чтобы тупо диодом мигать! Настраиваешь низкую частоту и мигаешь себе. А можно настроить ШИМ где-нибудь на 500 и выше Гц, и тогда менять яркость светодиода. Один TIM1 сможет сразу четырьмя светодиодами управлять таким образом, останется просто CCRx менять.

Добавлено через 57 секунд
Цитата Сообщение от wizard41 Посмотреть сообщение
Человек хочет управлять таймером.
Судя по той портянке, что он привел, ничего он не хочет.
Потому что для начала привел бы элементарный минимальный код. Который написал бы руками, а не сгенерировал в калокубе!
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
11.09.2025, 18:01
Eddy_Em, мне эти лекции зачем?
Я привел тупой простой пример, как менять регистр счета таймера в суперлупе. Вариантов может быть масса.
Автор не просил ШИМ/DMA/SysTick и прочие штуки. Он про них пока даже не знает!
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
11.09.2025, 18:08
Цитата Сообщение от wizard41 Посмотреть сообщение
простой пример
И засунул в суперлуп блокирующую паузу вместо того, чтобы по счетчику миллисекунд проверять, не пора ли поменять скорость…
Блокирующие паузы (особенно длинней сотни-другой микросекунд) вообще не допустимы в коде, равно как и длительные блокирующие операции чтения/записи (например, считать килобайт по I2C на скорости 10кГц). Ты же прекрасно это знаешь! А зачем тогда пишешь? Чтобы ТС с ходу ардуинщиком стал?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
11.09.2025, 18:12
Eddy_Em, ему эти блокирующие паузы пока до лампочки. Пусть почувствует сперва как управлять таймером в рантайме, что происходит когда меняется то-то или вон то..
Очень не скоро он будет писать критические системы, где задержки неуместны. Он ведь не об этом спрашивает..
И да, ответ обычно должен быть равноценен вопросу. Если нужно мигать светиком, вряд ли стоит заботиться о задержках в цикле.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
11.09.2025, 18:26
Eddy_Em, ТС только учится так что не надо умничать, когда то и вы были начинающим.
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
12.09.2025, 11:30
Цитата Сообщение от Dushevny Посмотреть сообщение
А я продолжаю ждать более элементарного решения. Просто любопытно.
"Более элеметарное" было у автора темы: управлять лампочкой ногодрыгом в ISR. Зачем тут огород с таймерами/ШИМ-ами/DMA - не понятно.

Добавлено через 4 минуты
Цитата Сообщение от Dushevny Посмотреть сообщение
Надо поменять частоту - переписали эти два регистра и оно продолжает само мигать с нужной частотой. Накладных расходов нет вообще.
Ну да - а про необходимость инициализации таймера мы конечно забыли.
А ещё забыли, что в вашем варианте всё равно нужно учитывать сколько полных периодов ШИМ-а прошло. Чтобы все длительности были одинаковой длительности, и не было обрывков. А значит - снова нужен ISR и работа в нём.

Итого: вместо программной обработки в любом периодическом ISR через GPIO, получаем: инициализация таймера + отдельный ISR + код в ISR.
И это почему-то вдруг стало "накладных расходов нет вообще".

Добавлено через 4 минуты
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Один TIM1 сможет сразу четырьмя светодиодами управлять таким образом, останется просто CCRx менять.
Один сразу 4-мя лампочками с разными частотами мигания ??? Правда что-ли? Код в студию!
1
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
12.09.2025, 11:33
Цитата Сообщение от jcxz Посмотреть сообщение
Чтобы все длительности были одинаковой длительности, и не было обрывков.
Чтобы "не было обрывков", достаточно буферизовать CCRx. А ARR и так по умолчанию буферизуется…
Цитата Сообщение от jcxz Посмотреть сообщение
а про необходимость инициализации таймера мы конечно забыли.
Его даже для тупой работы в прерываниях придется настраивать. Ну так и в чем проблема? Просто установить нужный режим ШИМ, да записать нужные значения не только в ARR, но и в CCRx… Ну, понятно, нога будет уже не GPIO, а AF.
Цитата Сообщение от jcxz Посмотреть сообщение
И это почему-то вдруг стало "накладных расходов нет вообще".
Ну и откуда там накладные расходы вдруг взялись? Я просто записываю новые значения в ARR и CCRx, а со следующего периода "автоматом" светодиод начинает мигать с другой частотой. И не нужно тратить время и ресурсы на прерывание.
Сколько там тактов уходит в /dev/null, чтобы войти и выйти из обработчика?

Добавлено через 1 минуту
Цитата Сообщение от jcxz Посмотреть сообщение
Один сразу 4-мя лампочками с разными частотами мигания ??? Правда что-ли? Код в студию!
Читай внимательней: менять яркость четырех светодиодов. Естественно, разные частоты там не выйдут. Только разные заполнения.
Привожу полную цитату:
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А можно настроить ШИМ где-нибудь на 500 и выше Гц, и тогда менять яркость светодиода. Один TIM1 сможет сразу четырьмя светодиодами управлять таким образом, останется просто CCRx менять.
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
12.09.2025, 11:40
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Его даже для тупой работы в прерываниях придется настраивать.
Для "для тупой работы в прерываниях" можно использовать любое уже имеющееся периодическое прерывание (подходящее по частоте). Такие периодические прерывания уже как правило имеются в любой программе. То же прерывание SysTick. И таймер там уже инициализирован и ISR есть.
А с отдельным таймером нужно это всё добавить: инит + ISR + манипуляции с таймером в нём.
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
12.09.2025, 11:42
Цитата Сообщение от jcxz Посмотреть сообщение
То же прерывание SysTick.
Я уже несколько раз предлагал именно по счетчику миллисекунд и мигать. Проще уж некуда!
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
12.09.2025, 11:43
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Ну и откуда там накладные расходы вдруг взялись? Я просто записываю новые значения в ARR и CCRx
А эти "новые значения" вам сами в регистр телепортируются магическим образом? Или их нужно как-то вычислить?
Если сами не телепортируются, то на вычисление их будут все те же самые накладные расходы, что и с ногодрыжным миганием. +инит и + отдельный ISR.

Добавлено через 1 минуту
Цитата Сообщение от VladimirU Посмотреть сообщение
Eddy_Em, ТС только учится так что не надо умничать, когда то и вы были начинающим.
Имхо - в вашей фразе одно слово лишнее. И слово это - "были".
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
12.09.2025, 11:46
Цитата Сообщение от jcxz Посмотреть сообщение
А с отдельным таймером нужно это всё добавить: инит + ISR + манипуляции с таймером в нём.
Вообще ничего сложного.
Можно подумать, для настройки SysTick не нужно читать мануал (правда, не на МК, а на ядро).

Добавлено через 2 минуты
Цитата Сообщение от jcxz Посмотреть сообщение
Если сами не телепортируются, то на вычисление их будут все те же самые накладные расходы, что и с ногодрыжным миганием. +инит и + отдельный ISR.
Зато в твоем случае к этим расходам будут добавляться накладные расходы на каждый "миг", а в моем - только на вычисления.
Еще раз: задумайся, сколько тактов уходит в мусорку элементарно на вход/выход из обработчика! Даже если в самом обработчике ты 2-3 такта посидишь…
Цитата Сообщение от jcxz Посмотреть сообщение
И слово это - "были".
Ну, судя по тому, что другие несут, я смотрю - тут все "вечные начинающие". Так что, можем продолжать измерение МПХ ☺
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
12.09.2025, 11:53
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Можно подумать, для настройки SysTick не нужно читать мануал (правда, не на МК, а на ядро).
Прерывание SysTick (если оно есть), оно уже для чего-то нужно. Значит - его в любом случае нужно настроить и запустить.
А вашем варианте, да ещё если
Цитата Сообщение от Eddy_Em Посмотреть сообщение
сразу четырьмя светодиодами управлять
с разными частотами, потребуется ещё 4 таймера настроить и 4 ISR создать.
Огород получается знатный! Есть чем заняться, когда совсем нечего делать....

Ногодрыгом можно всеми 4-мя светиками в одном ISR без всяких надуманных ШИМ-ов мигать. Элементарно. И не нужно необоснованно усложнять элементарную задачу.

Добавлено через 4 минуты
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Еще раз: задумайся, сколько тактов уходит в мусорку элементарно на вход/выход из обработчика!
Ещё раз:
Цитата Сообщение от jcxz Посмотреть сообщение
можно использовать любое уже имеющееся периодическое прерывание (подходящее по частоте)
Цитата Сообщение от jcxz Посмотреть сообщение
"моргание лампочками" лучше делать на любом периодическом прерывании. Уже существующем прерывании (не создавая новых).
Сколько раз писать??? Уже существующем прерывании (не создавая новых)
Или "чукча не читатель"?

Если прерывание уже есть, то добавление в него кода мигания добавляет ровно 0 дополнительных тактов на вход/выход.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
12.09.2025, 11:58
Цитата Сообщение от jcxz Посмотреть сообщение
И не нужно необоснованно усложнять элементарную задачу.
Вот прям в десятку.
Забавно наблюдать, как на простейший вопрос приходят "профи" и начинают: "да ты лох, делай вот так, ШИМ-ПИМ, тру-ля-ля, HAL выкидывай - это г... работай на регистрах и все такое..". И человек (ТС) сидит и не понимает что ему тут говорят и почему это надо делать так, а не вот так...

Так можно в 5-6 класс прийти, например, и сказать школьникам: к чертям теорему Пифагора, давайте я вас интегралам научу!
Думаю, эффект от этого понятен всем.

Не по теме:

А вообще, вокруг обычного мигания ногой такие баталии развели )) До чего дошел прогресс...

1
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
12.09.2025, 12:02
Цитата Сообщение от jcxz Посмотреть сообщение
с разными частотами, потребуется ещё 4 таймера настроить и 4 ISR создать.
Нет, зачем мне прерывания, если я буду просто менять яркость? Ни к чему.
А вот для управления ШД - да, нужны. И меня совершенно не смущает, что приходится использовать восемь таймеров, чтобы рулить восемью шаговиками. По-другому просто невозможно будет добиться идеально ровных тактовых импульсов. Плохо лишь, что даже у "жирных" STM32 слишком мало таймеров с "концами наружу": энкодеры уже не к чему прилепить. Поэтому для реализации шаговиков с обратной связью приходится ограничиваться тремя-четырьмя на один МК.
Цитата Сообщение от jcxz Посмотреть сообщение
Ногодрыгом можно всеми 4-мя светиками в одном ISR без всяких надуманных ШИМ-ов мигать.
С разными частотами? Тогда придется это прерывание чуть ли не десяток тысяч раз в секунду вызывать. Накладные расходы повышаются еще сильней, чем в случае использования четырех раздельных таймеров.

И этот человек будет называть меня новичком!

Цитата Сообщение от jcxz Посмотреть сообщение
Уже существующем прерывании
А если их нет? Ну нет нужды заводить таймер под какую-то другую задачу!
Ну и да, если пользоваться SysTick, то в его прерывании будет лишь одно - инкремент счетчика. А уж в суперлупе будем себе спокойно проверять время, в течение которого каждый из светодиодов горит. Получаем эдакий "софтовый таймер".

Таким образом,
Цитата Сообщение от jcxz Посмотреть сообщение
Если прерывание уже есть,
а в нем уже какой-то счетчик инкрементируется, то и нефиг в него лезть: помигать светодиодами можно просто в суперлупе.

Добавлено через 1 минуту
Цитата Сообщение от wizard41 Посмотреть сообщение
HAL выкидывай - это г.
А вот это - обязательная фраза, с которой и нужно начинать общение с любым новичком. Чтобы развивался, а не был дурнем с "ардуиной головного мозга".
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
12.09.2025, 12:13
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А вот это - обязательная фраза
В целом да, согласен. Но чисто из-за того, что пусть "попробует". HAL конечно мусор еще тот..
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
12.09.2025, 12:25
Цитата Сообщение от Eddy_Em Посмотреть сообщение
С разными частотами? Тогда придется это прерывание чуть ли не десяток тысяч раз в секунду вызывать.
А, понял! Eddy_Em видимо - муха! Или мух?
Я слышал - мухи имеют очень быстрое зрение - им даже наши фильмы представляются просто набором медленно меняющихся кадров. Да, для мухов наверное действительно нужно дёргать светодиод десятки тыс. раз в секунду.

Но у нас, человеков, зрение не настолько шустрое. Оно увы просто не увидит миганий светодиода с частотой десятки кГц! Хорошо бы хотя-бы сотые доли секунды разглядеть. И это-то не каждый осилит.

Так что все мухи - слушайтесь Eddy_Em! он(она?) ведь о вас радеет.

PS: Но мухам не понять человека. Как и человеку - мух. По разному мир видим.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2025, 12:25
Помогаю со студенческими работами здесь

Мигание светодиодом на PIC. Организация задержки
объясните пожалуйста как сформировать чередующуюся еденицу и нолик длительностью 1(2) секунды, при...

ATMega8. Управление миганием светодиода
Здравствуйте, извините за глупый вопрос решил собрать простую схему на proteus так проблема...

Мигание светодиода по переполнению счетчика
Проблема в том, что при проверке в AVRStudio, програмка не выходит из внутреннего цикла, где может...

Не видно мигания светодиода (AT89C51-24PI)
Добрый вечер всем. Возникла трабла, купил значит себе МК AT89C51-24PI, написал прошивку(на...

Мигание светодиодом на ATMega8515 (Proteus)
Доброго времени дня. Подскажите, как реализовать мигание светодиодом определенное количество раз?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru