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




源码文件分析
工程参见【02.led_rgb】如下

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灯交替闪烁。