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微秒延时还正常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?