nawu 发表于 2023-3-30 17:00

systick定时器做延时测试

一、systick时钟框图



二、程序

2.1、初始化

void delay_init()
{
    fac_us=CLOCK_SYS_FREQ/8000000;               
    fac_ms=(uint16_t)fac_us*1000;                     
}


2.2、延时函数

void delay_us(uint32_t nus)
{      
    uint32_t temp;            
    SysTick->LOAD=nus*fac_us;                              
    SysTick->VAL=0x00;                           
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;   
    do
    {
      temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));         
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;   
    SysTick->VAL =0X00;                           
}

void delay_ms(uint16_t nms)
{                     
    uint32_t temp;         
    SysTick->LOAD=(uint32_t)nms*fac_ms;               
    SysTick->VAL =0x00;                           
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;   
    do
    {
      temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));         
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;   
    SysTick->VAL =0X00;                                    
}


2.3、主程序

int main(void)
{
      BOARD_Init();
      delay_init();
      init_led();
      init_key();
      printf("\r\nled test.\r\n");

      while(1)
      {               
                GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 1u);
                delay_ms(1);
                GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 0u);
                delay_ms(1);

      }
}

三、程序测试

LED4指示灯电平输出,1ms间隔翻转。
输出电平波形:


————————————————
版权声明:本文为CSDN博主「极术社区」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47569031/article/details/127403846

jackcat 发表于 2023-4-13 20:29

利用systick来延时,这阻塞了CPU吗?

cashrwood 发表于 2023-4-13 20:49

systick 延时时间怎么计算的?

ccook11 发表于 2023-4-13 21:13

延时的时间是怎么计算的               

i1mcu 发表于 2023-4-13 21:24

怎么实现Systick做一秒钟延时不占用CPU

vivilyly 发表于 2023-4-13 21:31

stm32延时如何不影响其他程序

tifmill 发表于 2023-4-13 22:24

用定时器设置延迟函数吧               
页: [1]
查看完整版本: systick定时器做延时测试