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引脚。

../../_images/1627566646705.png

../../_images/1627566836405.png

../../_images/image-20210812110256987.png

../../_images/image-20210812110941209.png

源码文件分析

工程参见【02.led_rgb】如下

../../_images/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文件

#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<<RGB_RED_LED_GPIO_PIN);  		//设置GPIO1_04为输出模式
    GPIO1->DR   |= (1<<RGB_RED_LED_GPIO_PIN);    	//设置GPIO1_04输出电平为高电平

    GPIO4->GDIR |= (1<<RGB_GREEN_LED_GPIO_PIN);  	//设置GPIO4_20为输出模式
    GPIO4->DR   |= (1<<RGB_GREEN_LED_GPIO_PIN);    	//设置GPIO4_20输出电平为高电平

    GPIO4->GDIR |= (1<<RGB_BLUE_LED_GPIO_PIN);  	//设置GPIO4_19为输出模式
    GPIO4->DR   |= (1<<RGB_BLUE_LED_GPIO_PIN);    	//设置GPIO4_19输出电平为高电平


}

bsp_led_rgb.h文件

#ifndef __BSP_LED_RGB_H
#define __BSP_LED_RGB_H


#if defined(__cplusplus)
extern "C" {
#endif  

#include "imx6ul.h"

/*LED GPIO端口、引脚号及IOMUXC复用宏定义*/
#define RGB_RED_LED_GPIO                GPIO1
#define RGB_RED_LED_GPIO_PIN            (4U)
#define RGB_RED_LED_IOMUXC              IOMUXC_GPIO1_IO04_GPIO1_IO04

#define RGB_GREEN_LED_GPIO              GPIO4
#define RGB_GREEN_LED_GPIO_PIN          (20U)
#define RGB_GREEN_LED_IOMUXC            IOMUXC_CSI_HSYNC_GPIO4_IO20

#define RGB_BLUE_LED_GPIO               GPIO4
#define RGB_BLUE_LED_GPIO_PIN           (19U)
#define RGB_BLUE_LED_IOMUXC             IOMUXC_CSI_VSYNC_GPIO4_IO19






#define LED_RGB_RED_ON()    RGB_RED_LED_GPIO->DR &= ~(1<<RGB_RED_LED_GPIO_PIN) // 红灯亮
#define LED_RGB_RED_OFF()   RGB_RED_LED_GPIO->DR |= (1<<RGB_RED_LED_GPIO_PIN)  // 红灯灭
#define LED_RGB_RED_TOG()   RGB_RED_LED_GPIO->DR ^= (1<<RGB_RED_LED_GPIO_PIN)  // 

#define LED_RGB_BLUE_ON()   RGB_BLUE_LED_GPIO->DR &= ~(1<<RGB_BLUE_LED_GPIO_PIN)// 蓝灯亮
#define LED_RGB_BLUE_OFF()  RGB_BLUE_LED_GPIO->DR |= (1<<RGB_BLUE_LED_GPIO_PIN) // 蓝灯灭
#define LED_RGB_BLUE_TOG()  RGB_BLUE_LED_GPIO->DR ^= (1<<RGB_BLUE_LED_GPIO_PIN) // 

#define LED_RGB_GREE_ON()   RGB_GREEN_LED_GPIO->DR &= ~(1<<RGB_GREEN_LED_GPIO_PIN) //绿灯亮
#define LED_RGB_GREE_OFF()  RGB_GREEN_LED_GPIO->DR |= (1<<RGB_GREEN_LED_GPIO_PIN)  //绿灯灭
#define LED_RGB_GREE_TOG()  RGB_GREEN_LED_GPIO->DR ^= ~(1<<RGB_GREEN_LED_GPIO_PIN)

#if defined(__cplusplus)
}
#endif  

#endif  

main.c文件


#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led_rgb.h"

/*
 * @description	: mian函数
 * @param 		: 无
 * @return 		: 无
 */
uint32_t a = 0; 		// bss段
uint32_t b = 1; 		// data段
uint32_t b;     		// bss 段
const uint32_t c=1;     // rodata 段
 

int main(void)
{
	clk_enable();		/* 使能所有的时钟 			*/
	rgb_led_init();		/* 初始化led 			*/

	while(1)			
	{	
	 
	 	LED_RGB_RED_ON();	
		LED_RGB_BLUE_OFF();
		LED_RGB_GREE_OFF();
		delay(1000);
		LED_RGB_BLUE_ON();
		LED_RGB_RED_OFF();	
		LED_RGB_GREE_OFF();
		delay(1000);
		LED_RGB_GREE_ON();
		LED_RGB_BLUE_OFF();
		LED_RGB_RED_OFF();	
		delay(1000);
		
	}

	return 0;
}

编译下载

make clean
make

编译完后生成led_rgb.imx和led_rgb_img文件,我们使用usb启动,下载led_rgb.imx运行即可

实验现象

可以看到rgb灯交替闪烁。