请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430F2410 主题中讨论的其他器件:MSP430G2553
由于 P1.1和 P2.2用作 TX 和 RX 的 BSL 引导加载程序。
我能否编写一个软件 UART,以便在应用程序运行期间使用这两个端口?
我注意到 P1.1和 P2.2是 TA0
在本示例中,我们使用了两个不同的计时器中断,即 TA1和 TA2。
有任何提示吗?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
由于 P1.1和 P2.2用作 TX 和 RX 的 BSL 引导加载程序。
我能否编写一个软件 UART,以便在应用程序运行期间使用这两个端口?
我注意到 P1.1和 P2.2是 TA0
在本示例中,我们使用了两个不同的计时器中断,即 TA1和 TA2。
有任何提示吗?
是的。
有关此问题、请参阅我的另一篇文章 https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/706535/2610240#2610240
主要问题是 64引脚开发目标 http://www.ti.com/tool/msp-fet430u64 连接到 P1.1和 P2.2的 TX 引脚1和 RX 引脚2使用2个电阻器(R6)和(R7)进行桥接。
另请参阅 https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/706535/2610240#2610240中的我的问题
一旦您绕过这些电阻器、您就可以了。
我正在分享我通过一篇文章从一位先生那里提到的守则(请原谅我忘记了我搜索的地方)。 感谢这位先生。
通过这种方式,我解决了我的问题:)
#include
#include
//------------------------------------------
#define RXD 0x04 // P2.2上的 RXD
#define TXD 0x02 // P1.1上的 TXD
// 9600 Baud HD/SW UART 的条件,ACLK = 3.579545MHz
//#define BiTime_5 0x0BA //~ 0.5 bit length
//#define Bitime 0x175 // 104 us ~ 9596 baud
/////----
// 9600波特率软件 UART 的条件,SMCLK = 1MHz
//---------------
//TX P1.1连接到 UART RX
//RX P2.2连接到 UART TX
//连接 VCC 和接地
//波特率9600
//奇偶校验无
//握手关闭
//数据大小8
#define UART_TBIT_DIV_2 (1000000/(9600 * 2)
)#define UART_TBIT (1000000/9600)
unsigned int RXTXData;
unsigned char Bitcnt;
void TX_Byte (void);
void RX_Ready (void);
// M.Buccini
// Texas Instruments、Inc
// 2002年3月
void main (void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
IF (CALBC1_1MHz == 0xFF) //如果校准常数被擦除
{
while (1)
; //不加载,陷阱 CPU!!
}
DCOCTL = 0; //选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHz;
DCOCTL = CALDCO_1MHz;
CCTL0 = OUT;// TXD 空闲作为标记
//TACTL = TASSEL0+MC1;// ACLK、连续模式
TACTL = tassel_2+MC_2;// SMCLK、以连续模式启动
// TACCTL0 = OUT; //将 TXD 空闲设置为标记='1'
// TACCTL1 = SCS + CM1 + CAP + CCIE; //同步、负边沿、捕捉、内部
// TACCTL2 = CCIE;
// TACTL = tassel_2 + MC_2 + TAIE; // SMCLK,以连续模式启动
// CCR2 = 50000;
P1SEL = TXD;// P1.1/TA0表示 TXD 功能
P1DIR = TXD;// P1上的 TXD 输出
P2SEL = RXD;// P2.2/TA0作为 RXD 输入
_enable_interrupt ();
// Mainloop
对于(;)
{
RX_Ready ();// UART 准备好接收一个字节
_BIS_SR (CPUOFF+GIE);//输入 LPM0直到字符 RXed
TX_Byte ();// TX Back RXed Byte received
//Exxample 发送字符
/*RXTXData = 0x42;
TX_Byte ();
RXTXData = 0x6A;
TX_Byte();*/
}
}
//函数从 RXTXData 缓冲
器 void TX_Byte (void)
{发送字符
Bitcnt = 0xA;//加载位计数器、8个数据+ ST/SP
CCR0 = TAR;// TA 计数器的当前状态
// CCR0 += Bitime;//直到第一位的某个时间
CCR0 +=UART_TBIT;
RXTXData |= 0x100;//向 RXTXData 添加标记停止位
RXTXData = RXTXData << 1;//添加空间起始位
CCTL0 = OUTMOD0+CCIE;// TXD =标记=空闲
while (CCTL0 & CCIE);//等待 TX 完成
}
//函数读取 UART 以接收字符到 RXTXData 缓冲
区 void RX_Ready (void)
{
Bitcnt = 0x8;//加载位计数器
CCTL0 = SCS+CCIS0+OUTMOD0+CM1+CAP+CCIE;//同步、负边沿、捕捉
}
//计时器 A0中断服务例程
#pragma vector = TIMERA0_vector
__interrupt void Timer_A (void)
{
//CCR0 += Bitime;//将偏移添加到 CCR0
CCR0 += UART_TBIT;
// RX
IF (CCTL0和 CCIS0)// CCI0B 上的 RX?
{
if (CCTL0 & CAP)//捕获模式=起始位边沿
{
CCTL0 &=~电容器;//从捕捉切换到比较模式
//CCR0 += BiTime_5;
CCR0 += UART_TBIT_DIV_2;
}
其他
{
RXTXData = RXTXData >> 1;
IF (CCTL0和 SCCI)//获取接收锁存中的等待位
RXTXData |= 0x80;
Bitcnt --;//所有位都是 RXed?
如果(Bitcnt = 0)
//>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
CCTL0 &=~ CCIE;//所有位 RXED、禁用中断
_BIC_SR_IRQ (CPUOFF);//从0 (SR)清除 LPM0位
}
//>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<>}
}
// TX
其他
{
如果(Bitcnt = 0)
CCTL0 &=~ CCIE;//所有位 TXed、禁用中断
其他
{
CCTL0 |= OUTMOD2;// TX 空间
IF (RXTXData & 0x01)
CCTL0 &=~ OUTMOD2;// TX 标记
RXTXData = RXTXData >> 1;
BitCnt --;
}
}