launchPad另一种 uart的实现
shower.xu
首先声明,所谓的另一种是,是相对于官方温度传感例程里面的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
来说的。官方程序里面大致是这样的,设为连续计数模式,
TXD,RXD作为 TA的捕获/比较功能引脚,当捕获到起始位或要发送
数据的时候,在当前计数值的基础上加上一位的宽度来设定下一个中
断时间,然后根据要发送的值来确定 TXD功能引脚的输出。这种方
法充分利用了硬件资源,但是相对应的要设置的寄存器和中断要处理
的稍多点,使用起来稍显复杂。
其实 uart通讯很简单,起始位加 8bit数据加上停止位(不是特别
的应用或高速率传输时一般可以省掉校验位)就好了,在起始位(高
电平向低电平转换时刻即下降沿)开始按数据置高或拉低一个数据位
宽度(由波特率决定)即可。
所以这里就简单的利用 crr0的 up mode中断,产生一个数据位的
时长,我们只需要把要发送的数据,前后分别加上起始位和停止位按
低位在前,高位在后的顺序发出去就好了。
//发送一个字节
void send_char(uchar tchar)
{
TACTL = TACLR + TASSEL_2 + ID_3; //选择 SMCLK时钟;清 TAR
CCR0 = BITTIME_1b; //crr0定时间隔为 1bit时间宽度
CCTL0 |= CCIE; //打开 CCR0中断
bitcnt = 10; //待发送的位数
uart_buf = 0x0100; //8+N+1
uart_buf |= tchar; //stop bit and start bit;
uart_buf <<=1;
Send_flag = 0;
TACTL |= MC_1; //Start TA, UP mode.
_BIS_SR(GIE);
while(!Send_flag); //wait until send complete
Send_flag = 1;
}
//发送一个字符串
void send_String(uchar *tstr)
{
while(*tstr)
send_char(*tstr++);
}
void send_IRQ(void)
{
if(bitcnt>0)
{
if(uart_buf & 0x01)
POUT |= TXD;
else
POUT &= ~TXD;
uart_buf >>= 1;
bitcnt--;
}
else
{
TACTL &= ~MC_3; //Close the TA when a Byte send over. ??
CCTL0 &= ~CCIE; //关闭 CCR0中断
Send_flag = 1;
}
}
效果如下图
另外附上一个小巧但功能强大的串口调试工具给大家
直接解压运行 putty,载入设置好的msp430就可以了
论坛链接:
http://bbs.eeworld.com.cn/viewthread.php?tid=309735
launchPad另一种uart的实现
shower.xu