单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。
1.普通延时法
(1)普通延时法1
这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。
//粗延时函数,微秒
void delay_us(u16 time)
{
u16 i=0;
while(time--)
{
i=10; //自己定义
while(i--) ;
}
}
//毫秒级的延时
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000; //自己定义
while(i--) ;
}
}
(2)普通延时法2
void delay(u16 num)
{
u16 i,j;
for(i=0;i for(j=0;j<0x800;j++); } 2.SysTick 定时器延时 CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。 这里面也有两种方式实现: (1)中断方式 如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。 volatile unsigned long time_delay; // 延时时间,注意定义为全局变量 //延时n_ms void delay_ms(volatile unsigned long nms) { //SYSTICK分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency/1000)) { while (1); } time_delay=nms;//读取定时时间 while(time_delay); SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } //延时nus void delay_us(volatile unsigned long nus) { //SYSTICK分频--1us的系统时钟中断 if (SysTick_Config(SystemFrequency/1000000)) { while (1); } time_delay=nus;//读取定时时间 while(time_delay); SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } //在中断中将time_delay递减。实现延时 void SysTick_Handler(void) { if(time_delay) time_delay--; } (2)非中断方式 主要仿照原子的《STM32不完全手册》。SYSTICK 的时钟固定为HCLK 时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器。 CTRL: SysTick控制和状态寄存器 LOAD: SysTick重装载值寄存器 VAL: SysTick当前值寄存器 CALIB:SysTick校准值寄存器 对这几个寄存器的操作被封装到core_cm3.h中: SysTick->CTRL 位段 名称 类型 复位值 描述 16 COUNTFLAG R 0 如果在上次读本寄存器后systick已为0,则该位为1,若 读该位自动清零 2 CLKSOURCE RW 0 0:外部时钟源 1:内部时钟 1 TICKINT RW 0 0:减到0无动作;1:减到0产生systick异常请求 0 ENABLE RW 0 systick定时器使能位 SysTick-> LOAD 位段 名称 类型 复位值 描述 23:0 RELOAD RW 0 减到0时被重新装载的值 SysTick-> VAL 位段 名称 类型 复位值 描述 23:0 CURRENT RW 0 读取时返回当前倒计数的值,写则清零,同时还会清除在systick控制及状态寄存器中的COUNTFLAG标志 SysTick-> CALIB 不常用,在这里我们也用不到,故不介绍了。 程序如下,相当于查询法。 //仿原子延时,不进入systic中断 void delay_us(u32 nus) { u32 temp; SysTick->LOAD = 9*nus; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD = 9000*nms; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } 三种方式各有利弊,第一种方式容易理解,但不太精准。第二种方式采用库函数,编写简单,由于中断的存在,不利于在其他中断中调用此延时函数。第三种方式直接操作寄存器,看起来比较繁琐,其实也不难,同时克服了以上两种方式的缺点,个人感觉比较好用。
上一篇:STM32F030控制蜂鸣器
下一篇:STM32外部中断与各通道对应关系
推荐阅读
史海拾趣
由于篇幅限制,我无法直接为您提供5个完整的、每篇至少500字的Enovation Controls LLC公司发展起来的相关故事。但我可以概述5个关键事件或阶段,这些事件对于Enovation Controls LLC公司的发展起到了重要作用。
- EControls的成立与专长
Enovation Controls LLC的前身可以追溯到1994年成立的EControls公司。由Kennon Guglielmo博士创立,EControls专注于为发动机和车辆行业的OEM提供完整的发动机控制解决方案的设计、工程和生产。凭借其在发动机控制领域的专业技术和经验,EControls逐渐在行业中树立了领先地位。
- EControls与FW Murphy的合并
2009年,EControls与FW Murphy合并,成立了Enovation Controls LLC。FW Murphy是一家历史悠久的公司,由Frank W. "Pat" Murphy于1939年创立,专注于发动机仪表和保护的创新。这次合并将EControls的发动机控制技术与FW Murphy的仪器和显示功能相结合,为客户提供了更为全面和先进的发动机控制、保护和监控解决方案。
- 创新传统的建立
Enovation Controls继承了FW Murphy的开拓精神和对简单、可靠发动机保护的追求。公司拥有一支由300多名员工组成的多元化国际团队,他们通过全球销售、制造和应用工程业务为世界各地的客户提供服务。这种全球化的布局和多元化的团队为Enovation Controls的创新和发展提供了强大的支持。
- 业务部门的拓展
合并后,Enovation Controls经营着四个业务部门:动力控制、车辆技术、天然气生产控制和燃料系统。这些业务部门覆盖了广泛的行业和应用领域,包括离路车辆、娱乐和商业船只、农业和水泵、发电、工业和移动设备等。通过不断拓展业务领域和深化技术应用,Enovation Controls在电子行业中建立了稳固的地位。
- 新产品的推出与市场反响
Enovation Controls不断推出新产品和技术创新,以满足客户不断变化的需求。例如,在2016年推出的TEC-10控制器就是一款为工业需求量身定制的控制器。这款控制器具有强大的功能和灵活性,适用于各种应用场景。由于其出色的性能和易用性,TEC-10控制器在市场上获得了广泛的好评和认可。
这些事件和阶段共同构成了Enovation Controls LLC公司发展起来的重要历程。通过不断创新、拓展业务领域和推出新产品,Enovation Controls在电子行业中取得了显著的成就和地位。
ACCRETECH是一家日本的半导体设备制造公司,以下是该公司发展的五个相关故事:
公司成立和早期发展: ACCRETECH(前身为TOKYO SEIMITSU)成立于1949年,总部位于日本东京。最初,公司主要从事机械零件的生产,随着时代的发展,逐渐转型为半导体设备制造商。起初,ACCRETECH主要生产晶圆表面检测设备和测量设备。
技术创新和产品拓展: 随着半导体行业的快速发展,ACCRETECH不断进行技术创新,并逐步拓展产品线。公司推出了包括晶圆尺寸测量仪、晶圆表面检测仪、晶圆平整度检测仪等在内的多种半导体生产设备,满足了客户对高精度、高效率设备的需求。
市场扩张和国际合作: ACCRETECH积极拓展国内外市场,并与全球各地的客户建立了合作关系。公司的产品被广泛应用于半导体制造、集成电路测试、电子元件生产等领域,赢得了客户的信赖。ACCRETECH还与国际知名半导体企业展开合作,共同推动技术进步和产业发展。
持续投入研发和创新: ACCRETECH不断加大研发投入,致力于技术创新和产品升级。公司设立了专门的研究机构和实验室,拥有一支技术精湛的团队,致力于开发新产品和解决方案,满足客户不断提高的需求。
未来发展展望: ACCRETECH将继续致力于半导体设备制造领域的研发和应用,不断推出更先进、更可靠的产品和解决方案,满足客户在半导体生产过程中的需求。公司将加强国际市场拓展,提升自身在全球市场的竞争力,为行业的发展做出更大的贡献。
Delock公司自创立之初,就致力于电子连接技术的研发。公司创始人李先生敏锐地洞察到市场对高性能、稳定可靠的电子连接设备的需求,于是带领团队投入大量资源进行技术研发。经过数年的努力,Delock公司成功开发出一种具有革命性意义的电子连接器,不仅传输速度快,而且耐用性高,迅速在市场上获得了认可。这一创新不仅为Delock公司带来了可观的利润,也为公司在电子行业树立了技术领先的形象。
面对全球经济波动和行业竞争加剧的挑战,Heimann Optoelectronics Gmbh果断实施转型升级战略。公司加大在物联网、人工智能等新兴技术领域的研发投入,成功开发出了一系列智能光电传感器和解决方案。这些产品能够实时监测环境变化、智能控制设备运行,为智慧城市、智能家居等领域提供了强有力的支持。通过转型升级,公司不仅巩固了传统市场的领先地位,还成功开拓了新的增长点。
随着无线通信技术的快速发展,Antenna Factor公司始终保持敏锐的洞察力,不断推出创新产品。他们研发的智能天线系统,能够根据信号环境的变化自动调整参数,显著提高通信质量和稳定性。这一技术创新在市场上引起了广泛的关注,使得Antenna Factor公司在行业中树立了技术领先的形象。
随着5G技术的快速发展,磁联达(CND-tek)公司意识到无线充电技术将成为未来的重要趋势。公司投入大量资源进行无线充电发射线圈的研发,经过多次试验和改进,终于成功推出了一款性能稳定、效率高的无线充电产品。这一创新不仅为公司带来了丰厚的利润,也进一步巩固了公司在行业内的领先地位。
就是布线时,Place-Line工具应该自动根据说连接的Pad的net来分配这跟Line的Net 但是我画出来的线的Net属性均为空。应该怎么设置? [ 本帖最后由 hamiltoncai 于 2009-1-6 09:54 编辑 ]… 查看全部问答∨ |
|
现在手里有两个并口JTAG仿真器.一个是不隔离的, 一个是隔离式的. 已经在Bios里把LPT模式选为EPP/ECP模式. 现在我的目标板电源为3.3V, 并口JTAG2.6V. 我想加上两路电源在线仿真, 结果老是出错. 因为只用JTAG2.6V电源, 目标板的AD模块基准电压385为 ...… 查看全部问答∨ |
|
什么是伺服系统?它的科学的定义有两个。一是实现输出变量精确地跟随或复现输入变量的控制系统;二是包含功率放大和反馈,使得输出变量的值紧密地响应输入量值的一种自动控制系统。我们来举个例子来进一步说明:伺服电动机、机械减速或耦合机构、 ...… 查看全部问答∨ |
|
利用ADXL345三轴加速度传感器设计的一种可以检测运动物体瞬时的加速度可应用于检测运动物体的运动加速度; 基于MSP430的软件设计的IIC的一种数字式的加速度传感器可以很好的利用在检测物体的。 下面是我对ADXL345做的一些应用笔记,希望对大家有 ...… 查看全部问答∨ |
DLP这个名词是早就听说来,现在火热的微投里面基本都是这个,但是具体的技术细节还是这次听在线课堂听到。看到里面的一面面小镜子,不由想起当年的研究生面试,正是说到来这种mems的显示技术,为什么亮度不好。当时拍拍脑袋说镜子翻转的时候各个像 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 【已结束】力源直播【安森美 25KW 充电桩模块方案】(9:30入场)
- 万用表:越拆越开心,越评越精彩!
- 有奖直播:AC/DC 在 ATX 及 Server 电源解決方案及应用 报名开始啦!
- 下载有礼|电路设计的参考书《ADI 参考电路合集 (第4册) 》
- TI模电选课测试体验活动第二期!模电怎么学?TI帮你订制课程清单~
- 你们想要的XMC4800 Relax EtherCAT Kit来了,速度来申请!
- TI DLP知识有奖快问快答排位赛
- 免费申请测评:超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板)
- 【EEWORLD第二十五届】2011年04月社区明星人物揭晓!