SoC第二讲——使用C语言实现 LED 呼吸灯效果(五)

SoC第二讲——使用C语言实现 LED 呼吸灯效果(五)
这篇文章 使用 Verilog 实现 LED 呼吸灯效果 是基于纯数字逻辑来实现呼吸灯的效果,本节介绍采用C语言来实现LED呼吸灯的效果,重点理解如何通过ARM来实现LED呼吸灯效果的,即原理和过程。

本次利用一个GPIO 外设接口PS和PL部分用GPIO连接起来,通过ARM控制GPIO进而控制PL部分。

引脚输出的电平只有0和1,但要实现渐变的效果,传入的电流必须有0.x的值,为了达到这个目的,首先要引入脉冲宽度调制(PWM)的概念。

LED的点亮和熄灭,是电平高低变换的结果,可以将一高一低看作一个周期,每个周期一亮一灭,会显示为LED的闪烁,当周期很短,也就是频率很高时,这种闪烁将不被肉眼识别,会让人产生LED连续发光的感觉。在一个周期内,高电平时长与一个周期时长的比叫做占空比,占空比越高,相当于通过LED的电流就越大,视觉上的感觉就越亮。说到这里,应该就有了做呼吸灯的思路,就是改变占空比!让占空比小幅度有级提升,就会有LED无级变亮的感觉。反之就会变暗。

占空比越高,亮度越亮

C代码部分main主体:
int main()
{		int i,j;
		int led=0;
		initGpio();//调用gpio初始化函数
		while(1){
			for(i=0;i<1000;i++){
				for(j=0;j<1000;j++){
					if(i>j){
						XGpioPs_WritePin(&GpioPs,LED0,0x01);
					}
					else
					{
						XGpioPs_WritePin(&GpioPs,LED0,0x00);
					}
				}
			}
		}
}

上面的代码只是实现了LED由暗变灭的过程,实现完整的呼吸灯效果,可以再增加一段对称的代码,实现由亮变暗。
完整main主函数

int main()
{
	initGpio();  //initial GPIO
//	int led = 0;
	int i,j;
	XGpioPs_WritePin(&GpioPs,LED1,0x01);//fpga led 闪烁
	while(1){
		for(i=0;i<1000;i++){
			for(j=0;j<1000;j++){
				if(i>j){
					XGpioPs_WritePin(&GpioPs,LED0,0x01);
					usleep(1);
				}
				else
				{
					XGpioPs_WritePin(&GpioPs,LED0,0x00);
					usleep(1);
				}
			}
		}
		usleep(10);
		for(i=0;i<1000;i++){
					for(j=0;j<1000;j++){
						if(i>j){
							XGpioPs_WritePin(&GpioPs,LED0,0x00);
							usleep(1);
						}
						else
						{
							XGpioPs_WritePin(&GpioPs,LED0,0x01);
							usleep(1);
						}
					}
				}
	}

与纯逻辑实现呼吸灯的算法(设计原理)一致,通过两个变量来控制计数时间(这里是CPU循环一次周期的时间为最小的亮灯时间或是暗灯时间),并通过一个循环嵌套来实现。

调用GPIO初始化函数在使用C语言通过GPIO驱动点亮LED灯(四)里面,再次不过多赘述。

在SDK中上板调试中,可以出现和纯逻辑一样的效果。

你可能感兴趣的:(C语言,SOC设计)