请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 --; } }