主题中讨论的其他器件:MSP430WARE
大家好、我正在尝试通过 在 UART 模式下运行 uscia0来将数据从微控制器传输到 PC。 我从 msp430ware 中获取了一个示例、并修改为 在按下按钮时向 PC 发送一个字符。 但我无法在我的 PC 上看到任何数据。
PC 端我使用的 Linux 主机具有 PuTTy。 我正在查看端口 ttyACM1 (不确定要检查哪个 ttyACM1和 ttyACM0)。 我将包含以下完整代码。 如果我在实施过程中犯了任何错误、请通知我。
谢谢、
Ravi
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 代码//////////////
#include
#define MCLK_FREQ_MHz 8 // MCLK = 8MHz
void Software_Trim ();
void Init_GPIO();
volatile unsigned int p=0;
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
//配置 GPIO
init_gpio();
PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
//激活1个先前配置的端口设置
_bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
CSCTL1 = DCOFTRIMEN | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
Software_Trim (); //软件调整可获得最佳 DCOFTRIM 值
CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
//默认 DCODIV 为 MCLK 和 SMCLK 源
//配置 UART 引脚
P1SEL0 |= BIT4 | BIT5; //将2个 UART 引脚设置为第二功能
//配置 UART
UCA0CTLW0 |= UCSWRST;
UCA0CTLW0 |= UCSSEL_SMCLK;
//波特率计算
// 800000000 /(16*9600)= 52.083
//分数部分= 0.083
//用户指南表14-4:UCBRSx = 0x49
// UCBRFx = int ((52.083-52)*16)= 1.
UCA0BR0 = 52; // 8000000/16/9600
UCA0BR1 = 0x00;
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;
UCA0STATW |= 0x0080;
UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
while (1)
{
如果(!(P2IN 和 BIT3))
{
if (p=0)
{
UCA0TXBUF = 1; // P1.0切换
__no_operation();
P=1;
}
}
其他
P = 0;
}
}
空 Init_GPIO()
{
P1DIR = 0xFF; P3DIR = 0xFF;
P1REN = 0xFF; P3REN = 0xFF;
P1OUT = 0x00; P3OUT = 0x00;
P2DIR |= BIT3; //将 P2.3设置为输入方向
P2REN |= BIT3; // P2.3使能上拉电阻
P2OUT |= BIT3; //配置 P2.3上拉
}
空 Software_Trim ()
{
unsigned int oldDcotTap = 0xFFFF;
unsigned int newDcoTap = 0xFFFF;
unsigned int newDcoDelta = 0xFFFF;
unsigned int bestDcoDelta = 0xFFFF;
unsigned int csCtl0Copy = 0;
unsigned int csCtl1Copy = 0;
无符号 int csCtl0Read = 0;
无符号 int csCtl1Read = 0;
unsigned int dcoFreqTrim = 3;
unsigned char endLoop = 0;
操作
{
CSCTL0 = 0x100; // DCO 抽头= 256
操作
{
CSCTL7 &=~DCOFFG; //清除 DCO 故障标志
} while (CSCTL7 & DCOFFG); //测试 DCO 故障标志
__DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
//建议等待24个经过分频的 FLL 参考时钟周期
while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));
CSCCtl0Read = CSCTL0; //读取 CSCTL0
CSCCtl1Read = CSCTL1; //读取 CSCTL1
oldDcoTap = newDcoTap; //记录上次的 DCOTAP 值
newDcoTap = csCtl0Read & 0x01ff; //这次获得 DCOTAP 值
dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值
if (newDcoTap < 256) // DCOTAP < 256
{
newDcoDelta = 256 - newDcoTap; // DCPTAP 和256之间的增量值
if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
endLoop = 1; //停止 while 循环
其他
{
dcoFreqTrim --;
CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
}
}
else // DCOTAP >= 256
{
newDcoDelta = newDcoTap - 256; // DCPTAP 和256之间的增量值
if (oldDcoTap < 256) // DCOTAP 交叉256
endLoop = 1; //停止 while 循环
其他
{
dcoFreqTrim++;
CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
}
}
if (newDcoDelta < bestDcoDelta) //记录最接近256的 DCOTAP
{
csCtl0Copy = csCtl0Read;
csCtl1Copy = csCtl1Read;
bestDcoDelta = newDcoDelta;
}
}while (endLoop =0); //轮询直至 endLoop =1
CSCTL0 = csCtl0Copy; //重新加载锁定的 DCOTAP
CSCTL1 = csCtl1Copy; //重新加载锁定的 DCOFTRIM
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 被锁定
}