工具/软件:Code Composer Studio
我当前一直处于 UCRXIFG 轮询条件。 该代码为 XBee 提供了++、并等待器件的 OK 响应。 我正在为我的系统使用不同的时钟结构、XT1 = 32K、XT2 = 32M。 时钟配置中的一些设置错误、因为根据我的知识、UART 计算结果是正确的。 附加我的代码以供参考
#include
#include
void vGpio_Init (void)
{
//将所有 GPIO 配置为输出低电平
//确保电路原理图没有引脚冲突
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;
P5OUT = 0x00;P6OUT = 0x00;P7OUT = 0x00;P8OUT = 0x00;
P9OUT = 0xFF;
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;
P5DIR = 0xFF;P6DIR = 0xFF;P7DIR = 0xFF;P8DIR = 0xFF;
P9DIR = 0xFF;
}
void vMspclock_init (void)
{
//----
//常规设置
P7SEL |= BIT2+BIT3; //端口选择 XT2
UCSCTL6 &=~XT1OFF; //为 RTC_B 启用 XT1
UCSCTL6 |= XCAP_3 | XT1BYPASS; //内部负载电容12pF 配置
UCSCTL6 &=~XT2OFF; //为 MCLK、SMCLK、ACLK 启用 XT2
UCSCTL3 |= SELREF_2; //对 FLL 的引用由 XT2给出
UCSCTL6 |= XT2DRIVE_3; //为32MHz 晶振选择高电流驱动容量和电流消耗
//UCSCTL7 //该寄存器用于检查振荡器故障标志,即如果由于电源条件而导致 osc 出现某些错误
//Init MCLK
UCSCTL4 |= SELM_5; //使用 XT2 (32MHz)晶体振荡器源
UCSCTL5 |= DIVM_3; //将时钟源除以32,例如32/1 = 32kHz
//Init SMCLK
UCSCTL4 |= SELS _5; //////使用 XT2 (32MHz)晶体振荡器源
UCSCTL5 |= DIVS_0; //将时钟源除以1,即32/1 = 32kHz
//Init ACLK
UCSCTL4 |= SE拉美 经济体系5; //////使用 XT2 (32MHz)晶体振荡器源
UCSCTL5 |= DIV_3; //将时钟源除以8,即32/8 = 4kHz
//UCSCTL5 |= DIVPA_3; //这可以将外部引脚上可用的 ACLK 源除以与前一行类似的任何值
操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
}
void vUART_init (void)
{
P8SEL |= 0x04; //对于 TX 引脚
P8DIR |= 0x04;
P8SEL |= 0x08; //用于 RX 引脚
UCA1CTL1 |= UCSWRST; //必须将该位置位、因为只有当 UCSWRST = 1时、所有寄存器才可配置
UCA1CTL1 |= UCSSEL_SMCLK; //也可被写为 UCA0CTL1 |= UCSSEL_1;//选择 UART 通信的时钟源
//供计算参考- processors.wiki.ti.com/.../USCI_UART_Baud_Rate_Gen_Mode_Selection
UCA1BR0 = 0x52; //这2个寄存器代表根据时钟频率计算波特率
UCA1BR1 = 0x00; //32000000/16*(1/38400)=52、因此 lsb = 52且 msb = 0
UCA1MCTL = UCOS16 | UCBRF_1; //第一个设置设置过采样模式,第二个位是 UCBRF 的计算
//UCA1MCTL = UCBRS_2;
UCA1CTLW0 &=~UCSWRST; //清除寄存器以启动 UART 配置
}
//
* hello.c
*/
int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
char send_init[3]={'+'、'+'、'+'};
int i;char rxbit;
vGpio_Init();
vMspclock_init();
vUART_init();
for (i=0;i<3;i++)
{
while (!(UCA1IFG & UCTXIFG)); //轮询发送中断标志
UCA1TXBUF = SEND_INIT[i]; //发送数据
UCA1IFG &=~(UCTXIFG);
}
for (i=0;i<10000;i++); //等待 ok 响应
for (i=0;i<3;i++)
{
while (!(UCA1IFG & UCRXIFG)); //轮询发送中断标志--代码卡在这里
rxbit = UCA1RXBUF;
UCA1IFG &=~(UCRXIFG);
printf ("%d "、rxbit);
}
printf ("Hello World!\n");
返回0;
}
我是一个新手、任何帮助都是可以获得的
Onkar