[SAMD21E-S EVM] Atmel Studio에서 Delay 함수 사용하기
Atemel Strdio에서 딜레이 함수는 delay_ms() 함수 를 사용하면 된다.
int main(void)
{
/* Initializes MCU, drivers and middleware */
atmel_start_init();
/* Replace with your application code */
while (1)
{
gpio_toggle_pin_level(LED1);
delay_ms(500);
}
}
자동 생성 코드에 아래와 같이 생성되어 있다.
us단위의 딜레이 함수 delay_us() 함수도 사용가능하다.
void delay_init(void *const hw)
{
_delay_init(hardware = hw);
}
/**
* \brief Perform delay in us
*/
void delay_us(const uint16_t us)
{
_delay_cycles(hardware, _get_cycles_for_us(us));
}
#define F_CPU 8000000UL
#if F_CPU == 8000000UL
__attribute__ ( ( section ( ".ramfunc" ) ) ) void delay_usec ( uint32_t n )
{
__asm (
"mydelay: \n"
" sub r0, r0, #1 \n" // 1 cycle
" nop \n" // 1 cycle
" nop \n" // 1 cycle
" nop \n" // 1 cycle
" nop \n" // 1 cycle
" nop \n" // 1 cycle
" bne mydelay \n" // 2 if taken, 1 otherwise
);
}
#elif F_CPU == 48000000UL
__attribute__ ( ( section ( ".ramfunc" ) ) ) void delay_usec ( uint32_t n )
{
__asm (
"mydelay: \n"
" mov r1, #15 \n" // 1 cycle
"mydelay1: \n"
" sub r1, r1, #1 \n" // 1 cycle
" bne mydelay1 \n" // 2 if taken, 1 otherwise
" sub r0, r0, #1 \n" // 1 cycle
" bne mydelay \n" // 2 if taken, 1 otherwise
);
}
#else
#error F_CPU is not defined
#endif
반응형