# RGB LED试验 ## 硬件分析 如图所示,RGB灯IO为 - LED_R :GPIO1_IO04:搜索原理图得到 ; - LED_G :GPIO4_IO20:参见《i.MX 6UltraLite Applications Processor Reference Manual》的CSI_HSYNC复用得到CSI_HSYNC就是GPIO4_IO20引脚; - LED_B :GPIO4_IO19:参见《i.MX 6UltraLite Applications Processor Reference Manual》的CSI_VSYNC复用得到CSI_VSYNC就是GPIO4_IO19引脚。 ![](media/1627566646705.png) ![](media/1627566836405.png) ![](media/image-20210812110256987.png) ![](media/image-20210812110941209.png) ## 源码文件分析 工程参见【02.led_rgb】如下 ![](media/image-20210814142641340.png) ### start.S文件 ``` .text //代码段 .align 4 //设置字节对齐 .global _start //定义全局变量 _start: //程序的开始 b reset //跳转到reset标号处 reset: mrc p15, 0, r0, c1, c0, 0 /*读取CP15系统控制寄存器 */ bic r0, r0, #(0x1 << 12) /* 清除第12位(I位)禁用 I Cache */ bic r0, r0, #(0x1 << 2) /* 清除第 2位(C位)禁用 D Cache */ bic r0, r0, #0x2 /* 清除第 1位(A位)禁止严格对齐 */ bic r0, r0, #(0x1 << 11) /* 清除第11位(Z位)分支预测 */ bic r0, r0, #0x1 /* 清除第 0位(M位)禁用 MMU */ mcr p15, 0, r0, c1, c0, 0 /* 将修改后的值写回CP15寄存器 */ ldr sp, =0x80200000 /* .lds中设置链接地址为0x8010 0000,设置栈顶0x8020 0000 故预留1M的空间 */ bl clean_bss /* 切记:代码里面必须有bss段(即存在未初始化的全局变量),否则这里只要调用就死机*/ /* 跳转到主函数 */ // bl main /* 相对跳转,程序仍在DDR3内存中执行 */ ldr pc, =main /* 绝对跳转,程序在片内RAM中执行 */ halt: b halt clean_bss: /* 清除bss段 */ ldr r1, =__bss_start ldr r2, =__bss_end mov r3, #0 clean: str r3, [r1] add r1, r1, #4 cmp r1, r2 bne clean mov pc, lr ``` ### bsp_led_rgb.c文件 ```c #include "bsp_led_rgb.h" /*************************************************************** Copyright © flyrobot Co., Ltd. 1998-2019. All rights reserved. 文件名 : bsp_led.c 作者 : FlyRobot 版本 : V1.0 描述 : RGB驱动文件。 其他 : 无 日志 : 初版V1.0 ***************************************************************/ /* 所有引脚均使用同样的PAD配置 * 配置说明 : * 转换速率: 转换速率慢 * 驱动强度: R0/6 * 带宽配置 : medium(100MHz) * 开漏配置: 关闭 * 拉/保持器配置: 关闭 * 拉/保持器选择: 保持器(上面已关闭,配置无效) * 上拉/下拉选择: 100K欧姆下拉(上面已关闭,配置无效) * 滞回器配置: 关闭 */ #define LED_PAD_CONFIG_DATA (SRE_0_SLOW_SLEW_RATE| \ DSE_6_R0_6| \ SPEED_2_MEDIUM_100MHz| \ ODE_0_OPEN_DRAIN_DISABLED| \ PKE_0_PULL_KEEPER_DISABLED| \ PUE_0_KEEPER_SELECTED| \ PUS_0_100K_OHM_PULL_DOWN| \ HYS_0_HYSTERESIS_DISABLED) void rgb_led_init() { CCM_CCGR1_CG13(0x3);//开启GPIO1的时钟 CCM_CCGR3_CG6(0x3); //开启GPIO4的时钟 /*设置 红灯 引脚的复用功能以及PAD属性*/ IOMUXC_SetPinMux(RGB_RED_LED_IOMUXC,0); IOMUXC_SetPinConfig(RGB_RED_LED_IOMUXC, LED_PAD_CONFIG_DATA); /*设置 绿灯 引脚的复用功能以及PAD属性*/ IOMUXC_SetPinMux(RGB_GREEN_LED_IOMUXC,0); IOMUXC_SetPinConfig(RGB_GREEN_LED_IOMUXC, LED_PAD_CONFIG_DATA); /*设置 蓝灯 引脚的复用功能以及PAD属性*/ IOMUXC_SetPinMux(RGB_BLUE_LED_IOMUXC,0); IOMUXC_SetPinConfig(RGB_BLUE_LED_IOMUXC, LED_PAD_CONFIG_DATA); GPIO1->GDIR |= (1<DR |= (1<GDIR |= (1<DR |= (1<GDIR |= (1<DR |= (1<DR &= ~(1<DR |= (1<DR ^= (1<DR &= ~(1<DR |= (1<DR ^= (1<DR &= ~(1<DR |= (1<DR ^= ~(1<