stm32f103zet红牛开发板STMcubeMX hal库版:03旺宝-红牛-蜂鸣器 SysTick

程序运行后,蜂鸣器发出类似报警声

.蜂鸣器在   pb2上接着。这是一个无源蜂鸣器。不是给电就响。得给一定频率的信号才行。这里用定时器跟gpio生成一定频率的方波。

 

 

HAL_Delay(uint32_t Delay)   函数默认就是使用毫秒ms做单位。这里要实现一个用us微秒的延时函数。这是从arduino里抄来的。
static inline void delayMicroseconds(uint32_t us)
{

  __IO uint32_t currentTicks = SysTick->VAL;
  /* Number of ticks per millisecond */
  const uint32_t tickPerMs = SysTick->LOAD + 1;
  /* Number of ticks to count */
  const uint32_t nbTicks = ((us - ((us > 0) ? 1 : 0)) * tickPerMs) / 1000;
  /* Number of elapsed ticks */
  uint32_t elapsedTicks = 0;
  __IO uint32_t oldTicks = currentTicks;
  do {
    currentTicks = SysTick->VAL;
    elapsedTicks += (oldTicks < currentTicks) ? tickPerMs + oldTicks - currentTicks :
                    oldTicks - currentTicks;
    oldTicks = currentTicks;
  } while (nbTicks > elapsedTicks);
}

 从标准库里抄来的  因为是寄存器操作,反而可以直接照搬

void Delay_us(uint32_t nus)
{        
    uint32_t temp;             
    SysTick->LOAD=nus*9;                             //时间加载 fac_us=9,走9次就是1us              
    SysTick->VAL=0x00;                                    //清空计数器 
    SysTick->CTRL=0x01 ;                                  //开始倒数  
    do
    {
        temp=SysTick->CTRL;
    }
    while(temp&0x01&&!(temp&(1<<16)));                     //等待时间到达  
    SysTick->CTRL=0x00;                                    //关闭计数器
    SysTick->VAL =0x00;                                    //清空计数器    
}

hai库的写法 

// HAL_RCC_GetHCLKFreq()/1000 1ms 中断一次,即 HAL_Delay 函数延时基准为 1ms
23 // HAL_RCC_GetHCLKFreq()/100000 10us 中断一次,即 HAL_Delay 函数延时基准为 10us
24 // HAL_RCC_GetHCLKFreq()/1000000 1us 中断一次,即 HAL_Delay 函数延时基准为 1us
25 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000); // 配置并启动系统滴答定时器
26 /* 系统滴答定时器时钟源 */
27 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
28 /* 系统滴答定时器中断优先级配置 */
29 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

 

 三种写法都可以。但是1微秒的定时啥也干不了。中断的时间都不止1.用10微秒延时还正常

posted @ 2022-09-05 01:34  kyo413  阅读(139)  评论(0编辑  收藏  举报