본문 바로가기

[ATMEL]/SAMD21

[SAMD21E-S EVM] Atmel Studio에서 Delay 함수 사용하기

[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


반응형