update firmware
This commit is contained in:
+60
-2
@@ -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 */
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user