当前位置:首页 > > 21ic电子网
[导读] 在常规的例程中,都少不了测试I/O控制作用的点亮LED的程序。


出品 21ic论坛  jinglixixi

网站:bbs.21ic.com


在常规的例程中,都少不了测试I/O控制作用的点亮LED的程序。而伴随该例程出现的往往少不了延时函数,利用此类延时函数则可以达到相对精准的时基性的延时效果,如毫秒级及微秒级的函数。缺少了此类延时函数,则只能通过定时器来编程解决了。在LPC54114的官方例程中,也有点亮LED的程序,但该例程却没有提供此类的时基性的延时函数。那它是如何来获得延时效果的呢?
其例程的主程序如下: int main(void) { int loop = 1; /* Used to fix the unreachable statementwarning */ SystemCoreClockUpdate(); Board_Init(); Board_IO_Init(); Board_LED_RGB_Off(); /* EnableSysTick Timer */ SysTick_Config(SystemCoreClock/ TICKRATE_HZ); while (loop){ __WFI(); } return 0; }
由此可以推断,它是提供嘀嗒计时器来控制延时效果的。
那嘀嗒计时器又是如何来控制LED的呢?
从下面的中断处理函数即可看出结果: void SysTick_Handler(void) { tick_ct += 1; /* bump tickcount */ if ((tick_ct% 10) == 0) { /* if one second has elapsed (10 ticks) */ tick_ct =0; LED_ct+= 1; /* bumpthe LED count */ Board_LED_RGB_Set(LED_ct& 0x07); /* display the new LED value */ } }
原来它是依靠嘀嗒计时器来产生标准的时基信号,然后再通过程序设计了一个软件计时器来控制延时长短,并以此来切换RGB_LED的显示状态。
在了解了这些之后,我们能否据此来为LPC54114的例程来添加毫秒级及微秒级的延时函数呢?
答案自然是可以的,那又该这样实现呢?
为了便于理解我们先看一下如下的程序: voidSysTick_Handler(void) { tick_ct += 1; if ((tick_ct % M) == 0) { tick_ct = 0; LED_ct += 1; F=(F+1)%2; } }
通过增添延时标识变量F,即可判别延时是否完成,然后在主程序中即可实现延时控制的作用,而修改M的数值即可到达改变延时长短的作用。 while (1) { if(F)   LED_R_Set(); else   LED_R_Clr(); __WFI(); } 为了符合我们调用延时函数的习惯,可以将其变换为如下的形式: voidSysTick_Handler(void) { tick_ct += 1; if ((tick_ct % M) == 0) { tick_ct = 0; LED_ct += 1; F=1; } }
void delay_ns(uint16_t n) { M=n; F=0; while(!F) { __WFI(); } }
这样我们就可以在主程序中,自由地使用延时函数了。 while (1) { delay_ns(2); LED_R_Set(); delay_ns(2); LED_R_Clr(); }

基于LPC54114的延时函数设计及应用
图1 上电状态(点亮电源指示灯)
基于LPC54114的延时函数设计及应用
图2 嘀嗒计时器控制LED闪烁
基于LPC54114的延时函数设计及应用
图3 延时函数用于RGB_LED控制


以此为基础,若将中断处理函数改为: void SysTick_Handler(void) { tick_ct += 1; if ((tick_ct % TICKRATE) == 0) { tick_ct = 0; LED_ct++; if(LED_ct>=M) { LED_ct=0; F=1; } } }
则可以达到3个等级的延时函数: void delay_ns(uint16_t n) {       //  秒级延时 M=n; TICKRATE=1000000; TICKRATE_HZ=1000000; F=0; while(!F) { __WFI(); }
}
void delay_nms(uint16_t n) {       //  毫秒级延时 M=n; TICKRATE=1000;s TICKRATE_HZ=1000000; F=0; while(!F) { __WFI(); } }
void delay_nus(uint32_t n) {        //  微秒级延时 M=n; TICKRATE=1; TICKRATE_HZ=1000000; F=0; while(!F) { __WFI(); } }
有了这些延时函数后,除了解决延时问题,我们还能做些什么呢?
在数字式的传感器驱动中,对顺序的要求比较高,因此就需要有比较基准的延时函数来配合,如单总线的DS18B20、DHT11/DHT22等,以及I2C和SPI接口的外设也需要延时函数的配合来驱动,故延时函数的作用还是非常重要的。
例如在驱动OLED屏的辅助函数中,是通过调用延时函数来保持信号作用时间的。
void IIC_Start() { OLED_SCLK_Set(); delay_nus(2); OLED_SDIN_Set(); delay_nus(2); OLED_SDIN_Clr(); delay_nus(2); OLED_SCLK_Clr(); delay_nus(2); }


基于LPC54114的延时函数设计及应用

图4 延时函数用于OLED屏显示


此外,该延时函数还适用于LPC54110等开发板。当然,也可将它移植到具有嘀嗒计时器又缺少基准延时函数的地方。



本文系21ic论坛网友jinglixixi原创

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

21ic电子网

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