当前位置:首页 > 公众号精选 > 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(); }


图1 上电状态(点亮电源指示灯)

图2 嘀嗒计时器控制LED闪烁

图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); }


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


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



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

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

21ic电子网

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

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

LED驱动模块RSC6218A 5W-18W迷你高效驱动电源应用,小功率、小体积、高效率

关键字: LED驱动模块 驱动电源应用 LED电源芯片

业内消息,近日台积电在北美技术研讨会上宣布,正在研发 CoWoS 封装技术的下个版本,可以让系统级封装(SiP)尺寸增大两倍以上,实现 120x120mm 的超大封装,功耗可以达到千瓦级别。

关键字: CoWoS 台积电 封装

据外媒报道,字节正在内部探索出售TikTok美国业务多数股权,并援引内部人士披露的信息称 “沃尔玛或为最理想买家”。报道还称,讨论中的一种情况是字节出售美国50%以上TikTok股份,但保留少数股权。

关键字: 字节跳动 TikTok

业内消息,HMD 正在计划重启一些经典的诺基亚功能手机。今年 3 月初,该公司预告了将于 5 月发布的一款功能手机。现在该机的身份已经曝光,新款诺基亚 3210 的谍照已经泄露,展现了新机部分新特性。

关键字: 诺基亚 功能机 HMD

业内消息,近日有一位网友在各大社交媒体发文表示,自己离职后,公司将自己所有的期权全部作废。

关键字: 期权 微博

业内消息,在昨天的中关村论坛未来人工智能先锋论坛上,生数科技联合清华大学正式发布中国首个长时长、高一致性、高动态性视频大模型——Vidu。Vidu是自Sora发布之后全球率先取得重大突破的视频大模型,性能全面对标Sora...

关键字: Sora 清华 AI Vidu

业内消息,近日高通公司宣布推出针对桌面平台的全新骁龙 X Plus 处理器。

关键字: 高通 骁龙 X Plus 处理器

近日,台积电在圣克拉拉年度技术研讨会上宣布首个“埃级”制程技术:A16。A16 是台积电首次引入背面电源输送网络技术,计划于 2026 年下半年开始量产。同时,台积电也在重新命名工艺节点,标志着「埃级」时代的开始。

关键字: 台积电 A16

4 月 25 日消息,4 月 25 日,国际数据公司(IDC)发布 2024 年第一季度中国手机市场跟踪报告,荣耀以 17.1% 的市场份额拿下第一,华为占 17.0% 位列第二,OPPO、苹果和 vivo 分别位列第三...

关键字: 荣耀 华为

业内消息, 近日华为全新Pura 70系列手机正式开售引发广大 数码爱好者追捧,但是有网友注意到这款手机的“AI修图”功能,竟然可以将照片中的人物衣服消除,并拍成视频发布网络。

关键字: 华为Pura70 华为
关闭
关闭