update firmware

This commit is contained in:
Dongubak
2026-08-22 19:14:55 +09:00
parent f75318d889
commit 226b081aee
11 changed files with 887 additions and 149 deletions
+60 -2
View File
@@ -24,7 +24,7 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -45,7 +45,17 @@
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
#define LED_MASK 0x01FFu /* PC0..PC8 */
#define N_POINTS 9
#define COUNT_MIN 1
#define COUNT_MAX 15
#define TICKS_BURST 30 /* 15회 x 2틱 = 6.0 s */
#define TICKS_IDLE 10 /* 2.0 s */
#define TICKS_CYCLE (TICKS_BURST + TICKS_IDLE)
static uint16_t tick = 0;
static uint16_t cycle = 0;
static uint8_t cnt[N_POINTS]; /* 지점별 목표 블링크 횟수 */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@@ -56,7 +66,27 @@ void SystemClock_Config(void);
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* printf -> USART2 (ST-LINK VCP) */
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* 결정적 회전 패턴: 지점마다 다른 값, 사이클마다 1씩 이동 */
static void load_counts(void)
{
for (uint8_t k = 0; k < N_POINTS; k++) {
cnt[k] = (uint8_t)(((cycle + k) % COUNT_MAX) + COUNT_MIN);
}
}
static void drive(uint16_t bits)
{
/* 오픈 드레인: 0 = 점등이므로 반전. 9핀 원자적 동시 전환 */
GPIOC->BSRR = ((uint32_t)( bits & LED_MASK) << 16)
| ((uint32_t)(~bits & LED_MASK));
}
/* USER CODE END 0 */
/**
@@ -91,7 +121,9 @@ int main(void)
MX_TIM6_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
load_counts();
drive(0); /* 전 지점 소등 */
HAL_TIM_Base_Start_IT(&htim6);
/* USER CODE END 2 */
/* Infinite loop */
@@ -153,7 +185,33 @@ void SystemClock_Config(void)
}
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance != TIM6) return;
uint16_t bits = 0;
/* 버스트 구간의 짝수 틱에서만 점등.
지점 k의 j번째 블링크는 틱 2j(점등) / 2j+1(소등)을 점유 */
if (tick < TICKS_BURST && (tick & 1u) == 0u) {
for (uint8_t k = 0; k < N_POINTS; k++) {
if (tick < (uint16_t)cnt[k] * 2u) {
bits |= (uint16_t)(1u << k);
}
}
}
drive(bits);
if (++tick >= TICKS_CYCLE) {
tick = 0;
cycle++;
load_counts();
printf("CYCLE=%u G:", cycle);
for (uint8_t k = 0; k < N_POINTS; k++) printf(" %2u", cnt[k]);
printf("\r\n");
}
}
/* USER CODE END 4 */
/**