打印
[AT32L021]

【AT-START-L021测评】点个组合RGB点灯-2

[复制链接]
905|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
trucyw|  楼主 | 2024-12-12 18:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 trucyw 于 2024-12-25 16:41 编辑

P9813驱动RGB led,示意图来一波

使用AT32L021的PB7和PA9
#define RGBLED_SCL_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_7)
#define RGBLED_SCL_Set() gpio_bits_set(GPIOB,GPIO_PINS_7)

#define RGBLED_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_9)
#define RGBLED_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_9)

IO已经确认了接下来就需要了解P9813怎么来控制

以上图示可以看出我们显示一个颜色需要发送96个clk,具体解析如下
① 前32 位“0”为起始帧,在Cin 上升沿时打入,并且时序DIN要先于CIN;
② 标志位为两个“1”;
③ 校验数据“B7’”与“B6’”为蓝色灰度数据的“B7”与“B6”的反码;
④ 灰度级数据要高位先入,并且是蓝绿红顺序。
由此可得,MCU需要发送的数据
32位0起始信号: 0000 0000 0000 0000 0000 0000 0000 0000
第一点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
第二点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b)
{
        RGBLED_Send32Zero();//发送前32bit “0”起始帧
        RGBLED_DataDealWithAndSend(r, g, b);//第一个32bit灰度数据
        RGBLED_DataDealWithAndSend(r, g, b);//第二个32bit灰度数据
}

废话少一些,直接上波形


红色就出来了
其他颜色依此方法同样操作即可
P9813驱动RGB到此就完成了

79893675ab4bb3ca69.png (88.64 KB )

79893675ab4bb3ca69.png

使用特权

评论回复
沙发
TimeRiddle| | 2024-12-19 09:38 | 只看该作者
代码贴一下呗

使用特权

评论回复
板凳
trucyw|  楼主 | 2024-12-19 16:59 | 只看该作者
#ifndef __RGBLED_H

#define __RGBLED_H         
#include "at32l021_gpio.h"       
//#include "Delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//������
//RGBLED��������          
//////////////////////////////////////////////////////////////////////////////////
#define RGBLED_SCL_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_7)
#define RGBLED_SCL_Set() gpio_bits_set(GPIOB,GPIO_PINS_7)

#define RGBLED_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_9)
#define RGBLED_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_9)

void RGBLED_config(void);
void RGBLED_SHOW(void);//RGB��IO��ʼ��
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b);//RGB����ɫ����

#endif



#include "rgbled.h"
#include "Delay.h"

void RGBLED_config(void)
{       
        gpio_init_type gpio_initstructure;
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
        crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
       
        //gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_0);
  //gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_0);
       
        gpio_default_para_init(&gpio_initstructure);
        //RGBLED�ܽų�ʼ��
        //din data
       
        gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
        gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
        gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_initstructure.gpio_pins =GPIO_PINS_9;
        gpio_initstructure.gpio_pull = GPIO_PULL_DOWN;
        gpio_init(GPIOA,&gpio_initstructure);
        //cin

        gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
        gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
        gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_initstructure.gpio_pins =GPIO_PINS_7;
        gpio_initstructure.gpio_pull = GPIO_PULL_UP;
        gpio_init(GPIOB,&gpio_initstructure);
       
        RGBLED_SCL_Set();
        RGBLED_SDA_Set();

}
//////////////////////////////////////////////////////////////////////////////////         
//MB-024
//RGBLED��������         
//����ǰ32λ'0'��ʼ֡
void RGBLED_Send32Zero(void)
{
         uint8_t i;
       
         RGBLED_SDA_Clr();
       
         for(i=0;i<32;i++)
         {
                        RGBLED_SCL_Clr();//Delay_us(200);
                 
                        RGBLED_SCL_Set();//Delay_us(200);               
         }         
}

//��תǰ��λ�ĻҶ�ֵ
uint8_t RGBLED_TakeAntiCode(uint8_t dat)
{
        uint8_t tmp = 0;
       
        tmp = ((~dat) & 0xC0) >> 6;
        return tmp;
}

//���ͻҶ�����
void RGBLED_DatSend(uint32_t dx)
{
        uint8_t i;
        for(i=0;i<32;i++)
        {
                if((dx & 0x80000000) !=0)
                RGBLED_SDA_Set();
                else
                RGBLED_SDA_Clr();
               
                dx<<=1;
                RGBLED_SCL_Clr();//Delay_us(200);
                RGBLED_SCL_Set();///Delay_us(200);
        }       
}

//���ݴ����뷢��
//r;��ɫֵ 0~255
//g:��ɫֵ 0~255
//b:��ɫֵ 0~255  
void RGBLED_DataDealWithAndSend(uint8_t r,uint8_t g,uint8_t b)
{
         
        uint32_t dx=0;
       
        dx |= (uint32_t)0x03 << 30;  //ǰ��λ'1'λ��־λ
        dx |= (uint32_t)RGBLED_TakeAntiCode(b) << 28;
        dx |= (uint32_t)RGBLED_TakeAntiCode(g) << 26;
        dx |= (uint32_t)RGBLED_TakeAntiCode(r) << 24;
        dx |= (uint32_t)b << 16;
        dx |= (uint32_t)g << 8;
        dx |= r;
       
        RGBLED_DatSend(dx);//��������
}
//RGB�ƿ��ƺ���
//r;��ɫֵ 0~255
//g:��ɫֵ 0~255
//b:��ɫֵ 0~255
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b)
{
        RGBLED_Send32Zero();//����ǰ32λ'0'��ʼ֡
        RGBLED_DataDealWithAndSend(r, g, b);//���͵�һ��32bit�Ҷ�����
        RGBLED_DataDealWithAndSend(r, g, b);//���͵ڶ���32bit�Ҷ�����
}

//RGB�Ƴ�ʼ������
void RGBLED_SHOW(void)
{
//        RGBLED_config();
        RGBLED_Show(255,0,0);//R
        Delay_ms(100);
        RGBLED_Show(0,255,0);//G
        Delay_ms(100);
        RGBLED_Show(0,0,255);//B
        Delay_ms(100);
        RGBLED_Show(255,255,255);//W
        Delay_ms(100);
        RGBLED_Show(0,0,0);//�ر�RGB��
        //while(1);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

723

帖子

2

粉丝