跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
LED灯珠捷比信 · 专业器件主题站

基于LPC54114的延迟函数的设计与应用。

由21ic论坛制作jinglixixi网站:bbs.21ic.com在例行程序中,测试I / O控制功能以点亮LED的程序是必不可少的。该例程附带的延迟功能通常是必不可少的。使用这种延迟功能可以实现相对准确的基于时间的延迟效果,例如毫秒和微秒功能。缺少这种延迟功能只能通过对计时器进行编程来解决。在LPC54114的官方例程中,还有一个程序使LED点亮,但是该例程不提供这种基于时间的延迟功能。如何达到延迟效果?该例程的主程序如下:int main(void){int loop = 1; / *用于修复无法访问的语句警告* / SystemCoreClockUpdate(); Board_Init(); Board_IO_Init(); Board_LED_RGB_Off(); / * EnableSysTick计时器* / SysTick_Config(SystemCoreClock / TICKRATE_HZ); while(loop){__WFI();}返回0;}由此可以推断出它提供了一个滴答计时器来控制延迟效果。滴答计时器如何控制LED?结果可以从下面的中断处理程序函数中看到:void SysTick_Handler(void){tick_ct + = 1; / *颠簸滴答数* / if(((tick_ct%10)== 0){/ *如果经过了一秒钟(10个滴答声)* / tick_ct = 0; LED_ct + = 1; / *颠倒LED数量* / Board_LED_RGB_Set(LED_ct& amp; amp; amp; amp; amp; amp; amp; amp ;; 0x07); / *显示新的LED值* /}}事实证明,它依靠滴答计时器生成标准时基信号,然后编程一个软件计时器来控制延迟时间,并使用它来切换显示RGB_LED的状态。了解了这些内容之后,我们是否可以基于此将毫秒和微秒的延迟函数添加到LPC54114的例程中?答案自然是肯定的,那么应该这样实现吗?为了便于理解,让我们看一下以下程序:voidSysTick_Handler(void){tick_ct + = 1;如果((tick_ct%M)== 0){tick_ct = 0; LED_ct + = 1; F =(F + 1)%2;}}通过添加延迟标识变量F,可以判断延迟是否完成,然后可以在主程序中实现延迟控制功能,M的值可以进行修改以更改延迟的长度。而(1){if(F)& nbsp; & nbsp; LED_R_Set();其他& nbsp; LED_R_Clr(); __WFI();}为了符合调用延迟函数的习惯,可以将其转换为以下形式:voidSysTick_Handler(void){tick_ct + = 1;如果((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();}}这样,我们可以在主程序中自由使用延迟函数。而(1){delay_ns(2); LED_R_Set(); delay_ns(2); LED_R_Clr();}图1通电状态(点亮电源指示灯)图2滴答计时器控件LED闪烁图3延迟功能对于基于RGB_LED的控件,如果将中断处理程序功能更改为:void SysTick_Handler (无效){tick_ct + = 1;如果((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){  & nbsp;& nbsp; & nbsp; //& nbsp;& nbsp;第二级延迟时M = n; TICKRATE = 1000000; TICKRATE_HZ = 1000000; F = 0; while(!F){__WFI();}} void delay_nms(uint16_t n){  & nbsp;& nbsp; & nbsp; //& nbsp;& nbsp;毫秒延迟M = n; TICKRATE = 1000; s TICKRATE_HZ = 1000000; F = 0; while(!F){__WFI();}} void delay_nus(uint32_t n){  & nbsp;& nbsp; & nbsp;& nbsp;   //  微秒延迟M = n; TICKRATE = 1; TICKRATE_HZ = 1000000; F = 0; while(!F){__WFI();}}使用这些延迟函数,除了我们还能做些什么来解决延迟问题?在数字传感器驱动器中,对序列的要求较高,因此必须具有比较基准的延迟功能,例如单总线的DS18B20,DHT11 / DHT22等,以及外围设备。 I2C和SPI接口也需要延迟。时间函数是由协作驱动的,因此延迟函数的功能仍然非常重要。例如,在驱动OLED屏幕的辅助功能中,通过调用延迟功能可以保持信号作用时间。 IIC_Start(){OLED_SCLK_Set(); delay_nus(2); OLED_SDIN_Set(); delay_nus(2); OLED_SDIN_Clr(); delay_nus(2); OLED_SCLK_Clr();图4 OLED屏幕显示的延迟功能另外,该延迟功能也适用于LPC54110等开发板。当然,也可以将其移植到具有滴答计时器但缺少参考延迟功能的地方。本文由21ic论坛网友jinglixixi原创。免责声明:本文内容经21ic授权后发布,版权归原作者所有。该平台仅提供信息存储服务。本文仅代表作者&