请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430F5172 工具/软件:TI C/C++编译器
尊敬的各位,
我想通过Timer0_D使用I/O来实现UART,因为USCI模块已经用完,但我的代码无法实现,我需要工程师的帮助。
// 1200波特SW UART的条件,ACLK = 3.2768万
#Define BiTime_5 0x0E //~ 0.5 位长度+小调整
#define Bi Time 0x1B // 427us位长度~ 2341波特
无符号int RXTXData;
无符号字符位计数;
//void TX_Byte (void);
void TX_Byte (无符号字符字节);
void RX_Ready (void);
#include <msp430f5172.h>
int main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
TD1CCTL0 =输出; // TXD空闲状态标记为
TD1CTL0 = tassel_1 + MC_2; // ACLK,连续模式
P2SEL |=BIT1; //为TXD功能
P2DIR |=BITS1;2.1
|= BITS2;
P1DIR |= BITS0;
P1OUT |=BIT0;
// Mainloop
for (;;)
{
RX_Ready(); // UART准备接收一字节
__bis_sr_register (LPM3_bits + GIE); //输入LPM3 w/ interr,直到字符RXED
TX_Byte (5); //接收到的TX Back RXed Byte
}
//
函数从RXTXData缓冲区
void TX_Byte (无符号字符字节)传输字符
{
RXTXData=Byte;
BitCnt = 0xA; //加载位计数器,8data + ST/SP
unsigned int t=TD1R;
while (TD1CCR0 != t) //防止异步捕获
TD1CCR0 = TD1R; // TA计数
器TD1CCR0 += Bitime的当前状态; //第一位之前的某个时间
RXTXData |= 0x100; //向RXTXData
RXTXData添加标记停止位= RXTXData <<1; //添加空间起始位
TD1CCTL0 = OUTMOD0 + CCIE; // TXD = MARK =空闲
时间( TD1CCTL0 & CCIE ); //等待TX完成
}//
函数读取UART以将字符接收到RXTXData缓冲区
void RX_Ready (void){
BitCnt = 0x8; //加载位计数
器TD1CCTL0 = SCS +D3+ OUTMOD0 + CM1 + CAP + CCIE;//同步,Neg Edge,Cap
}
#pragma vector=TIMER0_D1_Vector
__interrupt TIMER0_D1_ISR (void)
{
TD1CCR0+= Bitime; //向CCR0添加偏移
// RX
IF (TD1CCTL0和DOR0) // CCI0B上的RX?
{
IF( TD1CCTL0和CAP ) //捕获模式=起始位边缘
{
TD1CCTL0 &=~μ L容量; //从捕获模式切换到比较模式
TD1CCR0 += Bibete_5;
}
否则
{
RXTXData = RXTXData >> 1;
IF (TD1CCTL0和SCCI) //在接收锁定中获取等待位
RXTXData |= 0x80;
位计数--; //所有位均已RXed?
如果( BitCnt == 0)
//>>>>> 此处接收字节解码<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
TD1CCTL0 &=~ CCIE; //所有位RXed,禁用中断
__BIC_SR_REGISTER_ON_EXIT (LPM3_bits);//从0 (SR)清除LPM3位
}
//>>>>> 此处为接收字节的解码<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}
}//
TX
else
{
IF (BitCnt == 0)
TD1CCTL0 &=~ CCIE; //所有位TXED,禁用中断
否则
{
TD1CCTL0 |= OUTMOD2; // TX空间
IF (RXTXData和0x01)
TD1CCTL0 &=~ OUTMOD2; // TX标记
RXTXData = RXTXData >> 1;
BitCnt --;
}
}
}