потерял функцию millisecond подписал комментарии к функциям

This commit is contained in:
andrey 2025-08-22 18:32:37 +03:00
parent a7d6faca8b
commit b9db537db1

View File

@ -414,24 +414,174 @@ void SystemClock_Config(void)
/* USER CODE BEGIN 4 */
//////////////// USER FUNC ////////////////////
/**
* @brief Проверяет, активен ли указанный элемент для обработки в CAN-шине
* @param num Номер элемента (0x00-0x7F)
* @param i Номер CAN-канала (0 или 1)
* @param z Флаг дополнительных проверок (1 - включить доп. проверки, 0 - только маска)
* @return 1 - элемент активен, 0 - элемент не активен
*/
int Isit(int num, int i, int z)
{
int res, pls;
if((num<0)||(num>=0x80)) return 0;
res = Maska[i][num/0x10];
res &= (1<<(num&0x0F));
//=== ПРОВЕРКА ДИАПАЗОНА ===//
// Если номер элемента вне допустимого диапазона (0x00-0x7F)
if((num < 0) || (num >= 0x80))
return 0; // Элемент не активен
//=== ПРОВЕРКА МАСКИ КАНАЛА ===//
// Определяем битовую маску для данного элемента
// num/0x10 - определяем индекс в массиве масок (0-7)
// num&0x0F - определяем позицию бита в слове (0-15)
res = Maska[i][num / 0x10]; // Получаем маску для группы элементов
res &= (1 << (num & 0x0F)); // Проверяем конкретный бит в маске
//=== ДОПОЛНИТЕЛЬНЫЕ ПРОВЕРКИ (если z != 0) ===//
if(z)
{
pls = (espero[num]>CanRestart[i]/2);
// Проверка времени ожидания: если превышена половина времени перезапуска
pls = (espero[num] > CanRestart[i] / 2);
// ИЛИ проверка счетчика отправки (если county[num] != 0)
pls = pls || county[num];
// Комбинированная проверка: должен быть установлен в маске И выполнять условия
res = res && pls;
}
return res;
return res; // Возвращаем результат проверки
}
/**
* @brief Функция обработки милисекундных событий системы
* @note Вызывается каждую миллисекунду из SysTick_Handler
*/
void Millisecond()
{
// Статические переменные для хранения состояния между вызовами
static int CanPowse; // Счетчик для управления CAN-шиной
static unsigned int count_blink = 0, // Счетчик для мигания
count_bright = 0, // Счетчик для управления яркостью
count_mode, // Счетчик режимов мигания
blink_over, // Флаг переключения состояния мигания
blink_alarm, // Флаг мигания аварии
power_lamp, // Состояние силовой лампы
work_diod, // Состояние рабочего светодиода
norm_diod; // Состояние нормального светодиода
static int preTest; // Предыдущее состояние теста
int TST; // Текущее состояние теста
// Константы времени
#define CANPOWSE 10 // 10 msec - период обновления CAN
#define BLINK_TIME 250 // 0.25 sec - период мигания
//=== ОБНОВЛЕНИЕ WATCHDOG ===//
if(!cReset)
IWDG->KR = 0xAAAA; // Сброс watchdog таймера
//=== ПРОВЕРКА АКТИВНОСТИ ТАЙМЕРА ===//
if(!timGo) return; // Если таймер не активен - выход
//=== ЧТЕНИЕ ПЕРЕКЛЮЧАТЕЛЕЙ И КНОПОК ===//
Jumpers.byt.byte_1 = ReadJumpers(); // Чтение состояния переключателей
Jumpers.bit.bit0 = Buttons.bit.bit0 = TestJumper(); // Чтение состояния кнопки
//=== УПРАВЛЕНИЕ CAN-ШИНОЙ ===//
if(++CanPowse >= CANPOWSE)
{
CanPowse = 0; // Сброс счетчика
CanGO = 1; // Установка флага разрешения работы CAN
}
//=== УПРАВЛЕНИЕ РЕЖИМОМ "ЗАСЫПАНИЯ" ===//
if(Alarms.bit.bit8) // Разряд батареи
{
if (Falling_asleep) Falling_asleep--; // Уменьшение времени до "сна"
}
else
Falling_asleep = 1000L * Sleep_time; // Установка времени до "сна"
//=== ОБРАБОТКА ТЕСТОВОГО РЕЖИМА ===//
TST = TestJumper() | cTestLamp; // Текущее состояние теста (кнопка или команда)
if(TST & !preTest) // Обнаружение фронта нажатия кнопки
{
count_blink = BLINK_TIME; // Сброс счетчика мигания
count_mode = 0; // Сброс счетчика режимов
}
preTest = TST; // Сохранение состояния для следующего вызова
//=== УПРАВЛЕНИЕ МИГАНИЕМ ИНДИКАТОРОВ ===//
if(++count_blink >= BLINK_TIME)
{
count_blink = 0; // Сброс счетчика
count_mode++; // Переключение режима
blink_over = (count_mode & 1) ? 1 : 0; // Мигание 1:1 (50%)
blink_alarm = (count_mode & 7) ? 1 : 0; // Мигание 1:7 (12.5%)
}
//=== УСТАНОВКА СТАНДАРТНЫХ СОСТОЯНИЙ ИНДИКАТОРОВ ===//
power_lamp = 1; // Силовая лампа включена
norm_diod = 1; // Нормальный светодиод включен
work_diod = !blink_over; // Рабочий светодиод синхронизирован с миганием
//=== РЕЖИМ ТЕСТИРОВАНИЯ ===//
if(TST)
{
power_lamp = blink_over; // Мигание силовой лампы
norm_diod = blink_over; // Мигание нормального светодиода
work_diod = blink_over; // Мигание рабочего светодиода
}
//=== РЕЖИМ ОСВЕЩЕНИЯ ===//
else if(Lightness)
{
power_lamp = norm_diod = 0; // Базовое состояние - выключено
// Уровень освещенности 2: постоянно включено
if(Lightness == 2) power_lamp = norm_diod = 1;
// Уровень освещенности 3: медленное мигание (50%)
if(Lightness == 3) power_lamp = norm_diod = blink_over;
// Уровень освещенности 4: быстрое мигание (12.5%)
if(Lightness == 4) power_lamp = norm_diod = blink_alarm;
// Уровень освещенности 5: инверсное быстрое мигание (87.5%)
if(Lightness == 5) power_lamp = norm_diod = !blink_alarm;
}
//=== РЕЖИМ ОШИБОК ===//
else if(Errors.all)
{
power_lamp = blink_over; // Мигание при ошибках
norm_diod = blink_over; // Мигание при ошибках
}
//=== РЕЖИМ ТРЕВОГ ===//
else if(Alarms.all)
{
power_lamp = blink_alarm; // Быстрое мигание при тревогах
norm_diod = blink_alarm; // Быстрое мигание при тревогах
}
//=== ШИМ УПРАВЛЕНИЕ ЯРКОСТЬЮ СИЛОВОЙ ЛАМПЫ ===//
if(++count_bright == 10) // maximum_bright (100%)
{
count_bright = 0;
if(power_lamp) Pvt1_ON; // Включение на полную яркость
else Pvt1_OFF; // Выключение
}
//=== УПРАВЛЕНИЕ ЯРКОСТЬЮ ===//
if(count_bright == Brightness)
if(!TST) Pvt1_OFF; // Отключение лампочки с регулировкой яркости
//=== УПРАВЛЕНИЕ СВЕТОДИОДАМИ ===//
if(work_diod) LED_2_ON; // Включение рабочего светодиода
else LED_2_OFF; // Выключение рабочего светодиода
if(norm_diod) LED_3_ON; // Включение нормального светодиода
else LED_3_OFF; // Выключение нормального светодиода
}
/////////////////////////////////////////////
@ -455,7 +605,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
Millisecond();
/* USER CODE END Callback 1 */
}