1
LEDs
所谓流水灯,就是LED灯轮流点亮,看起来就像水流一样流动着点亮。我们板子上一共有4个LED灯。我们每隔500MS点亮一个灯,然后熄灭这个灯,再点亮下一个灯。
这个IO外设使用分4个步骤,不管是用库函数还是寄存器编写都要按照这个步骤来。上一节讲了GPIOB->ODR如何转换到PBout,后面直接用寄存器编程时,我们采用GPIOB->ODR来操作。
这里的HAL_Delay()是HAL库使用系统定时器实现的MS级延迟函数。上面的程序里,HAL_Delay(500);也可以直接放在for循环体里。
这里控制蜂鸣器是采用的通用开漏输出模式,外接上拉电阻到5V,这样IO就可以控制输出5V电压了。我们使用的蜂鸣器是5V供电,如果采用通用推挽模式,那么3.3V是无法关闭PNP三极管的。PNP三极管低电平开启三极管,5V才能关闭PNP三极管。下面采用寄存器的方法来实现流水灯程序。先实现IO初始化配置。下图是相关时钟寄存器和IO相关的寄存器。
通过阅读用户手册,我们在第一幅图上知道IO口的时钟是挂靠在APB2上的,在APB2CLKEN寄存器的第3位是PB口时钟使能位,该位赋值1,则开启PB口时候。每组IO有16位引脚,我们使用的PB15-PB12,属于高8位,因此,要配置CFGHIG这个寄存器。CFGHIG每4位配置一个IO,低2位控制IO是输出还是输入,这里选择50MHZ输出,因此为11。高2位是配置是哪一种输出模式,这里选择通用推挽模式,因此为00。所以这4位为0011B,即为3。所以,CFGHIG |=0x33330000;配置好了后,就要开始输出数据了。我们往数据寄存器ORD里写数据就可以了。PB0-PB15,对应ORD的低16位。比如PB15出0,那么ORD&=~(1<<15);具体的寄存器程序,看下图。
把LED_Init();放在while语句前面,Led()放在循环体里就行了。在实际的项目中,我们很少直接使用HAL_Delay()这种堵塞型延迟函数。一般采用定时器中断实现,或者采用循环实现。比如我们的while循环体里,有很多程序,比如执行一次循环需要100us,那么我们定义一个变量CNT,当CNT等于5000时,就刚好500MS,这样子就可以切换LED灯了。如果直接延迟500MS,那么程序在这期间就什么事情都不能干,除了中断程序。下一节准备探讨下关于按键检测的短按和长按实现的方法。
全部0条评论
快来发表一下你的评论吧 !