OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5152|回复: 2

【正点原子Linux连载】第二十九章 LCD背光调节实验--摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

[复制链接]

1118

主题

1129

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4671
金钱
4671
注册时间
2019-5-8
在线时间
1224 小时
发表于 2019-12-19 17:36:22 | 显示全部楼层 |阅读模式
本帖最后由 正点原子01 于 2019-12-19 17:52 编辑

1)实验平台:正点原子阿尔法Linux开发板
2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html
3)本章实例源码下载: LCD背光调节实验.zip (3.03 MB, 下载次数: 6)
4)对正点原子Linux感兴趣的同学可以加群讨论:935446741
5)关注正点原子公众号,获取最新资料更新
QQ图片20191129104007.png

第二十九章LCD背光调节实验


       不管是使用显示器还是手机,其屏幕背光都是可以调节的,通过调节背光就可以控制屏幕的亮度。在户外阳光强烈的时候可以通过调高背光来看清屏幕,在光线比较暗的地方可以调低背光,防止伤眼睛并且省电。正点原子的三款RGB LCD也支持背光调节,本章我们就来学习如何调节LCD背光。

29.1 LCD背光调节简介
       正点原子的三个RGB LCD都有一个背光控制引脚,给这个背光控制引脚输入高电平就会点亮背光,输入低电平就会关闭背光。假如我们不断的打开和关闭背光,当速度足够快的时候就不会感觉到背光关闭这个过程了。这个正好可以使用PWM来完成,PWM全称是Pulse Width Modulation,也就是脉冲宽度调制,PWM信号如图29.1.1所示:
image002.gif

图29.1.1 PWM信号
       PWM信号有两个关键的术语:频率和占空比,频率就是开关速度,把一次开关算作一个周期,那么频率就是1秒内进行了多少次开关。占空比就是一个周期内高电平时间和低电平时间的比例,一个周期内高电平时间越长占空比就越大,反之占空比就越小。占空比用百分之表示,如果一个周期内全是低电平那么占空比就是0%,如果一个周期内全是高电平那么占空比就是100%。
       我们给LCD的背光引脚输入一个PWM信号,这样就可以通过调整占空比的方式来调整LCD背光亮度了。提高占空比就会提高背光亮度,降低占空比就会降低背光亮度。重点就在于PWM信号的产生和占空比的控制,很幸运的是,I.MX6U提供了PWM外设,因此我们可以配置PWM外设来产生PWM信号。
       打开《I.MX6ULL参考手册》的第40章“Chapter40 Pulse WidthModulation(PWM)”,I.MX6U一共有8路PWM信号,每个PWM包含一个16位的计数器和一个4 x 16的数据FIFO,I.MX6U的PWM外设结构如图29.1.2所示:
image004.gif


图29.1.2 I.MX6UPWM结构框图
       图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所示:

image006.jpg

图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所示:
image008.jpg

图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所示:
image010.jpg
图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所示:
image012.jpg
图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所示:
image014.jpg
图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
       本实验用到的硬件原理图参考第二十四章,本章实验我们一开始设置RGBLCD的背光亮度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. /* 背光PWM结构体 */
  15. struct backlight_dev_struc
  16. {
  17.         unsignedchar pwm_duty;/* 占空比    */
  18. };

  19. /* 函数声明 */
  20. void backlight_init(void);
  21. void pwm1_enable(void);
  22. void pwm1_setsample_value(unsignedint value);
  23. void pwm1_setperiod_value(unsignedint value);
  24. void pwm1_setduty(unsignedchar duty);
  25. void pwm1_irqhandler(void);

  26. #endif
复制代码
    文件bsp_backlight.h文件内容很简单,在第16行定义了一个背光PWM结构体,剩下的就是函数声明。在文件bsp_backlight.c中输入如下内容:
