世纪电源网社区logo
社区
Datasheet
标题
返回顶部
讨论

MSP430程序解释

[复制链接]
查看: 208 |回复: 3
1
Moderator
  • 积分:676
  • |
  • 主题:18
  • |
  • 帖子:154
积分:676
LV6
高级工程师
  • 2023-3-28 13:57:24
void main(void)
{
unsigned char i;
int k;
WDTCTL=WDTPW+WDTHOLD;
BCSCTL1 &= ~XT2OFF; // XT2on 0, defaut off -1
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set? OFIFG
BCSCTL2 |= SELM_2 + SELS;//+DIVS_3; // MCLK = SMCLK = XT2 (safe)
//TxBuf[0]=10;
InitIO();
Config905(); // Config nRF905 module
//SetTxMode(); // Set Tx Mode
//TxPacket(); // Transmit Tx buffer data
//SetRxMode(); // Set nRF905 in Rx mode
P3DIR|=BIT0;
P3OUT&=~BIT0;
//Delay(0xffff);
Delay(0xff);
P3OUT|=BIT0;
//Send=1;
UartInit(1);
//UartStr("\r\t\n");
//UartStr("苏州木兰电子科技有限公司,nRF905无线学习系统!");
//UartStr("\r\t\n");
for (k = 0; k <256; k++ )
{ Sd_Buf[k] =k;
}
_EINT();
for(;;)
{

#if(SEND_RECEIVE_CONTROL==0)
{ WDTCTL=WDTPW+WDTHOLD;
//Delay(10);
Send_Packet(256); // Set Tx Mode
// Transmit Tx buffer data
//Delay(10);
//SetRxMode(); // Set nRF905 in Rx mode
SEND_RECEIVE_CONTROL = 9; //tf=0;
//Delay(1000);
}
#endif
SetRxMode();
WDTCTL = WDT_ARST_1000;
//Delay(1000);
//Delay(10);
while ((P1IN&DR)!=DR); // If recive data ready...
RxPacket(); // ... recive data
SEND_RECEIVE_CONTROL--;

}
}
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A( )
{
if(TAIV==10)
{
// add code

//TimeOut

}

}
P3端口的设置(四条代码)可否解释下。
void Send_Packet(int n)
{
Sd_Over=0;
int i=0;

unsigned char j = 0;
TxBuf[0]=(n>>8);
TxBuf[1]=(n&0x00FF);
//Delay(100);
SetTxMode();
TxPacket();
//Delay(10);
while(i<n)
{
for(j=0;j<32;j++,i++)
{
TxBuf[j]=Sd_Buf;

}
//Delay(20);
SetTxMode();
TxPacket();
//Delay(10);
}
Sd_Over=1;
}
/****************************************请帮我看看这个程序,n的值是表示字节数还是具体数,为什么N的值变了,TxBuf的值也在变
姜sir
  • 姜sir
  • 离线
  • LV6
  • 高级工程师
  • 积分:436
  • |
  • 主题:14
  • |
  • 帖子:81
积分:436
LV6
高级工程师
  • 2023-3-31 15:14:09
  • 倒数3
 
下面是一个串口中断的接收发送程序(不是用定时器模拟的),你可以看一下。

/******************************************************
程序功能:接收PC机十六进制数据后回传至PC机
数据格式:十六进制

帧头:FD

帧尾: FE

*******************************************************/
#include <msp430x14x.h>

unsigned char RecBuf[255]; //接收数据缓存
unsigned char *SDat; //指向要发送的数据
unsigned char Rindex; //接收数据计数
unsigned char Tindex; //发送数据计数
unsigned char SendLen; //发送数据长度

/*************************************************
函数名称:ConfigUart0
功 能:配置UART0,使用SMCLK,N.8.1, 9600
无校验,8个数据位,1个停止位,波特率9600
参 数:无
返回值 :无
**************************************************/
void ConfigUart0()
{
P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口
ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受
UCTL0 |= CHAR; // 选择8位字符

UTCTL0 |= SSEL1; // UCLK = SMCLK
UBR00 = 0xD0; // 波特率9600
UBR10 = 0x00; //
UMCTL0 = 0x40; // Modulation
UCTL0 &= ~SWRST; // 初始化UART状态机
IE1 |= URXIE0 + UTXIE0; // 使能USART0的收发中断
}

/********************主函数********************/
void main(void)
{
unsigned int i;

WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1 &= ~XT2OFF; //使TX2有效,TX2上电默认是关闭的
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for(i=0xff;i>0;i--); //延时,待稳定
}
while((IFG1 & OFIFG)!=0); //若振荡器失效标志有效
BCSCTL2 |= SELM1; //使MCLK=XT2
BCSCTL2 |= SELS+DIVS1; //SMCLK=XT2,4分频,即2MHZ

BoardConfig(0xb8); // 关闭数码管、流水灯和电平转换
ConfigUart0(); //配置UART0
_EINT(); //打开全局中断

while(1)
{
LPM1;
}
}

/*******************************************
函数名称:UART0_RXISR
功 能:UART0的接收中断服务函数,在这里唤醒
CPU,使它退出低功耗模式
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
RecBuf[Rindex++] = RXBUF0;
if(RecBuf[Rindex-1]==0xfe) //接收完毕
{
if(RecBuf[0]==0xfd) //帧头正确
{
LPM1_EXIT;
SDat = RecBuf;
IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
SendLen = Rindex;
Rindex=0;
}
}

}

/*******************************************
函数名称:UART0_TXISR
功 能:UART0的发送中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0TX_VECTOR
__interrupt void UART0_TXISR(void)
{

if(Tindex < SendLen)
{
TXBUF0 = *(SDat+Tindex);
Tindex++;
}
else
{
Tindex=0;
//LPM1;
}

}

米斯86
  • 积分:313
  • |
  • 主题:8
  • |
  • 帖子:56
积分:313
LV4
初级工程师
  • 2023-4-4 15:44:54
  • 倒数2
 
P3DIR|=BIT0;//P3.0方向为输出方向
P3OUT&=~BIT0; //P3.0输出低电平
//Delay(0xffff);//延时
Delay(0xff);
P3OUT|=BIT0;//P3.0输出高电平

TxBuf[0]=(n>>8);//右移八位,这里我不知道N进来是什么数,如果是进来8位,那么右移就都是零了,应该进来是16位,比如0XABCD 右移后得出0X00AB
TxBuf[1]=(n&0x00FF);这里应该是取n的低八位。然后给TBUF1.

while(i<n)
z443233785
  • 积分:5343
  • |
  • 主题:117
  • |
  • 帖子:1003
积分:5343
LV8
副总工程师
最新回复
  • 2023-4-5 18:45:03
  • 倒数1
 
N应该是10进制数或者你自己编个简单的程序验证下不就行了

热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号