stm32延时函数delay
delay.h #ifndef __DELAY_H #define __DELAY_H #include "stm32f4xx.h" void Delay_Init(void); void delay_us(int nus); void delay_ms(int nms); void delay_s(int ns); #endif delay.c #include "delay.h" int my_us = 21; //在21MHZ下,计21个数,用1us int my_ms = 21000; //在21MHZ下,计21000个数,用1ms void Delay_Init(void) { //配置Systick定时器时钟 HCLK/8 = 168MHZ/8 = 21MHZ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); } //nus取值范围:1~798915 void delay_us(int nus) { u32 temp = 0x00; //设置重装载值寄存器 SysTick->LOAD = my_us*nus - 1; //设置当前值寄存器值为0 SysTick->VAL = 0x00; //开启定时器,让定时器开始计数,定时器一旦使能,重装载值寄存器的值则直接放置到当前值寄存器 SysTick->CTRL |= (0x01<<0); //系统自动计数 do { temp = SysTick->CTRL; // 判断定时器是否使能 判断第16位是否为1(计数器计数到0) }while( (temp & (0x01<<0)) && (!(temp&(0x01<<16))) ); //关闭定时器 SysTick->CTRL &= ~(0x01<<0); } //nms取值范围:1~798 void delay_ms(int nms) { u32 temp = 0x00; //设置重装载值寄存器 SysTick->LOAD = my_ms*nms - 1; //设置当前值寄存器值为0 SysTick->VAL = 0x00; //开启定时器,让定时器开始计数,定时器一旦使能,重装载值寄存器的值则直接放置到当前值寄存器 SysTick->CTRL |= (0x01<<0); //系统自动计数 do { temp = SysTick->CTRL; // 判断定时器是否使能 判断第16位是否为1(计数器计数到0) }while( (temp & (0x01<<0)) && (!(temp&(0x01<<16))) ); //关闭定时器 SysTick->CTRL &= ~(0x01<<0); } void delay_s(int ns) { int i; for(i=0; i<ns; i++) { delay_ms(500); delay_ms(500); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库