wenbo2005.online

学习记录 / 基础 TxT 篇

三种延时函数

基础 TxT 篇2025-05-04

一,空循环

系统默认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);
}