一,空循环
系统默认32MHz主频下,延时函数:
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for (i=0; i<ms; i++)
{
for (j=0; j<8000; j++)
{
__asm__("nop");
}
}
}
二,TI工程自带延时
//工程中的主频默认是32MHz,如果有修改请使用修改后的主频
delay_cycles(32000000); //1s
delay_cycles(32000000 / 1000); //1ms
delay_cycles(32000000 / 1000000); //1us
//ms级延时
void delay_ms(unsigned int ms)
{
delay_cycles(ms * (CPUCLK_FREQ / 1000));
}
//us级延时
void delay_us(unsigned int us)
{
delay_cycles(us * (CPUCLK_FREQ / 1000000));
}
三,SysTick自带滴答定时器
介绍:SysTick定时器可用作标准的下行计数器,是一个24位向下计数器,有自动重新装载能力,可屏蔽系统中断发生器。
1,在选项卡(SYSTICK):Period : 32000(1.00ms),中断等级:Level 0-Highest (最高),勾选自动开启滴答定时器
2,入口函数:SysTick_Handler 滴答定时器中断函数
在嵌入式编程中,当共享变量被中断服务程序(ISR)和主循环同时访问时,必须使用 volatile 关键字声明该变量。否则,编译器可能优化掉对变量的读取,导致主循环无法看到中断中更新的值!!
volatile unsigned int myTick = 0;
void SysTick_Handler(void)
{
myTick++;
}
3,非阻塞定时调用函数:
unsigned int led_time=0;
void LED_Display()
{
if(myTick-led_time<200) return;
led_time = myTick;
DL_GPIO_togglePins(LED_PORT, LED_PIN_22_PIN);
}