You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.6 KiB
86 lines
2.6 KiB
#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++); // 내부 루프 조정 필요 (클럭에 따라 조정)
|
|
}
|