STM32의 1cycle은 과연 1/주파수(frequency) = 주기(period)가 맞을까?
어떻게 측정을 할까? 실제로 1cycle이 몇초인지 측정해 보았다.(STM32F103C8으로 테스트)
1. BIT Toggle 시간 측정
while (1)
{
GPIOB->ODR |= GPIO_PIN_12;
GPIOB->ODR &= ~GPIO_PIN_12;
}

- duty가 50%가 안나온다. while()로 돌렸지만, for문과 같다고 봐야 한다.
(PORT를 low로 만들고 while문 나와서 다시 들어가는데 시간이 걸린다는 뜻)
- high일때의 시간은 124.7332ns
2. BIT Toggle + 1cycle 명령어(SHIFT) 추가 하여 시간 측정
while (1)
{
GPIOB->ODR |= GPIO_PIN_12;
delay_count << 1;
GPIOB->ODR &= ~GPIO_PIN_12;
delay_count << 1;
}

- high일때의 시간은 138.4076ns
- 위와 같이 했는데 1번과 시간이 같다면 컴파일러가 최적화 시키면서 지운것이므로 delay_count에 volatile 붙일 것
- asm 코드를 봐야 하지만 디버거를 붙이지 않아서 확인 하지 못함
2번 high 시간 - 1번 high 시간 = 1cycle time = 1/주파수 = 주기
|
138.4076 - 124.7332 = 13.6744ns ≒ 1 / 72MHz = 13.89ns
|
PORT Toggle에 생각보다 많은 시간이 걸린다.
작업하던 project에서 테스트 코드만 넣어서 측정했더니 위와 같이 시간이 나온다.
3. BIT 제어 레지스터 + 1cycle 명령어(SHIFT) 추가 하여 시간 측정
while (1)
{
GPIOB->BSRR = GPIO_PIN_12;
delay_count << 1;
GPIOB->BRR = GPIO_PIN_12;
delay_count << 1;
}

- high일때의 시간은 82.8843ns
'ST > STM32F103C8' 카테고리의 다른 글
STM32F103C8 - RAM 48KB + bonus? (0) | 2025.08.08 |
---|---|
STM32F103C8 - LL driver + ADC + DMA (0) | 2025.08.08 |
STM32F103C8 - I2C HAL driver 오류 (0) | 2025.08.08 |
STM32F103C8 - ADC(DMA interrupt) (1) | 2025.08.08 |
STM32F103C8 - I2C(EEPROM) (1) | 2025.08.08 |