This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430G2553:ZigBee 至 MSP430G2553 LED

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP-GANG, MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/585841/ccs-msp430g2553-zigbee-to-msp430g2553-leds

器件型号:MSP430G2553
主题中讨论的其他器件:MSP-GANG

工具/软件:Code Composer Studio

您好!

我正在尝试找到帮助完成项目的起点和代码。 我的项目是让 Zigbee 向 MSP430微控制器发送多个 JSSON 字符串。 这些灯串是 LED 的序列、需要记录在微控制器中的表或结构上。 我有用于灯光秀的 TI 演示代码、但运行了一个 UART 缓冲器。  

#include
#include

/*
* main.c
*

//#define demo_mode

#define LEDDIR P2DIR
#define LEDOUT P2OUT
#define 红色 BIT0
#define 绿色 BIT1
#define 蓝色 BIT2
#define All_LED (红色|绿色|蓝色)

#define P1UNUSED (BIT0 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7);
#define P2UNUSED (BIT3 | BIT4 | BIT5 | BIT6 | BIT4);

#define MAXLEVEL 256 //用于颜色复用
#define MAXINTENSITY 100//定义整体亮度

#define MAX_COMMAND_LENGTH 15.

8MHz 时的// 100Hz LED 刷新率、=每个完整 LED 周期80000个时钟
//每个 LED 周期的亮度水平为50 =每个强度步长的1600个时钟
// 200个步长之间的时钟=每个步长的8种颜色级别,R、G、B = 3位颜色,每个= 9位颜色分辨率
// 25us 计时器中断

//函数原型

void ledOff();
void ledSet (uint8_t r、uint8_t g、uint8_t b、uint8_t bright);
void ledFade (uint8_t r、uint8_t g、uint8_t b、uint8_t Brightness1、
uint8_t Brightness2、uint16_t Delay_step);
void ledPulse (uint8_t r、uint8_t g、uint8_t b、uint8_t min_brightness、
uint8_t max_brightness、uint16_t delay_step);
void initUART();

//全局变量

INT8_t ledStatus;

uint8_t red_level;
uint8_t green_level;
uint8_t blue_level;
uint8_t 亮度;

uint8_t brightnation_count;
uint8_t level_count;

uint16_t 节拍;//已通过125us 间隔的计数器
uint16_t tickWakeupCount = 0;//在退出活动状态之前应通过多少个节拍(0 = SKIP)
uint8_t exitRoutine = 0;//标记以发出退出例程的信号以执行下一个操作

uint8_t uartRxBuffer[MAX_COMMAND_LENGTH];
uint8_t uartRxPtr = 0;
uint8_t uartFlag = 0;

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//设置时钟系统
BCSCTL1 = CALBC1_8MHZ;//将范围设置为8MHz
DCOCTL = CALDCO_8MHZ;//将 DCO 设置为8MHz
BCSCTL2 = SELM_0 | DIVM_0 | DIVS_0;//将 MCLK 设置为8MHz、将 SMCLK 设置为8MHz

inituart();

//加电时禁用所有 LED (驱动输出高电平)
LEDOUT |= all_LEDs;
LEDDIR |= All_LEDs;

//初始化未使用的 GPIO
P1OUT &=~P1UNUSED;
P1DIR |= P1UNUSED;
P2OUT &=~P2UNUSED;
P2DIR |= P2UNUSED;

//设置 RGB LED 控制的初始设置
RED_LEVEL = 0;
GREEN_LEVEL = 0;
blue_level = 0;
亮度= 0;
brightnation_count = 0;
level_count = 0;
节拍数= 0;

//将 Timer0配置为每200个时钟周期中断一次(8MHz = 25us 时)
TA0CCR0 = 199;// 200 - 1
TA0CTL = tassel_2 | ID_0 | MC_1 | TACLR;// SMCLK/1、清除计数、向上计数模式
TA0CCTL0 |= CCIE;

enable_interrupts ();

#ifdef demo_mode
//演示
亮度= 0;
uint8_t 索引= 0;

//白色、红色、橙色、黄色、蓝色
uint8_t r_array[5]={8、8、8、0};
uint8_t g_array[5]={8、0、3、8、0};
uint8_t b_array[5]={8、0、0、0、8};

while (1)

red_level = r_array[索引];
GREEN_LEVEL = g_array[索引];
blue_level = b_array[索引];

ledFade (r_array[索引]、g_array[索引]、b_array[索引]、
50、0、2000);

索引++;
if (索引>=5)

索引= 0;


其他

//主循环
while (1)

//检查 UART 完成标志(对于接收到的命令)
IF (uartFlag)

//检查接收到的命令
开关(uartRxBuffer[1])

//打开特定的颜色和亮度
情况0x01:
ledSet (uartRxBuffer[2]、uartRxBuffer[3]、uartRxBuffer[4]、
uartRxBuffer[5]);
中断;
//设置为将特定颜色从一个亮度级别淡出另一个亮度级别
情况0x02:
ledFade (uartRxBuffer[2]、uartRxBuffer[3]、uartRxBuffer[4]、
uartRxBuffer[5]、uartRxBuffer[6]、
((uartRxBuffer[7]<< 8)+ uartRxBuffer[8]);
中断;
//设置为反复地将恒定颜色从低亮度脉冲回到高亮度
情况0x03:
ledPulse (uartRxBuffer[2]、uartRxBuffer[3]、uartRxBuffer[4]、
uartRxBuffer[5]、uartRxBuffer[6]、
((uartRxBuffer[7]<< 8)+ uartRxBuffer[8]);
中断;
/*********
*在此处添加其他命令作为新的 case 语句
(小部分 /

//转到 LPM0等待更多串行命令
_bis_SR_register (LPM0_bits + GIE);

#endif

返回0;

void ledOff()

TA0CTL &=~MC_3;//停止计时器
TA0CTL |= TACLR;//重置计时器计数
TA0CCTL0 &=~CCIFG;//清除标志、如果置位

//禁用所有 LED (驱动输出高电平)
LEDOUT |= all_LEDs;

//重置所有值/计数器
level_count = 0;
亮度= 0;
brightnation_count = 0;
节拍数= 0;
tickWakeupCount = 0;

void ledSet (uint8_t r、uint8_t g、uint8_t b、uint8_t bright)

//清除 UART 标志
uartRxPtr = 0;
uartFlag = 0;

//关闭 LED
ledOff();

//指定特定颜色
red_level = r;
GREEN_LEVEL = g;
blue_level = b;
亮度=明亮;

//启动计时器以生成颜色
TA0CTL |= MC_1;

void ledFade (uint8_t r、uint8_t g、uint8_t b、uint8_t Brightness1、
uint8_t Brightness2、uint16_t Delay_step)

uint8_t change_amount;

//清除 UART 标志
uartRxPtr = 0;
uartFlag = 0;

//检查 LED 的衰减方向(较亮或较暗)
if (亮度1 >亮度2){
CHANGE_AMOUNT = 0xFF;
}否则{
CHANGE_AMOUNT = 1;

//关闭 LED
ledOff();

//指定特定颜色
red_level = r;
GREEN_LEVEL = g;
blue_level = b;
亮度=亮度1;

//启动计时器以生成颜色
TA0CTL |= MC_1;
exitRoutine = 0;

while (亮度!=亮度2)

IF (exitRoutine)

//接收到停止命令,退出例程
返回;

//设置唤醒计数
节拍数= 0;
tickWakeupCount = delay_step;

//转到 LPM0直到达到唤醒计数
LPM0;

//更新亮度级别
brightness += change_amount;

void ledPulse (uint8_t r、uint8_t g、uint8_t b、uint8_t min_brightness、
uint8_t max_brightness、uint16_t delay_step)

uint8_t i;

//清除 UART 标志
uartRxPtr = 0;
uartFlag = 0;

//关闭 LED
ledOff();

//指定特定颜色
red_level = r;
GREEN_LEVEL = g;
blue_level = b;
亮度= min_brightness;

//启动计时器以生成颜色
TA0CTL |= MC_1;
exitRoutine = 0;

while (1)

//将 LED 亮度缓慢增大到最大值
对于(i = min_brightness;i < max_brightness;i++)

IF (exitRoutine)

//接收到停止命令,退出例程
返回;

//调整亮度
亮度= I;

//设置唤醒计数
节拍数= 0;
tickWakeupCount = delay_step;

//转到 LPM0直到达到唤醒计数
LPM0;

//将 LED 亮度缓慢降低到最小值
对于(i = max_brightness;i > min_brightness;i---)

IF (exitRoutine)

//接收到停止命令,退出例程
返回;

//调整亮度
亮度= I;

//设置唤醒计数
节拍数= 0;
tickWakeupCount = delay_step;

//转到 LPM0直到达到唤醒计数
LPM0;


空 initUART()

//将 USCI_A0配置为 UART
UCA0CTL1 = UCSWRST;//进入软件复位进行配置
UCA0CTL0 = UCMODE_0;// 8-n-1 UART 模式
UCA0CTL1 |= UCSSEL_2;//使用 SMCLK 作为 BRCLK 的时钟源

//从 x2xx 用户指南中的表15-4中,SLAU144j.pdf:
// UCBRx = 833 = 0x341
// UCBRSx = 2
// UCBRFx = 0
UCA0BR1 = 0x03;//设置波特率控制寄存器
UCA0BR0 = 0x41;
UCA0MCTL = UCBRF_0 | UCBRS_2;//设置调制级值以获得正确的波特率

//清除任何挂起的中断标志
IFG2 &=~(UCA0TXIFG | UCA0RXIFG);

//将模块从 SW 复位中拉出以启用
UCA0CTL1 &=~UCSWRST;

//启用 RX 中断
IE2 |= UCA0RXIE;

//将 P1.1和 P1.2配置为 UCA0RXD 和 UCA0TXD
P1SEL |= BIT1 | BIT2;
P1SEL2 |= BIT1 | BIT2;

#pragma vector = TIMER0_A0_vector
_interrupt void Timer_A0 (void)

//管理计数
level_count++;
IF (LEVEL_COUNT >= MAXLEVEL)

level_count = 0;
Brightnal_count++;
IF (brightnity_count >= MAXINTEN敏感度)

brightnation_count = 0;

如果(亮度> brightnation_count)

//首先更新蓝色
ledStatus =(blue_level > level_count);
//添加绿色,将蓝色向上移动到下一位
ledStatus =(ledStatus << 1)+(green_level > level_count);
//添加红色,同时将蓝色和绿色移动到相应的位置
ledStatus =(ledStatus << 1)+(red_level > level_count);
LEDOUT =(ledStatus ^ 0x07);

其他

LEDOUT |= all_LEDs;

刻度++;

IF (tickWakeupCount)

if (滴答>= tickWakeupCount)

_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);//保证从 LPM 完全唤醒


// UART 中断服务例程
#pragma vector=USCIAB0RX_vector
_interrupt void USCI0RX_ISR (void)

//检查 TX 是否被启用并且 TXIFG 是否被置位
IF (((IE2 & UCA0TXIE)&&(IFG2 & UCA0TXIFG))

// TX ISR -未使用

//检查是否启用了 RX 并且设置了 RXIFG
否则((IE2 & UCA0RXIE)&&(IFG2 & UCA0RXIFG))

//检查以确保我们没有等待处理最后一个命令
如果(!uartFlag)

// RX ISR
//检查以确保我们没有走太远
IF (uartRxPtr > MAX_COMMAND_LENGTH)

//重置指针以开始向缓冲区写入新命令
uartRxPtr = 0;

//将字节保存到数组
uartRxBuffer[uartRxPtr++]= UCA0RXBUF;

//检查是否有整个命令
IF (uartRxPtr >= uartRxBuffer[0])

//检查停止命令
if ((uartRxBuffer[0]== 2)&&(uartRxBuffer[1]==0)

//转动 LED 并停止任何活动的唤醒计数器
ledOff();

//重置所有颜色级别
RED_LEVEL = 0;
GREEN_LEVEL = 0;
blue_level = 0;

//设置用于退出任何进行中的命令的标志
exitRoutine = 1;

//清除 UART 命令标志
uartRxPtr = 0;
uartFlag = 0;

//将 ISR 退出到活动模式(退出任何活动效果)
_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);

其他

//设置标志以表示命令已准备好进行解析
uartFlag = 1;

//将 ISR 退出为活动模式以解析命令
_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);




我希望序列加载到表中、然后读取以填充上述演示代码的 LED 值。 我找到了下面的代码、但我不确定它是否适合我要执行的操作。

 init_RAM_table(){

  char * table_ptr =&RAMtable[0]; //指向表中的第一个指针

 

  对于(y = 0;y < 26;y++){        // y 是内存段的编号

    init_seger_pointeres(* EEPROMy、*表_ptr);

    Table_ptr                       // table_ptr + 5每次迭代并初始化为

  }

 }

 init_seger_pointers (* sect_ptr、* table_ptr){

  对于(n = 0 ;n < 5 ;n++){

    在镜像字节中搜索0xFF @ EEPROMy[n][k]以标识偏移 k;

    //将 RAMtable ptr 设置为循环缓冲区中的最后一个有效位置    

    *表_ptr =&s段_ptr [n][k+50];

    Table_PTR++;                   //递增要写入的 RAMtable PTR

  }   

 }

这主要是我想要实现的目标、但我也关心:

一个用于识别特定微控制器的全局变量

创建随时从 ZigBee 发送的停止和下一个序列 ISR

谢谢你。 我知道这是一项需要做的工作,但我们将感谢所有的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Jacob、

    很难根据您的帖子准确地识别您需要的答案、尤其是因为您提供了冗长的代码示例、但不直接引用源代码。 您对 RAM 表的用途也不清楚、因为我想知道为什么变量数组不够充分。 您是否正在尝试在 MSP430G2553器件之间进行识别? 这无法通过全局变量来实现、您必须使用 MSP-GANG 来分配序列号。 已为 Zigbee 通信建立 UART ISR、因此您需要针对启动/停止序列进行修改。 当您遇到特定问题时、请继续开发/调试您的应用并将其发布到论坛。

    此致、
    Ryan