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.

[参考译文] MSP430FR2476:从旧处理器转换 UART 代码

Guru**** 2782485 points

Other Parts Discussed in Thread: MSP430F2132, MSP430FR2476, LP-MSP430FR2476

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/978339/msp430fr2476-transitioning-uart-code-from-an-old-processor

器件型号:MSP430FR2476
主题中讨论的其他器件:MSP430F2132

您好!

我正在将一个软件项目从 MSP430F2132移动到 MSP430FR2476、而我的 UART 似乎不工作。  当我向 UCA0TXBUF 写入数据时、它不会显示出使用逻辑分析仪从引脚发出的数据。  发送到 RX 引脚的数据也不会触发中断、尽管 TX 中断确实会被触发。

从 OutOfBox _LP-MSP430FR2476示例代码开始、我将使用 msp430fr267x_euscia0_UART_1.c 作为指南(dev.ti.com/.../node

以下是我的更新的初始化函数:

UART_TX_PORT = GPIO_PORT_P2
UART_RX_PORT = GPIO_PORT_P2
UART_TX_PIN = GPIO_PIN6
UART_RX_PIN = GPIO_PIN5 

//停止看门狗计时器
WDT_A_HOLD (WDT_A_BASE); 

void UART_Init (void){
//初始化与 UART 相关的变量
txComplete = false;
remaindingCurrentCmdTxLenBytes = 0;
命令字节已配置= 0;
命令字节已配置= 0;

//设置用于传入数据字节
的循环缓冲器字节(字节为字节);
字节



为 OutFunctionRd = 0;//从 LP-MSP430FR2476_Software_Examples/ Firmware/Source/Source/OutputUART_Index_OutputUARTxD_ENTRFUNT 中的 E/ INTRIP_INTRFUNT_INTRIP_INTRFUNT_ENTRIP_OUTHRT_OUTPUT_OUTPUT_OUTPUT_IN_OUTPUT_IN_OUT_OUTPUT_OUTPUT_IN_OUTPUT_OUT_OUTPUT_OUTPUT_OUT_UART_OUTPUT_OUTPUT_OUT_OUTPUT_OUTPUTTO
UART_SELECT_FUNCTION);

//配置 eUSCI UART @115200波特、8M
// software-dl.ti.com/.../index.html
EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockPrescalar = 4;
param.firstModReg = 5;
param.secondModReg = 85;
param.param.param.param_a_uart_no_param.msborLsbartst
= eUSCI_A_uart_lSB_first;
param.numberofStopBits = eUSCI_A_uart_one_stop_bit;
param.uartMode = eUSCI_a_uart_mode;
param.oversam采样= eUSCI_uart_uart_uart_uart_uart_mode;param.oversam_uart_uart_uart_generation

if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param)
){
返回;
}

EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);

//启用 UART 中断
EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、
EUSCI_A_UART_Transmit 中断|//启用发送中断*
EUSCI_A_UART_receive_interrupt );//接收中断启用*
} 


//禁用全局中断
__BIC_SR_register (GIE);

//禁用并清除所有挂起的中断
SFRIE1 =( WDTIE__DISABLE | /*禁用看门狗定时器中断*/
OFIE__DISABLE | /*禁用振荡器故障中断*/
VMAIE_DISABLE | /*禁用空存储器访问中断*/
NMIIE__disable | /*禁用 NMI 引脚中断*/
JMBINIE__DISABLE |/*禁用 JTAG 邮箱输入中断*
JMBOUTIE__DISABLE);//禁用 JTAG 邮箱输出中断*/

SFRIFG1 =(WDTIFG_0 | /*看门狗定时器无中断挂起*/
OFIFG_0 | /*振荡器故障无中断挂起*/
VMAIFG_0 | /*空存储器访问无中断挂起*/
NMIIFG_0 | /* NMI 引脚无中断挂起*/
JMBINIFG_0 | /* JTAG 邮箱输入无中断挂起*/
JMBOUTIFG_0);// JTAG 邮箱输出无中断挂起*//

启用全局中断
__bis_SR_register (GIE);

如上述注释中所述、我在此处的计算器(http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html)中使用 EUSCI、8MHz 时钟(我使用逻辑分析仪检查)和11520bps、获得了时钟预分频器、firstModReg 和 secondModReg 的值。  它们也似乎与用户指南 slau445i 表22-5中的值匹配:
BRCLK 波特率 UCOS16 UCBRx UCBRFx UCBRSx
8000000 115200 1 4 5 0x55

在将这些函数的功能与 UART_01示例进行比较时、我唯一发现缺少的内容是此行:
SYSCFG3|=USCIA0RMP;
我认为这对于我的引脚分配是不必要的...

以下是我的中断代码:

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=EUSCI_A0_Vector
__interrupt void EUSCI_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (interrupt (EUSCI_A1_vector)))#EUSCI_A0 Compiler #void

!
#endif
{
switch (__evo_in_range (UCA0IV、UCIV_UCTXCPTIFG)){
案例 UCIV__UCRXIFG:{/*中断源:接收缓冲区已满;中断
标志:UCRXIFG;中断优先级:最高*/

//检测到 RX 中断、因此将新字节存储在循环缓冲区中
ByteBuffer[byteIndex]= UCA0RXBUF;
字节索引 xWR+= 1;
bytexWr &= 0x07;

中断;
}

案例 UCIV__UCTXIFG:{//中断源:发送缓冲区为空;
中断标志:UCTXIFG */

//如果消息未完全传输,则发送下一个字节
if (commandBytesTxed <= remainingCurrentCmdTxLenBytes){
//将下一个字节放置在 TX 缓冲区中
UCA0TXBUF = currentCmdTx[commandBytesTxed+]];
}
否则{
//设置 TX 完成标志
txComplete =真;

//清除 TX 中断
UCA1IFG &=~UCTXIFG_1;
}
中断;
}
默认值:
中断;
}
} 

请告诉我、如果有任何问题立即出现、或者如果您有一些想法、我可以尝试、谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > UART_TX_PORT = GPIO_PORT_P2

    Data sheet (SLASEO7B) Table 6-24 says that P2.4-5 are UCA1 (EUSCI_A1_BASE), not UCA0. If you're using the Launchpad's backchannel UART, you should use P1.4-5 (and UCA0).

    --------

    可能需要检查以确保 UART_SELECT_FUNCTION 设置为 GPIO_PRIMARY_MODULE_FUNCTION。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢!  我把所有的 A0切换到了 A1s、它工作正常!  我很高兴它如此简单...