平台
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分,背单词,然后睡觉,晚安,兄弟萌。