CC2530撰写ws2812驱动 使用中断和模模式

平台

CC2530

资料查找

官方的文档

在这里插入图片描述
在这里插入图片描述

网上的文档

在这里插入图片描述
可见同一个芯片,文档的驱动有不同的差别,低电平的高电平时间虽然有重叠部分,但仍有有很大的差异。所以为了在使用的增加可调性,我将定义一个变量来设置高低电平的高低电平时间。

时钟确定

由资料知,虽然资料存在差异,但是仍有很大的重叠区域,CC2530的默认tick clk是16MHz,最大能达到32MHz. 16MHz周期是62.5ns.再进行2分频8MHz。T0H则设定为3125ns=375ns.T0L=6125ns=750ns.使用定时器T3,使用中断编写。

我的原理

低层代码我是这么构思的定时器T3每375ns进一次中断,把一个0和1分别分解成100和110,这样每进一次中断分别判断是1还是0这样直接拉高低电平。

测试代码

//字符串处理测试程序

#include<stdio.h>

int main(void)
{
	_Bool BitData = 0;
	char GrbData[3] = {0x80,0xff,0x00};
	int i = 0,j = 0, k=0, Res = 0, temp = 0X80,
			TempData[24] ={0},ResData[72] = {0},
			TH[3] = {1,1,0}, TL[3]={1,0,0};

	// for (i=0; i<8; i++)
	// {
	// 	temp >>= 1;
	// 	printf("%x \n", temp);
	// }
	// Res = GrbData[0] & 0x40;
	// printf("%d", Res);

	for (i=0; i<3; i++)
	{
		for (j=0; j<8; j++)
		{
			BitData = GrbData[i] & temp; 
			if (BitData)
			{
				for (k=0; k<3; k++)
				{
					ResData[(8*i+j)*3+k] = TH[k];
				}
			}
			else
			{
				for (k=0; k<3; k++)
				{
					ResData[(8*i+j)*3+k] = TL[k];
				}
			}
			
			printf("%d %x \n", BitData, temp);
			temp >>= 1;
			TempData[8*i+j] = BitData;
		}
		temp = 0X80;
		printf("\n");
	}
	for(i=0; i<24; i++)
	{
		printf("%d ", TempData[i]);
	}
	printf("\n");
	for(i=0; i<72; i++)
	{
		printf("%d ", ResData[i]);
	}
	getchar();
	return 0;
}

测试结果

在这里插入图片描述

讲解

比如一个颜色的rgb值(0x80,0xff,0x00)= >(1000 0000, 1111 1111, 0000 0000)=>(1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0)
在每一次显示前处理一下rgb的值就行了。

T3定时器设置

代码

#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

uchar GrbData[3] = {0x00, 0xff, 0xff},TH[3] = {1,1,0}, TL[3]={1,0,0};
uchar ResData[72] = {1,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0};

uint count = 0;

void InitLed(void)
{
  P1DIR |= 0x01; // 0000 0001
  P1_0 = 0;
}

void InitT3()
{        
  CLKCONCMD &=~0x40; //1011 1111
  while(CLKCONSTA & 0x40);
  CLKCONCMD &= 0xC0;//11 00 0 000
    
  InitLed();
  EA = 1;
  T3IE = 1;
  T3IF = 0;
  T3CCTL0 |=0x44; //0000 0100
  T3CTL = 0x4A;//0000 11 10模模式 0100 1010
  T3CC0 = 3;
  T3CTL |= 0x10;
}

void PreProcessData(void)
{
  uchar i,j,k,temp = 0x80;
  _Bool BitData = 0;
  
  for (i=0; i<3; i++)
  {
    for (j=0; j<8; j++)
    {
      BitData = GrbData[i] & temp; 
      if (BitData)
      {
        for (k=0; k<3; k++)
        {
          ResData[(8*i+j)*3+k] = TH[k];
        }
      }
      else
      {
        for (k=0; k<3; k++)
        {
          ResData[(8*i+j)*3+k] = TL[k];
        }
      }
      temp >>= 1;
    }
  }
}
#pragma vector = T3_VECTOR 
__interrupt void T3_ISR(void) 
{

//    IRCON = 0x00;            //清中断标志, 也可由硬件自动完成
    T3IF = 0;
    count++;
    if (count >= 72)
    {
      count = 0;
    } 
    
    if (ResData[count]) //数字为高
    {
      P1_0 = 1;
    }
    else 
    {
      P1_0 = 0;
    }

}


void main()
{
  InitLed();
  PreProcessData();
  InitT3();
  while(1)
  {
  }
}  

效果

在这里插入图片描述
搞了一整天的,我真的想哭了。虽然是8051的内核,但是从系统时钟设置,到T3的模模式,仍有许多要学的。慢慢来吧。谢谢在网上分享的人,不然不可能在一天解决问题。2020-6-22-00点01分,背单词,然后睡觉,晚安,兄弟萌。

遇到的问题

T3 无法启动

感谢帮我解决了T3的配置问题
MCU_CC2530的定时器1模模式配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值