zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    oracle数据库连接不上
    Oracle的regexp_instr函数简单用法
    Oracle中dbms_random.string 的用法
    oracle 简单输出语句与赋值
    oracle中sequence(自增序号)的用法
    oracle 函数的返回值与out参数
    SQL%ROWCOUNT作用
    100多个基础常用JS函数和语法集合大全
    题解【AcWing272】最长公共上升子序列
    题解【POJ1062】昂贵的聘礼
  • 原文地址:https://www.cnblogs.com/darren-pty/p/13910840.html
Copyright © 2011-2022 走看看