#include "delay.h" /** * 함수명: delay * 목적: 단순 루프를 이용한 지연(delay) 함수 * * 매개변수: * - d : 지연 카운트 값. 값이 클수록 지연 시간이 길어짐 * * 동작 방식: * - while(d--) 루프를 반복하면서 CPU를 바쁘게 사용 * - 외부 타이머나 정확한 시간 기준은 없음 * - 단순히 CPU 사이클을 소비하여 지연 발생 * * 주의사항: * - CPU 클럭에 따라 지연 시간이 달라짐 * - 정밀한 시간 지연이 필요하면 하드웨어 타이머 사용 권장 */ void delay(long d){ while(d--); } /** * 함수명: delay_us * 목적: 마이크로초(us) 단위의 지연(delay) 함수 * * 매개변수: * - us : 지연 시간 (마이크로초 단위) * * 동작 방식: * 1. 입력된 us 값에 따라 반복 횟수 count 계산 * - us <= 150 : count = (us * 100 + 50) / 100 * - us > 150 : count = (us * 106 + 50) / 100 * - 소수점 올림 효과를 위해 +50 추가 * 2. for 루프를 count만큼 반복하면서 __nop() 수행 * - __nop()는 "No Operation" 명령어로, CPU 사이클만 소비 * 3. 루프 종료 후 지정된 시간만큼 지연 * * 주의사항: * - CPU 클럭 속도에 따라 실제 지연 시간은 달라질 수 있음 * - 매우 정밀한 시간 지연이 필요하면 타이머 기반 지연 권장 */ void delay_us(volatile uint32_t us) { volatile uint32_t i; volatile uint32_t count; if (us <= 150) { count = (us * 100 + 50) / 100; // 소수점 올림 효과를 위해 +50 추가 } else { count = (us * 106 + 50) / 100; } for (i = 0; i < count; i++) { __nop(); } } /** * 함수명: delay_ms * 목적: 밀리초(ms) 단위의 지연(delay) 함수 * * 매개변수: * - ms : 지연 시간 (밀리초 단위) * * 동작 방식: * 1. 외부 for 루프(i)는 ms만큼 반복 * 2. 내부 for 루프(j)는 0~799까지 반복 * - 내부 루프 반복 횟수 800은 CPU 클럭 속도에 따라 조정 필요 * - 반복 동안 아무 작업도 하지 않고 CPU 사이클 소모 * 3. 두 루프가 모두 끝나면 지정된 시간만큼 대략 지연 완료 * * 주의사항: * - 정확한 시간 지연은 보장되지 않음 (CPU 클럭, 최적화 레벨 등 영향) * - 매우 정밀한 지연이 필요하면 타이머 기반 지연 권장 * - delay_ms와 delay_us를 혼합해 사용할 수 있음 */ void delay_ms(unsigned int ms) { volatile unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 800; j++); // 내부 루프 조정 필요 (클럭에 따라 조정) }