• 6-stm32 滴答定时器(delay不带中断延时)


     实验目的:

    使用系统定时器(systick定时器)点灯

    实验代码:

     (1)延时函数

     1 //不带中断进行精确延时 
     2 
     3 //全局变量
     4 static u8  fac_us;//us级基数  --0~255
     5 static u16 fac_ms;//ms级基数  --0~65536
     6 
     7 
     8 //延时函数初始化
     9 void delay_init(void)
    10 {
    11     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//9MHz
    12     //SysTick->CTRL &= 0xfffffffb;--misc.c-199选择HCLK/8作为systick时钟
    13     
    14     fac_us =SystemCoreClock/8000000;//9
    15     fac_ms =(u16)fac_us*1000;
    16 }
    17 
    18 //us  
    19 void delay_us(u32 nus)//nus--2^24/9
    20 {
    21    u32 time;
    22      SysTick->CTRL = 0x00;            //关闭SysTick定时器
    23      SysTick->LOAD =nus*fac_us;//加载时间
    24      SysTick->VAL =0x00; //清空计数器
    25     
    26      //SysTick->CTRL |=0x01;//开定时器
    27    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//使能定时器
    28     
    29      do
    30      {
    31        time =SysTick->CTRL;
    32          
    33      }while(time&0x01 && !(time&(1<<16)));//等待时间到达
    34      
    35      SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//失能定时器
    36      SysTick->VAL =0x00;//清空计数器
    37      
    38 }
    39     
    40 //ms
    41 void delay_us(u16 nms)//nms<=2^24/9000=1864
    42 {
    43    u32 time;
    44      SysTick->CTRL = 0x00;            //关闭SysTick定时器
    45      SysTick->LOAD =(u32)nms*fac_ms;//加载时间
    46      SysTick->VAL =0x00; //清空计数器
    47     
    48      //SysTick->CTRL |=0x01;//开定时器
    49    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//使能定时器
    50     
    51      do
    52      {
    53        time =SysTick->CTRL;
    54          
    55      }while(time&0x01 && !(time&(1<<16)));//等待时间到达
    56      
    57      SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//失能定时器
    58      //SysTick->CTRL = 0x00;            //关闭SysTick定时器
    59      SysTick->VAL =0x00;//清空计数器
    60      
    61 }

     (2)main函数

    int main(void)
    {
    
         LED_INIT();
         delay_init();
    
         GPIOA->BRR |=1<<8; //点亮led  //写1 reset
         GPIOA->BSRR |=1<<8;//关闭led //写1,set
        
         GPIOD->BRR |=1<<2; //点亮led  //写1 reset
         GPIOD->BSRR |=1<<2;//关闭led //写1,set
        
        while(1)
        {
          GPIOA->ODR ^= GPIO_Pin_8;        //LED_Toggle
            GPIOD->ODR ^= GPIO_Pin_2;
            delay_ms(500);
        }
    }
  • 相关阅读:
    一步一步学Silverlight 2系列(2):基本控件
    一步一步学Silverlight 2系列(12):数据与通信之WebClient
    一步一步学Silverlight 2系列(10):使用用户控件
    非常精彩的Silverlight 2控件样式
    给GridView添加显示服务端图片的列
    C# 实体类生成工具
    多线程(三) 生产者和消费者
    C# 实现多线程的同步方法
    多线程(五) 多线程的自动管理(定时器)
    ThreadPool 线程池
  • 原文地址:https://www.cnblogs.com/darren-pty/p/13910840.html
Copyright © 2020-2023  润新知