2)摘自《正点原子I.MX6U嵌入式Linux驱动开拓指南》
关注官方微旗子暗记"大众年夜众号,获取更多资料:正点原子
第二十九章LCD背光调节实验

不管是利用显示器还是手机,其屏幕背光都是可以调节的,通过调节背光就可以掌握屏幕的亮度。在户外阳光强烈的时候可以通过调高背光来看清屏幕,在光芒比较暗的地方可以调低背光,防止伤眼睛并且省电。正点原子的三款RGB LCD也支持背光调节,本章我们就来学习如何调节LCD背光。
29.1 LCD背光调节简介
正点原子的三个RGB LCD都有一个背光掌握引脚,给这个背光掌握引脚输入高电平就会点亮背光,输入低电平就会关闭背光。如果我们不断的打开和关闭背光,当速率足够快的时候就不会觉得到背光关闭这个过程了。这个恰好可以利用PWM来完成,PWM全称是Pulse Width Modulation,也便是脉冲宽度调制,PWM旗子暗记如图29.1.1所示:
图29.1.1 PWM旗子暗记
PWM旗子暗记有两个关键的术语:频率和占空比,频率便是开关速率,把一次开关算作一个周期,那么频率便是1秒内进行了多少次开关。占空比便是一个周期内高电平时间和低电平时间的比例,一个周期内高电平时间越长占空比就越大,反之占空比就越小。占空比用百分之表示,如果一个周期内全是低电平那么占空比便是0%,如果一个周期内全是高电平那么占空比便是100%。
我们给LCD的背光引脚输入一个PWM旗子暗记,这样就可以通过调度占空比的办法来调度LCD背光亮度了。提高占空比就会提高背光亮度,降落占空比就会降落背光亮度。重点就在于PWM旗子暗记的产生和占空比的掌握,很幸运的是,I.MX6U供应了PWM外设,因此我们可以配置PWM外设来产生PWM旗子暗记。
打开《I.MX6ULL参考手册》的第40章“Chapter40 Pulse Width Modulation(PWM)”,I.MX6U一共有8路PWM旗子暗记,每个PWM包含一个16位的计数器和一个4 x 16的数据FIFO,I.MX6U的PWM外设构造如图29.1.2所示:
图29.1.2 I.MX6U PWM构造框图
图29.1.2中的各部分功能如下:
①、此部分是一个选择器,用于选择PWM旗子暗记的时钟源,一共有三种时钟源:ipg_clk、ipg_clk_highfreq和ipg_clk_32k。
②、这是一个12位的分频器,可以对①中选择的时钟源进行分频。
③、这是PWM的16位计数器寄存器,保存着PWM的计数值。
④、这是PWM的16位周期寄存器,此寄存器用来掌握PWM的频率。
⑤、这是PWM的16位采样寄存器,此寄存器用来掌握PWM的占空比。
⑥、此部分是PWM的中断旗子暗记,PWM是供应中断功能的,如果使能了相应的中断的话就会产生中断。
⑦、此部分是PWM对应的输出IO,产生的PWM旗子暗记就会从对应的IO中输出,I.MX6U-ALPHA开拓板的LCD背光掌握引脚连接在I.MX6U的GPIO1_IO8上,GPIO1_IO8可以复用为PWM1_OUT。
可以通过配置相应的寄存器来设置PWM旗子暗记的频率和占空比,PWM的16位计数器是个向上计数器,此计数器会从0X0000开始计数,直到计数值即是寄存器PWMx_PWMPR(x=1~8) +1,然后计数器就会重新从0X0000开始计数,如此往来来往。以是寄存器PWMx_PWMPR可以设置PWM的频率。
在一个周期内,PWM从0X0000开始计数的时候,PWM引脚先输出高电平(默认情形下,可以通过配置输出低电平)。采样FIFO中保存的采样值会在每个时钟和计数器值进行比较,当采样值和计数器相等的话PWM引脚就会改为输出低电平(默认情形下,同样可以通过配置输出高电平)。计数器会持续计数,直到和周期寄存器PWMx_PWMPR(x=1~8) +1的值相等,这样一个周期就完成了。以是,采样FIFO掌握着占空比,而采样FIFO里面的值来源于采样寄存器PWMx_PWMSAR,因此相称于PWMx_PWMSAR掌握着占空比。至此,PWM旗子暗记的频率和占空比设置我们就知道该如何去做了。
PWM开启往后会按照默认值运行,并产生PWM波形,而这个默认的PWM一样平常并不是我们须要的波形。如果这个PWM波形掌握着设备的话就会导致设备由于吸收到缺点的PWM旗子暗记而运行缺点,严重情形下可能会破坏设备,乃至人身安全。因此,在开启PWM之前最好设置好PWMx_PWMPR和PWMx_PWMSAR这两个寄存器,也便是设置好PWM的频率和占空比。
当我们向PWMx_PWMSAR寄存器写入采样值的时候,如果FIFO没满的话其值会被存储到FIFO中。如果FIFO满的时候写入采样值就会导致寄存器PWMx_PWMSR的位FWE(bit6)置1,表示FIFO写缺点,FIFO里面的值也并不会改变。FIFO可以在任何时候写入,但是只有在PWM使能的情形下读取。寄存器PWMx_SR的位FIFOAV(bit2:0)记录着当前FIFO中有多少个数据。从采样寄存器PWMx_PWMSAR读取一次数据,FIFO里面的数据就会减一,每产生一个周期的PWM旗子暗记,FIFO里面的数据就会减一,相称于被用掉了。PWM有个FIFO空中断,当FIFO为空的时候就会触发此中断,可以在此中断处理函数中向FIFO写入数据。
关于I.MX6U的PWM的事理知识就讲解到这里,接下来看一下PWM的几个主要的寄存器,本章我们利用的是PWM1,首先看一下寄存器PWM1_PWMCR寄存器,此寄存器构造如图29.1.2所示:
图29.1.2寄存器PWM1_PWMCR寄存器构造
寄存器PWM1_PWMCR用到的主要位如下:
FWM(bit27:26):FIFO水位线,用来设置FIFO空余位置为多少的时候表示FIFO为空。设置为0的时候表示FIFO空余位置大于即是1的时候FIFO为空;设置为1的时候表示FIFO空余位置大于即是2的时候FIFO为空;设置为2的时候表示FIFO空余位置大于即是3的时候FIFO为空;设置为3的时候表示FIFO口语位置大于即是4的时候FIFO为空。
STOPEN(bit25):此位用来设置停滞模式下PWM是否事情,为0的话表示在停滞模式下PWM连续事情,为1的话表示停滞模式下关闭PWM。
DOZEN(bit24):此位用来设置休眠模式下PWM是否事情,为0的话表示在休眠模式下PWM连续事情,为1的话表示休眠模式下关闭PWM。
WAITEN(bit23):此位用来设置等待模式下PWM是否事情,为0的话表示在等待模式下PWM连续事情,为1的话表示等待模式下关闭PWM。
DEGEN(bit22):此位用来设置调试模式下PWM是否事情,为0的话表示在调试模式下PWM连续事情,为1的话表示调试模式下关闭PWM。
BCTR(bit21):字节交流掌握位,用来掌握16位的数据进入FIFO的字节顺序。为0的时候不进行字节交流,为1的时候进行字节交流。
HCRT(bit20):半字交流掌握位,用来决定从32位IP总线接口传输来的哪个半字数据写入采样寄第器的第16位中。
POUTC(bit19:18):PWM输出掌握掌握位,用来设置PWM输出模式,为0的时候表示PWM先输出高电平,当计数器值和采样值相等的话就输出低电平。为1的时候相反,当为2或者3的时候PWM旗子暗记不输出。本章我们设置为0,也便是一开始输出高电平,当计数器值和采样值相等的话就改为低电平,这样采样值越大高电平时间就越长,占空比就越大。
CLKSRC(bit17:16):PWM时钟源选择,为0的话关闭;为1的话选择ipg_clk为时钟源;为2的话选择ipg_clk_highfreq为时钟源;为3的话选择ipg_clk_32k为时钟源。本章我们设置为1,也便是选择ipg_clk为PWM的时钟源,因此PWM时钟源频率为66MHz。
PRESCALER(bit15:4):分频值,可设置为0~4095,对应着1~4096分频。
SWR(bit3):软件复位,向此位写1就复位PWM,此位是自清零的,当复位完成往后此位会自动清零。
REPEAT(bit2:1):重复采样设置,此位用来设置FIFO中的每个数据能用几次。可设置0~3,分别表示FIFO中的每个数据能用1~4次。本章我们设置为0,即FIFO只的每个数据只能用一次。
EN(bit0):PWM使能位,为1的时候使能PWM,为0的时候关闭PWM。
接下来看一下寄存器PWM1_PWMIR寄存器,这个是PWM的中断掌握寄存器,此寄存器构造如图29.1.3所示:
图29.1.3寄存器PWM1_PWMIR构造
寄存器PWM1_PWMIR只有三个位,这三个位的含义如下:
CIE(bit2):比较中断使能位,为1的时候使能比较中断,为0的时候关闭比较中断。
RIE(bit1):翻转中断使能位,当计数器值即是采样值并回滚到0X0000的时候就会产生此中断,为1的时候使能翻转中断,为0的时候关闭翻转中断。
FIE(bit0):FIFO空中断,为1的时候使能,为0的时候关闭。
再来看一下状态寄存器PWM1_PWMSR,此寄存器构造如图29.1.4所示:
图29.1.4寄存器PWM1_PWMSR构造
寄存器PWM1_PWMSR各个位的含义如下:
FWE(bit6):FIFO写缺点事宜,为1的时候表示发生了FIFO写缺点。
CMP(bit5):FIFO比较事宜发标志位,为1的时候表示发生FIFO比较事宜。
ROV(bit4):翻转事宜标志位,为1的话表示翻转事宜发生。
FE(bit3):FIFO空标志位,为1的时候表示FIFO位空。
FIFOAV(bit2:1):此位记录FIFO中的有效数据个数,有效值为0~4,分别表示FIFO中有0~4个有效数据。
接下来是寄存器PWM1_PWMPR寄存器,这个是PWM周期寄存器,可以通过此寄存器来设置PWM的频率,此寄存器构造如图29.1.5所示:
图29.1.5寄存器PWM1_PWMPR寄存器
从图29.1.5可以看出,寄存器PWM1_PWMPR只有低16位有效,当PWM计数器的值即是PERIOD+1的时候就会从0X0000重新开始计数,开启另一个周期。PWM的频率打算公式如下:
PWMO(Hz) = PCLK(Hz) / (PERIOD + 2)
个中PCLK是终极进入PWM的时钟频率,如果PCLK的频率为1MHz,现在我们要产生一个频率为1KHz的PWM旗子暗记,那么就可以设置PERIOD =1000000/1000 – 2=998。
末了来看一下寄存器PWM1_PWMSAR,这是采样寄存器,用于设置占空比的,此寄存器构造如图29.1.6所示:
图29.1.6寄存器PWM1_PWMSAR构造
此寄存器也是只有低16位有效,为采样值。通过这个采样值即可调度占空比,当计数器的值小于SAMPLE的时候输出高电平(或低电平)。当计数器值大于即是SAMPLE,小于寄存器PWM1_PWMPR的PERIO的时候输出低电平(或高电平)。同样在上面的例子中,如果我们要设置PWM旗子暗记的占空比为50%,那么就可以将SAMPLE设置为(PERIOD + 2) /2=1000/2=500。
关于PWM有关的寄存器就先容到这里,关于这些寄存用具体的描述,请参考《I.MX6ULL参考手册》第2480页的40.7小节。本章我们利用I.MX6U的PWM1,PWM1的输出引脚为GPIO1_IO8,配置步骤如下:
1、配置引脚GPIO1_IO8
配置GPIO1_IO08的复用功能,将其复用为PWM1_OUT旗子暗记线。
2、初始化PWM1
初始化PWM1,配置所需的PWM旗子暗记的频率和默认占空比。
3、设置中断
由于FIFO中的采样值每个周期都会少一个,以是须要不断的向FIFO中写入采样值,防止其为空。我们可以使能FIFO空中断,这样当FIFO为空的时候就会触发相应的中断,然后在中断处理函数中向FIFO写入采样值。
4、使能PWM1
配置好PWM1往后就可以开启了。
29.2硬件事理剖析本试验用到的资源如下:
、指示灯LED0。
、RGB LCD接口。
③、按键KEY0
本实验用到的硬件事理图参考第二十四章,本章实验我们一开始设置RGB LCD的背光亮度PWM旗子暗记频率为1KHz,占空比为10%,这样屏幕亮度就很低。然后通过按键KEY0逐步的提升PWM旗子暗记的占空比,按照10%步进。当达到100%往后再次按下KEY0,PWM旗子暗记占空比回到10%重新开始。LED0不断的闪烁,提示系统正在运行。
29.3实验程序编写本实验对应的例程路径为:开拓板光盘-> 1、裸机例程->20_pwm_lcdbacklight。
本章实验在上一章例程的根本上完成,变动工程名字为“backlight”,然后在bsp文件夹下创建名为“backlight”的文件夹,然后在bsp/backlight中新建bsp_backlight.c和bsp_backlight.h这两个文件。在bsp_backlight.h中输入如下内容:
示例代码29.3.1 bsp_backlight.h文件代码
1 #ifndef _BACKLIGHT_H
2 #define _BACKLIGHT_H
3/
4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
5文件名 : bsp_backlight.c
6作者 : 左忠凯
7版本 : V1.0
8描述 : LCD背光PWM驱动头文件。
9其他 : 无
10论坛 : www.openedv.com
11日志 : 初版V1.0 2019/1/22 左忠凯创建
12 /
13 #include "imx6ul.h"
14
15/ 背光PWM构造体 /
16struct backlight_dev_struc
17{
18 unsignedchar pwm_duty;/ 占空比 /
19};
20
21/ 函数声明 /
22void backlight_init(void);
23void pwm1_enable(void);
24void pwm1_setsample_value(unsignedint value);
25void pwm1_setperiod_value(unsignedint value);
26void pwm1_setduty(unsignedchar duty);
27void pwm1_irqhandler(void);
28
29 #endif
文件bsp_backlight.h文件内容很大略,在第16行定义了一个背光PWM构造体,剩下的便是函数声明。在文件bsp_backlight.c中输入如下内容:
示例代码29.3.2 bsp_backlight.c文件代码
/
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_backlight.c
作者 : 左忠凯
版本 : V1.0
描述 : LCD背光PWM驱动文件。
其他 : 无
论坛 : www.openedv.com
日志 : 初版V1.0 2019/1/22 左忠凯创建
/
1 #include "bsp_backlight.h"
2 #include "bsp_int.h"
3 #include "stdio.h"
4
5struct backlight_dev_struc backlight_dev;/ 背光设备 /
6
7/
8 @description : pwm1中断处理函数
9 @param : 无
10 @return : 无
11 /
12void pwm1_irqhandler(void)
13{
14if(PWM1->PWMSR &(1<<3)) / FIFO为空中断 /
15{
16/ 将占空比信息写入到FIFO中,实在便是设置占空比 /
17 pwm1_setduty(backlight_dev.pwm_duty);
18 PWM1->PWMSR |=(1<<3); / 写1打消中断标志位 /
19}
20}
21
22/
23 @description : 初始化背光PWM
24 @param : 无
25 @return : 无
26 /
27void backlight_init(void)
28{
29unsignedchar i =0;
30
31/ 1、背光PWM IO初始化,复用为PWM1_OUT /
32 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO08_PWM1_OUT,0);
33 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO08_PWM1_OUT,0XB090);
34
35/ 2、初始化PWM1
36 初始化寄存器PWMCR
37 bit[27:26] : 01 当FIFO中空余位置大于即是2的时候FIFO空标志值位
38 bit[25] : 0 停滞模式下PWM不事情
39 bit[24] : 0 休眠模式下PWM不事情
40 bit[23] : 0 等待模式下PWM不事情
41 bit[22] : 0 调试模式下PWM不事情
42 bit[21] : 0 关闭字节交流
43 bit[20] : 0 关闭半字数据交流
44 bit[19:18] : 00 PWM输出引脚在计数看重新计数的时候输出高电平
45 在计数器计数值达到比较值往后输出低电平
46 bit[17:16] : 01 PWM时钟源选择IPG CLK = 66MHz
47 bit[15:4] : 65 分频系数为65+1=66,PWM时钟源 = 66MHZ/66=1MHz
48 bit[3] : 0 PWM不复位
49 bit[2:1] : 00 FIFO中的sample数据每个只能利用一次。
50 bit[0] : 0 先关闭PWM,后面再使能
51 /
52 PWM1->PWMCR =0;/ 寄存器先清零 /
53 PWM1->PWMCR |=(1<<26)|(1<<16)|(65<<4);
54
55/ 设置PWM周期为1000,那么PWM频率便是1M/1000 = 1KHz。 /
56 pwm1_setperiod_value(1000);
57
58/ 设置占空比,默认50%占空比 ,写四次是由于有4个FIFO /
59 backlight_dev.pwm_duty =50;
60for(i =0; i <4; i++)
61{
62 pwm1_setduty(backlight_dev.pwm_duty);
63}
64
65/ 使能FIFO空中断,设置寄存器PWMIR寄存器的bit0为1 /
66 PWM1->PWMIR |=1<<0;
67 system_register_irqhandler(PWM1_IRQn, / 注册中断做事函数 /
(system_irq_handler_t)pwm1_irqhandler,NULL);
68 GIC_EnableIRQ(PWM1_IRQn); / 使能GIC中对应的中断 /
69 PWM1->PWMSR =0; / PWM中断状态寄存器清零 /
70 pwm1_enable(); / 使能PWM1 /
71}
72
73/
74 @description : 使能PWM
75 @param : 无
76 @return : 无
77 /
78void pwm1_enable(void)
79{
80 PWM1->PWMCR |=1<<0;
81}
82
83/
84 @description : 设置Sample寄存器,Sample数据会写入到FIFO中,所谓的
85 Sample寄存器,就相称于比较寄存器,如果PWMCR中的POUTC
86 设置为00的时候。当PWM计数器中的计数值小于Sample的时候
87 就会输出高电平,当PWM计数器值大于Sample的时候输出底电
88 平,因此可以通过设置Sample寄存器来设置占空比。
89 @param - value:寄存器值,范围0~0XFFFF
90 @return : 无
91 /
92void pwm1_setsample_value(unsignedint value)
93{
94 PWM1->PWMSAR =(value &0XFFFF);
95}
96
97/
98 @description : 设置PWM周期,便是设置寄存器PWMPR,PWM周期公式如下
99 PWM_FRE = PWM_CLK / (PERIOD + 2),比如当前PWM_CLK=1MHz
100 要产生1KHz的PWM,那么PERIOD = 1000000/1K - 2 = 998
101 @param - value : 周期值,范围0~0XFFFF
102 @return : 无
103 /
104void pwm1_setperiod_value(unsignedint value)
105{
106unsignedint regvalue =0;
107
108if(value <2)
109 regvalue =2;
110else
111 regvalue = value -2;
112 PWM1->PWMPR =(regvalue &0XFFFF);
113}
114
115/
116 @description : 设置PWM占空比
117 @param - value : 占空比0~100,对应0%~100%
118 @return : 无
119 /
120void pwm1_setduty(unsignedchar duty)
121{
122unsignedshort preiod;
123unsignedshort sample;
124
125 backlight_dev.pwm_duty = duty;
126 preiod = PWM1->PWMPR +2;
127 sample = preiod backlight_dev.pwm_duty /100;
128 pwm1_setsample_value(sample);
129}
文件bsp_blacklight.c一共有6个函数,首先是函数pwm1_irqhandler,这个是PWM1的中断处理函数。须要在此函数中处理FIFO空中断,当FIFO空中断发生往后须要向采样寄存器PWM1_PWMSAR写入采样数据,也便是占空比值,末了要打消相应的中断标志位。第2个函数是backlight_init,这个是背光初始化函数,在此函数里面会初始化背光引脚GPIO1_IO08,将其复用为PWM1_OUT。然后此函数初始化PWM1,设置要 产生的PWM旗子暗记频率和默认占空比,接下来使能FIFO空中断,注册相应的中断处理函数,末了使能PWM1。第3个函数是pwm1_enable,用于使能PWM1。第4个函数是pwm1_setsample_value,用于设置采样值,也便是寄存器PWM1_PWMSAR的值。第5个函数是pwm1_setperiod_value,用于设置PWM旗子暗记的频率。第6个函数是pwm1_setduty,用于设置PWM的占空比,这个函数只有一个参数duty,也便是占空比值,单位为%,函数内部会根据百分值打算出寄存器PWM1_PWMSAR该当设置的值。
末了在main.c文件中输入如下所示内容:
示例代码29.3.3 main.c文件代码
/
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : mian.c
作者 : 左忠凯
版本 : V1.0
描述 : I.MX6U开拓板裸机实验21 背光PWM实验
其他 : 我们利用手机的时候背光都是可以调节的,同样的I.MX6U-ALPHA
开拓板的LCD背光也是可以调节,LCD背光就相称于一个LED灯。
LED灯的亮灭可以通过PWM来掌握,本实验我们就来学习一下如何
通过PWM来掌握LCD的背光。
论坛 : www.openedv.com
日志 : 初版V1.0 2019/1/21 左忠凯创建
/
1 #include "bsp_clk.h"
2 #include "bsp_delay.h"
3 #include "bsp_led.h"
4 #include "bsp_beep.h"
5 #include "bsp_key.h"
6 #include "bsp_int.h"
7 #include "bsp_uart.h"
8 #include "bsp_lcd.h"
9 #include "bsp_lcdapi.h"
10 #include "bsp_rtc.h"
11 #include "bsp_backlight.h"
12 #include "stdio.h"
13
14/
15 @description : main函数
16 @param : 无
17 @return : 无
18 /
19int main(void)
20{
21 unsignedchar keyvalue =0;
22 unsignedchar i =0;
23 unsignedchar state = OFF;
24 unsignedchar duty =0;
25
26 int_init(); / 初始化中断(一定要最先调用!
) /
27 imx6u_clkinit(); / 初始化系统时钟 /
28 delay_init(); / 初始化延时 /
29 clk_enable(); / 使能所有的时钟 /
30 led_init(); / 初始化led /
31 beep_init(); / 初始化beep /
32 uart_init(); / 初始化串口,波特率115200 /
33 lcd_init(); / 初始化LCD /
34 backlight_init(); / 初始化背光PWM /
35
36 tftlcd_dev.forecolor = LCD_RED;
37 lcd_show_string(50,10,400,24,24,
(char)"ALPHA-IMX6U BACKLIGHT PWM TEST");
38 lcd_show_string(50,40,400,24,24,(char)"PWM Duty: %");
39 tftlcd_dev.forecolor = LCD_BLUE;
40
41 / 设置默认占空比 10% /
42 duty =10;
43 lcd_shownum(158,40, duty,3,24);
44 pwm1_setduty(duty);
45
46 while(1)
47 {
48 keyvalue = key_getvalue();
49 if(keyvalue == KEY0_VALUE)
50 {
51 duty +=10; / 占空比加10% /
52 if(duty >100) / 如果占空比超过100%,重新从10%开始 /
53 duty =10;
54 lcd_shownum(158,40, duty,3,24);
55 pwm1_setduty(duty); / 设置占空比 /
56 }
57
58 delayms(10);
59 i++;
60 if(i ==50)
61 {
62 i =0;
63 state =!state;
64 led_switch(LED0,state);
65 }
66 }
67 return0;
68}
第34行调用函数backlight_init初始化屏幕背光PWM。第44行设置背光PWM默认占空比为10%。在main函数中读取按键值,如果KEY0按下的话就将PWM旗子暗记的占空比增加10%,当占空比超过100%的时候就重回到10%,重新开始。总的来说,main.c的内容还是很大略的。
29.4编译下载验证29.4.1 编写Makefile和链接脚本修正Makefile中的TARGET为backlight,然后在在INCDIRS和SRCDIRS中加入“bsp/rtc”,修正后的Makefile如下:
示例代码29.4.1 Makefile代码
1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= backlight
3
4/ 省略掉其它代码...... /
5
6 INCDIRS := imx6ul \
7 stdio/include \
8 bsp/clk \
9 bsp/led \
10 bsp/delay \
11 bsp/beep \
12 bsp/gpio \
13 bsp/key \
14 bsp/exit \
15 bsp/int \
16 bsp/epittimer \
17 bsp/keyfilter \
18 bsp/uart \
19 bsp/lcd \
20 bsp/rtc \
21 bsp/i2c \
22 bsp/ap3216c \
23 bsp/spi \
24 bsp/icm20608 \
25 bsp/touchscreen \
26 bsp/backlight
27
28 SRCDIRS:= project \
29 stdio/lib \
30 bsp/clk \
31 bsp/led \
32 bsp/delay \
33 bsp/beep \
34 bsp/gpio \
35 bsp/key \
36 bsp/exit \
37 bsp/int \
38 bsp/epittimer \
39 bsp/keyfilter \
40 bsp/uart \
41 bsp/lcd \
42 bsp/rtc \
43 bsp/i2c \
44 bsp/ap3216c \
45 bsp/spi \
46 bsp/icm20608 \
47 bsp/touchscreen \
48 bsp/backlight
49
50/ 省略掉其它代码...... /
51
52 clean:
53 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS)$(SOBJS)
第2行修正变量TARGET为“backlight”,也便是目标名称为“backlight”。
第26行在变量INCDIRS中添加背光PWM驱动头文件(.h)路径。
第48行在变量SRCDIRS中添加背光PWM驱动驱动文件(.c)路径。
链接脚本保持不变。
29.4.2编译下载利用Make命令编译代码,编译成功往后利用软件imxdownload将编译完成的backlight.bin文件下载到SD卡中,命令如下:
chmod 777 imxdownload //给予imxdownload可实行权限,一次即可
./imxdownload backlight.bin /dev/sdd //烧写到SD卡中
烧写成功往后将SD卡插到开拓板的SD卡槽中,然后复位开拓板,默认背光PWM是10%,PWM旗子暗记波形如图29.4.2.1所示:
图29.4.2.110%占空比PWM旗子暗记
从图29.4.2.1可以看出,此时背光PWM旗子暗记的频率为1.00KHz,占空比是10.02%,和我们代码中配置的同等,此时LCD的屏幕显示如图29.4.2.2所示:
图29.4.2.210%占空比屏幕亮度
图29.4.2.2便是PWM占空比为10%的LCD屏幕显示,可以看出屏幕亮度很低,乃至可以看到屏幕上拍照人的倒影。由于拍照的缘故原由,实际亮度跟实际情形可能会有少许差别。
我们将PWM的占空比调节到90%,此时的LCD屏幕亮度肯定会很亮,如图29.4.2.3所示:
图29.4.2.390%占空比屏幕亮度
图29.4.2.3的屏幕亮度比较图29.4.2.2就要高很多,这个便是LCD背光调节的事理,采取PWM波形来完成,通过调度占空比即可完成亮度调节。
至此,I.MX6U-ALPHA开拓板的所有裸机例程已经全部完成了,通过这几十个裸机例程,我们对I.MX6UL/ULL这款芯片的外设有了一个基本的理解,为我们往后学习Uboot和Linux驱动打下了坚实的根本。