示例代码29.3.2 bsp_backlight.c文件代码
  1. /***************************************************************
  2. Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
  3. 文件名   : bsp_backlight.c
  4. 作者     : 左忠凯
  5. 版本     : V1.0
  6. 描述     : LCD背光PWM驱动文件。
  7. 其他     : 无
  8. 论坛     : www.openedv.com
  9. 日志     : 初版V1.0 2019/1/22 左忠凯创建
  10. ***************************************************************/
  11.    #include "bsp_backlight.h"
  12.    #include "bsp_int.h"
  13.    #include "stdio.h"

  14. struct backlight_dev_struc backlight_dev;/* 背光设备 */

  15. /*
  16.     * @description        : pwm1中断处理函数
  17.     * @param               : 无
  18.    * @return              : 无
  19.    */
  20. void pwm1_irqhandler(void)
  21. {
  22. if(PWM1->PWMSR &(1<<3))                /* FIFO为空中断                */
  23. {
  24. /* 将占空比信息写入到FIFO中,其实就是设置占空比 */
  25.           pwm1_setduty(backlight_dev.pwm_duty);
  26.           PWM1->PWMSR |=(1<<3);        /* 写1清除中断标志位        */
  27. }
  28. }

  29. /*
  30.    * @description         : 初始化背光PWM
  31.    * @param               : 无
  32.    * @return              : 无
  33.    */
  34. void backlight_init(void)
  35. {
  36. unsignedchar i =0;

  37. /* 1、背光PWM IO初始化,复用为PWM1_OUT */
  38.       IOMUXC_SetPinMux(IOMUXC_GPIO1_IO08_PWM1_OUT,0);
  39.       IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO08_PWM1_OUT,0XB090);

  40. /* 2、初始化PWM1
  41.        * 初始化寄存器PWMCR
  42.        * bit[27:26]        : 01  当FIFO中空余位置大于等于2的时候FIFO空标志值位
  43.        * bit[25]            : 0  停止模式下PWM不工作
  44.        * bit[24]            : 0   休眠模式下PWM不工作
  45.        * bit[23]            : 0   等待模式下PWM不工作
  46.        * bit[22]            : 0   调试模式下PWM不工作
  47.        * bit[21]            : 0   关闭字节交换
  48.        * bit[20]            : 0   关闭半字数据交换
  49.        * bit[19:18]         : 00  PWM输出引脚在计数器重新计数的时候输出高电平
  50.        *                     在计数器计数值达到比较值以后输出低电平
  51.        * bit[17:16]        : 01  PWM时钟源选择IPG CLK = 66MHz
  52.        * bit[15:4]          : 65  分频系数为65+1=66,PWM时钟源 = 66MHZ/66=1MHz
  53.        * bit[3]             : 0   PWM不复位
  54.        * bit[2:1]           : 00  FIFO中的sample数据每个只能使用一次。
  55.        * bit[0]             : 0   先关闭PWM,后面再使能
  56.        */
  57.       PWM1->PWMCR =0;/* 寄存器先清零 */
  58.       PWM1->PWMCR |=(1<<26)|(1<<16)|(65<<4);

  59. /* 设置PWM周期为1000,那么PWM频率就是1M/1000 = 1KHz。 */
  60.       pwm1_setperiod_value(1000);

  61. /* 设置占空比,默认50%占空比   ,写四次是因为有4个FIFO */
  62.       backlight_dev.pwm_duty =50;
  63. for(i =0; i <4; i++)
  64. {
  65.           pwm1_setduty(backlight_dev.pwm_duty);
  66. }

  67. /* 使能FIFO空中断,设置寄存器PWMIR寄存器的bit0为1 */
  68.       PWM1->PWMIR |=1<<0;
  69.       system_register_irqhandler(PWM1_IRQn,        /* 注册中断服务函数                */
  70. ystem_irq_handler_t)pwm1_irqhandler,NULL);
  71.       GIC_EnableIRQ(PWM1_IRQn);                                /* 使能GIC中对应的中断 */
  72.       PWM1->PWMSR =0;                                /* PWM中断状态寄存器清零 */
  73.       pwm1_enable();                                /* 使能PWM1                         */
  74. }

  75. /*
  76.    * @description         : 使能PWM
  77.    * @param               : 无
  78.    * @return              : 无
  79.    */
  80. void pwm1_enable(void)
  81. {
  82.       PWM1->PWMCR |=1<<0;
  83. }

  84. /*
  85.    * @description        : 设置Sample寄存器,Sample数据会写入到FIFO中,所谓的
  86.    *                    Sample寄存器,就相当于比较寄存器,假如PWMCR中的POUTC
  87.    *                    设置为00的时候。当PWM计数器中的计数值小于Sample的时候
  88.    *                    就会输出高电平,当PWM计数器值大于Sample的时候输出底电
  89.    *                    平,因此可以通过设置Sample寄存器来设置占空比。
  90.    * @param -  value:寄存器值,范围0~0XFFFF
  91.    * @return         : 无
  92.    */
  93. void pwm1_setsample_value(unsignedint value)
  94. {
  95.       PWM1->PWMSAR =(value &0XFFFF);
  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.   */
  104. void pwm1_setperiod_value(unsignedint value)
  105. {
  106. unsignedint regvalue =0;

  107. if(value <2)
  108.          regvalue =2;
  109. else
  110.          regvalue = value -2;
  111.      PWM1->PWMPR =(regvalue &0XFFFF);
  112. }

  113. /*
  114.   * @description             : 设置PWM占空比
  115.   * @param -  value          : 占空比0~100,对应0%~100%
  116.   * @return                  : 无
  117.   */
  118. void pwm1_setduty(unsignedchar duty)
  119. {
  120. unsignedshort preiod;
  121. unsignedshort sample;

  122.      backlight_dev.pwm_duty = duty;
  123.      preiod = PWM1->PWMPR +2;
  124.      sample = preiod * backlight_dev.pwm_duty /100;
  125.      pwm1_setsample_value(sample);
  126. }
复制代码
    文件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文件代码
  1. /**************************************************************
  2. Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
  3. 文件名   : mian.c
  4. 作者     : 左忠凯
  5. 版本     : V1.0
  6. 描述     : I.MX6U开发板裸机实验21 背光PWM实验
  7. 其他     : 我们使用手机的时候背光都是可以调节的,同样的I.MX6U-ALPHA
  8. 开发板的LCD背光也是可以调节,LCD背光就相当于一个LED灯。
  9.            LED灯的亮灭可以通过PWM来控制,本实验我们就来学习一下如何
  10. 通过PWM来控制LCD的背光。
  11. 论坛     : www.openedv.com
  12. 日志     : 初版V1.0 2019/1/21 左忠凯创建
  13. **************************************************************/
  14.   #include "bsp_clk.h"
  15.   #include "bsp_delay.h"
  16.   #include "bsp_led.h"
  17.   #include "bsp_beep.h"
  18.   #include "bsp_key.h"
  19.   #include "bsp_int.h"
  20.   #include "bsp_uart.h"
  21.   #include "bsp_lcd.h"
  22.   #include "bsp_lcdapi.h"
  23. #include "bsp_rtc.h"
  24. #include "bsp_backlight.h"
  25. #include "stdio.h"

  26. /*
  27.   * @description        : main函数
  28.   * @param                : 无
  29.   * @return               : 无
  30.   */
  31. int main(void)
  32. {
  33.         unsignedchar keyvalue =0;
  34.         unsignedchar i =0;
  35.         unsignedchar state = OFF;
  36.         unsignedchar duty =0;

  37.         int_init();                /* 初始化中断(一定要最先调用!)        */
  38.         imx6u_clkinit();        /* 初始化系统时钟        */
  39.         delay_init();        /* 初始化延时        */
  40.         clk_enable();        /* 使能所有的时钟        */
  41.         led_init();        /* 初始化led                           */
  42.         beep_init();        /* 初始化beep                          */
  43.         uart_init();        /* 初始化串口,波特率115200         */
  44.         lcd_init();        /* 初始化LCD                           */
  45.                 backlight_init();        /* 初始化背光PWM                       */

  46.         tftlcd_dev.forecolor = LCD_RED;
  47.         lcd_show_string(50,10,400,24,24,
  48. (char*)"ALPHA-IMX6U BACKLIGHT PWM TEST");
  49.         lcd_show_string(50,40,400,24,24,(char*)"PWM Duty:   %");
  50.         tftlcd_dev.forecolor = LCD_BLUE;

  51.         /* 设置默认占空比 10% */
  52.         duty =10;
  53.         lcd_shownum(158,40, duty,3,24);
  54.         pwm1_setduty(duty);

  55.                 while(1)
  56.         {
  57.         keyvalue = key_getvalue();
  58.         if(keyvalue == KEY0_VALUE)
  59.         {
  60.                 duty +=10;                /* 占空比加10%         */
  61.                 if(duty >100)                /* 如果占空比超过100%,重新从10%开始 */
  62.                 duty =10;
  63.                 lcd_shownum(158,40, duty,3,24);
  64.                 pwm1_setduty(duty);        /* 设置占空比        */
  65.                 }

  66.         delayms(10);
  67.         i++;
  68.         if(i ==50)
  69.         {
  70.                 i =0;
  71.                 state =!state;
  72.                 led_switch(LED0,state);
  73.         }
  74.         }
  75.         return0;
  76. }
复制代码
    第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. 第34行调用函数backlight_init初始化屏幕背光PWM。第44行设置背光PWM默认占空比为10%。在main函数中读取按键值,如果KEY0按下的话就将PWM信号的占空比增加10%,当占空比超过100%的时候就重回到10%,重新开始。总的来说,main.c的内容还是很简单的。
  2. 29.4编译下载验证
  3. 29.4.1 编写Makefile和链接脚本
  4. 修改Makefile中的TARGET为backlight,然后在在INCDIRS和SRCDIRS中加入“bsp/rtc”,修改后的Makefile如下:
  5. 示例代码29.4.1 Makefile代码
  6.   CROSS_COMPILE         ?= arm-linux-gnueabihf-
  7.   TARGET                  ?= backlight

  8. /* 省略掉其它代码...... */

  9.   INCDIRS        :=        imx6ul \\
  10.                 stdio/include \\
  11.                 bsp/clk \\
  12.                 bsp/led \\
  13.                 bsp/delay  \\
  14.                 bsp/beep \\
  15.                 bsp/gpio \\
  16.                 bsp/key \\
  17.                  bsp/exit \\
  18.                 bsp/int \\
  19.                 bsp/epittimer \\
  20.                 bsp/keyfilter \\
  21.                 bsp/uart \\
  22.                 bsp/lcd \\
  23.                 bsp/rtc \\
  24.                 bsp/i2c \\
  25.                 bsp/ap3216c \\
  26.                  bsp/spi \\
  27.                 bsp/icm20608 \\
  28.                 bsp/touchscreen \\
  29.                 bsp/backlight

  30. SRCDIRS:=        project \\
  31.                 stdio/lib \\
  32.                 bsp/clk \\
  33.                 bsp/led \\
  34.                  bsp/delay \\
  35.                 bsp/beep \\
  36.                 bsp/gpio \\
  37.                 bsp/key \\
  38.                 bsp/exit \\
  39.                 bsp/int \\
  40.                 bsp/epittimer \\
  41.                 bsp/keyfilter \\
  42.                 bsp/uart \\
  43.                 bsp/lcd \\
  44.                 bsp/rtc \\
  45.                 bsp/i2c \\
  46.                 bsp/ap3216c \\
  47.                 bsp/spi \\
  48.                 bsp/icm20608 \\
  49.                 bsp/touchscreen \\
  50.                 bsp/backlight

  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卡中,命令如下:
  1. chmod 777 imxdownload                    //给予imxdownload可执行权限,一次即可

  2. ./imxdownload backlight.bin /dev/sdd   //烧写到SD卡中
复制代码
       烧写成功以后将SD卡插到开发板的SD卡槽中,然后复位开发板,默认背光PWM是10%,PWM信号波形如图29.4.2.1所示:
image016.jpg
图29.4.2.110%占空比PWM信号
       从图29.4.2.1可以看出,此时背光PWM信号的频率为1.00KHz,占空比是10.02%,和我们代码中配置的一致,此时LCD的屏幕显示如图29.4.2.2所示:
image018.jpg
图29.4.2.210%占空比屏幕亮度
       图29.4.2.2就是PWM占空比为10%的LCD屏幕显示,可以看出屏幕亮度很低,甚至可以看到屏幕上拍照人的倒影。因为拍照的原因,实际亮度跟实际情况可能会有少许差别。
       我们将PWM的占空比调节到90%,此时的LCD屏幕亮度肯定会很亮,如图29.4.2.3所示:
image020.jpg
图29.4.2.390%占空比屏幕亮度
       图29.4.2.3的屏幕亮度相比图29.4.2.2就要高很多,这个就是LCD背光调节的原理,采用PWM波形来完成,通过调整占空比即可完成亮度调节。

       至此,I.MX6U-ALPHA开发板的所有裸机例程已经全部完成了,通过这几十个裸机例程,我们对I.MX6UL/ULL这款芯片的外设有了一个基本的了解,为我们以后学习UbootLinux驱动打下了坚实的基础。





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2019-12-20
在线时间
18 小时
发表于 2019-12-31 14:31:53 | 显示全部楼层
“-march=armv7-a  -mfpu=neon-vfpv4  -mfloat-abi=hard”《Makefile》这行写错了,两个字母写反了
回复 支持 反对

使用道具 举报

14

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2019-7-11
在线时间
42 小时
发表于 2020-3-10 12:07:37 | 显示全部楼层
这里讲的是裸机实验,有没有linux版本的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 08:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表