当前位置:   article > 正文

6ULL裸机使用语言点亮LED灯_tft特性中hys

tft特性中hys

一、硬件原理分析

        

 由图可知当LED0为低电平时,发光二极管即可点亮。LED0对应的是GPIO3,而GPIO3即为GPIO1_IO03。所以,在GPIO1_IO03输出0就点亮,输出1就熄灭。

二、程序编写

需要对GPIO1_IO03进行如下配置:

        1.使能GPIO1时钟。

        GPIO1 的时钟由 CCM_CCGR1 bit27 bit26 这两个位控制,将这两个位都设置位 11

可。

 具体的开关方法在CCM_CCGR0中有介绍,如下:

 大概代表了每一位都有这四种设置模式:

         2.设置GPIO1_IO03的功能复用。

        找到GPIO1_IO03的复用配置寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址为

0X020E0068 ,然后设置此寄存器,将 GPIO1_IO03 这个 IO 复用为 GPIO 功能,也就是 ALT5

 

         3.配置GPIO1_IO03

 

HYS(bit16):对应图 8.1.4.2 中 HYS,用来使能迟滞比较器,当 IO 作为输入功能的时候有
效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使
能此位。此位为 0 的时候禁止迟滞比较器,为 1 的时候使能迟滞比较器。
PUS(bit15:14):对应图 8.1.4.2 中的 PUS,用来设置上下拉电阻的,一共有四种选项可以选
择,如表 所示:

 PUE(bit13):图 8.1.4.2 没有给出来,当 IO 作为输入的时候,这个位用来设置 IO 使用上下
拉还是状态保持器。当为 0 的时候使用状态保持器,当为 1 的时候使用上下拉。状态保持器在
IO 作为输入的时候才有用,顾名思义,就是当外部电路断电以后此 IO 口可以保持住以前的状
态。
PKE(bit12):对应图 8.1.4.2 中的 PKE,此为用来使能或者禁止上下拉/状态保持器功能,为
0 时禁止上下拉/状态保持器,为 1 时使能上下拉和状态保持器。
ODE(bit11):对应图 8.1.4.2 中的 ODE,当 IO 作为输出的时候,此位用来禁止或者使能开
路输出,此位为 0 的时候禁止开路输出,当此位为 1 的时候就使能开路输出功能。SPEED(bit7:6):对应图中的 SPEED,当 IO 用作输出的时候,此位用来设置 IO 速
度,设置如表 所示

 DSE(bit5:3):对应图 8.1.4.2 中的 DSE,当 IO 用作输出的时候用来设置 IO 的驱动能力, 总共有 8 个可选选项,如表 8.1.4.3 所示:

 SRE(bit0)对应图 8.1.4.2 中的 SRE,设置压摆率,当此位为 0 的时候是低压摆率,当为 1 的时候是高压摆率。这里的压摆率就是 IO 电平跳变所需要的时间,比如从 0 1 需要多少时 间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。如 果你的产品要过 EMC 的话那就可以使用小的压摆率,因为波形缓和,如果你当前所使用的 IO 做高速通信的话就可以使用高压摆率。

2.程序编写:

创建工程文件:

C 语言部分有两个文件 main.c main.hmain.h 里面主要是定义的寄存器地址,在 main.h

里面输入代码:

  1. #ifndef __MAIN_H
  2. #define __MAIN_H
  3. #define CCM_CCGR0 *((volatile unsigned int *)0x020c4068)
  4. #define CCM_CCGR1 *((volatile unsigned int *)0x020c406c)
  5. #define CCM_CCGR2 *((volatile unsigned int *)0x020c4070)
  6. #define CCM_CCGR3 *((volatile unsigned int *)0x020c4074)
  7. #define CCM_CCGR4 *((volatile unsigned int *)0x020c4078)
  8. #define CCM_CCGR5 *((volatile unsigned int *)0x020c407c)
  9. #define CCM_CCGR6 *((volatile unsigned int *)0x020c4080)
  10. /*
  11. *IOMUX相关寄存器
  12. */
  13. #define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0x020e0068)
  14. #define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0x020e02f4)
  15. /*
  16. *GPIO1相关寄存器地址
  17. */
  18. #define GPIO1_DR *((volatile unsigned int *)0x0209c000)
  19. #define GPIO1_GDIR *((volatile unsigned int *)0x0209c004)
  20. #define GPIO1_PSR *((volatile unsigned int *)0x0209c008)
  21. #define GPIO1_IRC1 *((volatile unsigned int *)0x0209c00c)
  22. #define GPIO1_IRC2 *((volatile unsigned int *)0x0209c010)
  23. #define GPIO1_IMR *((volatile unsigned int *)0x0209c014)
  24. #define GPIO1_ISR *((volatile unsigned int *)0x0209c018)
  25. #define GPIO1_EDGE_SELECT *((volatile unsigned int *)0x0209c01c)
  26. #endif
