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微秒延时还正常