主题中讨论的其他器件: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
谢谢你。 我知道这是一项需要做的工作,但我们将感谢所有的帮助。