main.h 中我们以宏定义的形式定义了要使用到的所有寄存器,后面的数字就是其地址,
比如 CCM_CCGR0 寄存器的地址就是 0X020C4068 ,这个很简单,很好理解。 接下看一下 main.c 文件,在 main.c 里面输入如下所示代码:
  1. #include "main.h"
  2. /*使能外设时钟*/
  3. void clk_enable(void){
  4. CCM_CCGR1 = 0xffffffff;
  5. CCM_CCGR2 = 0xffffffff;
  6. CCM_CCGR3 = 0xffffffff;
  7. CCM_CCGR4 = 0xffffffff;
  8. CCM_CCGR5 = 0xffffffff;
  9. CCM_CCGR6 = 0xffffffff;
  10. }
  11. /*初始化LED*/
  12. void led_init(void){
  13. SW_MUX_GPIO1_IO03 = 0x5; /*复用为GPIO1_IO03 */
  14. SW_PAD_GPIO1_IO03 = 0x10b0; /*设置GPIO1_IO03电器属性*/
  15. /*GPIO初始化*/
  16. GPIO1_GDIR = 0x8; /*设置为输出*/
  17. GPIO1_DR = 0x0; /*打开LED灯*/
  18. }
  19. /*短延时*/
  20. void delay_short(volatile unsigned int n){
  21. while(n--) {}
  22. }
  23. /*延时,一次循环大概是1ms,主频396MHz
  24. * n : 延时ms数
  25. */
  26. void delay(volatile unsigned int n){
  27. while (n--)
  28. {
  29. delay_short(0x7ff);
  30. }
  31. }
  32. /*打开LED灯*/
  33. void led_on(){
  34. GPIO1_DR &= ~(1<<3); /*bit3清零*/
  35. }
  36. /*关闭LED灯*/
  37. void led_off(){
  38. GPIO1_DR |= (1<<3); /*bit3值置1*/
  39. }
  40. int main(void) {
  41. clk_enable(); /*使能外设时钟*/
  42. led_init(); /*初始化LED*/
  43. /*初始化LED */
  44. /*设置LED*/
  45. while(1){
  46. led_on();
  47. delay(500);
  48. led_off();
  49. delay(500);
  50. };
  51. return 0;
  52. }
新建 Makefile 文件,在 Makefile 文件里面输入如下内容:
  1. objs = start.o main.o
  2. ledc.bin : $(objs)
  3. arm-linux-gnueabihf-ld -Timx6u.lds $^ -o ledc.elf
  4. arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
  5. arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
  6. %.o : %.c
  7. arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
  8. %.o : %.S
  9. arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
  10. clean :
  11. rm -rf *.o ledc.bin ledc.elf ledc.dis

设置C语言运行环境,新建文件start.S:

  1. .global _start
  2. _start:
  3. /* 设置处理器进入SVC模式*/
  4. mrs r0, cpsr /*读取cpsr到r0 */
  5. bic r0, r0, #0x1f /*清除cpsr的bit4-0 */
  6. orr r0, r0, #0x13 /*使用svc模式*/
  7. msr cpsr, r0 /*将r0写入cpsr */
  8. /*设置SP指针 */
  9. ldr sp, =0x80200000
  10. b main /*跳转到C语言的main函数*/
使用软件 imxdownload 将编译出来的 ledc.bin 烧写到 SD 卡中,命令如下:
chmod 777 imxdownload
// 给予 imxdownload 可执行权限,一次即可
./imxdownload ledc.bin /dev/sdd
// 烧写到 SD 卡中
烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板,如果代码运行正常的
LED0 就会以 500ms 的时间间隔亮灭。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/772707
推荐阅读
相关标签
  

闽ICP备14008679号