大家好、我最近使用的是 MSP430F4270的 UART 示例代码
它使用计时器来使 UART 工作、但我需要添加 UART 设置
例如:N81 =>数据位:8位、奇偶校验:无、停止位:1位
N82 =>数据位:8位、奇偶校验:无、停止位:2位
#include
在 P1.1上#define RXD 0x02 // RXD
#define TXD 0x01 // P1.0上的 TXD
// 9600波特率 SW UART 的条件、SMCLK = 1048576
#define BiTime_5 0x47 //~ 0.5位长度+小调整
#define BiTime 0x6C //~ 9620波特
unsigned int RXTXData;
unsigned char Bitcnt;
void TX_Byte (void);
void RX_Ready (void);
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
FLL_CTL0 |= XCAP14PF;//配置负载电容
CCTL0 = OUT;// TXD 空闲作为标记
TACTL = tassel_2 + MC_2;// SMCLK、连续模式
P1SEL = TXD + RXD;// P1.0/1 TA0用于 TXD/RXD 功能
P1DIR = TXD;// P1上的 TXD 输出
// Mainloop
对于(;)
{
RX_Ready ();// UART 准备好接收一个字节
_bis_SR_register (CPUOFF + GIE);//输入 LPM0直到字符 RXed
TX_Byte ();// TX Back RXed Byte received
}
}
//函数从 RXTXData 缓冲器发送字符
void TX_Byte (void)
{
Bitcnt = 0xA;//加载位计数器、8个数据+ ST/SP
CCR0 = TAR;// TA 计数器的当前状态
CCR0 +=双时;//直到第一位的某个时间
RXTXData |= 0x100;//向 RXTXData 添加标记停止位
RXTXData = RXTXData << 1;//添加空间起始位
CCTL0 = OUTMOD0 + CCIE;// TXD = MARK = IDLE
while (CCTL0 & CCIE);//等待 TX 完成
}
//函数读取 UART 以将字符接收到 RXTXData 缓冲器中
void RX_Ready (void)
{
Bitcnt = 0x8;//加载位计数器
CCTL0 = SCS + CCIS0 + OUTMOD0 + CM1 + CAP + CCIE;//同步、负边沿、捕捉
}
//计时器 A0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMERA0_vector
_interrupt void Timer_A (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (TIMERA0_vector)) Timer_A (void)
其他
错误编译器不受支持!
#endif
{
CCR0 += BiTime;//将偏移添加到 CCR0
// RX
IF (CCTL0和 CCIS0)// CCI0B 上的 RX?
{
if (CCTL0 & CAP)//捕获模式=起始位边沿
{
CCTL0 &=~ CAP;//捕获到比较模式
CCR0 += BiTime_5;
}
其他
{
RXTXData = RXTXData >> 1;
IF (CCTL0和 SCCI)//获取接收锁存中的等待位
RXTXData |= 0x80;
Bitcnt --;//所有位都是 RXed?
如果(Bitcnt = 0)
//>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
CCTL0 &=~ CCIE;//所有位 RXED、禁用中断
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除 LPM0位
}
//>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
}
// TX
其他
{
如果(Bitcnt = 0)
CCTL0 &=~ CCIE;//所有位 TXed、禁用中断
其他
{
CCTL0 |= OUTMOD2;// TX 空间
IF (RXTXData & 0x01)
CCTL0 &=~ OUTMOD2;// TX 标记
RXTXData = RXTXData >> 1;
Bitcnt --;
}
}
}
有人能帮我解决这个问题吗? 谢谢。