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.
工具/软件:TI-RTOS
您好!
我目前正在使用 TI-RTOS 中的 UART 驱动程序为 MSP430F5529开发一个项目。
我有2个与 UART 驱动程序相关的问题:
问题1:
当我使用与8192000Hz 不同的 SMCLK 频率配置 UART 波特率时、我通过 UART 收到了错误的数据
+我配置了 SMCLK 时钟频率:
bios.cpufreq.lo = 24000000;
ClockFreqs.SMCLK = 24000000;
ClockFreqs.ACLK = 32768;
+然后、我使用此工具计算波特率: http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html
+即使我尝试使用较低的 SMCLK 频率、例如4000000MHz、我仍会遇到数据错误。
+毕竟、当我使用 SMCLK freq = 8192000Hz 时、我只获得正确的数据。
+我的 UART 配置基于 TI-RTOS 的 uartecho 示例中的配置。
问题2:
+我想在 MSP430F5529中同时使用 UART A0和 A1、那么我应该如何配置?
我尝试过此代码、但不起作用:
/* *@def MSP430F5529_UARTName *@MSP430F5529上 UART 名称的简短枚举 */ typedef enum MSP430F5529_UARTName{ MSP430F5529_UART_A0 = 0、 MSP430F5529_UART_A1 = 1、 MSP430F5529_UART_COUNT// UART 对象数 * ****** *@defuartUSCIAHWAttrs *@简单UART 硬件属性 */ const UARTUSCIA_HWAttrs uartUSCIAHWAttrs[MSP430F5529_UART_COUNT]= { { baseAddr = USCI_A0_BASE、 时钟源= USCI_A_UART_CLOCKSOURCE_SMCLK、 .bitOrder = USCI_A_UART_LSB_FIRST、 numBudrateEndries = sizeof (uartUSCIABAURATS)/sizeof (UARTUSCIA_BAUDRAateConfig)、 .budrateLUT = uartUSCIA波特 率 }、 { baseAddr = USCI_A1_base、 时钟源= USCI_A_UART_CLOCKSOURCE_SMCLK、 .bitOrder = USCI_A_UART_LSB_FIRST、 numBudrateEndries = sizeof (uartUSCIABAURATS)/sizeof (UARTUSCIA_BAUDRAateConfig)、 .budrateLUT = uartUSCIA波特 率 } }; /* *** *@defUART_CONFIG *@简单UART 配置列表 */ const UART_Config UART_CONFIG[]={ { .fxnTablePtr =&UARTUSCIA_fxnTable、 .object = uartUSCIAObjects[0]、 .hwAttrs = uartUSCIAHWAttrs[0] }、 { .fxnTablePtr =&UARTUSCIA_fxnTable、 .object = uartUSCIAObjects[1]、 .hwAttrs = uartUSCIAHWAttrs [1] }、 {NULL、NULL、NULL} }; void IOSEKPeripheral_openUART (UART_Mode uartMode、MSP430F5529_UARTName uartName) { if (uartMode = UART_MODE_BLOCKING) { //创建数据处理关闭的 UART。 UART_Params_init (&uartParams); { uartParams.readMode = UART_MODE_BLOCKING; uartParams.writeMode = UART_MODE_BLOCKING; uartParams.readTimeout = UART_WAIT_FOREVE; uartParams.readCallback = NULL; uartParams.writeCallback = NULL; uartParams.readReturnMode = UART_return_full; uartParams.readDataMode = UART_DATA_binary; uartParams.writeDataMode = UART_DATA_binary; uartParams.readEcho = UART_ECHO_OFF; uartParams.baudrate = 115200; uartParams.dataLength = UART_LEN_8; uartParams.stopbits = UART_STOP_One; uartParams.parityType = UART_PAR_NONE; } }}
Janet、您好!
我将 TI-RTOS 用于 MSP430 v2.20
我在该表中添加了该波特率:
{115200、24000000、13、0、0、 1}
然后、我在 UART 终端中获取了一些垃圾数据。
我还尝试使用另一个 SMCLK 进行配置、例如4000000Hz、8000000Hz 和16000000Hz。 但是、只有当 SMCLK = 8000000Hz 时、我才会获得正确的数据?
由于 MSP430的电源配置或其它原因、问题是否会导致?
尊敬的 Duc:
您是否实际更改了 SMCLK 频率? 仅设置 ClockFreqs.SMCLK 并不会实际改变 SMCLK 频率。 它只是告诉系统新的频率是多少。 要从 BIOS 设置的默认值更改频率、您需要将以下行添加到.cfg 文件中:
VAR Boot = xdc.useModule('ti.catalog.msp430.init.Boot'); Boot.configureDCO = false;
然后在 main()中,根据需要设置时钟频率。 您还需要在.cfg 文件中设置 ClockFreq。
此致、
Janet
Janet、您好!
所以我需要配置 Boot.configureDCO = false;或者 Boot.configureDCO = true 吗?
我必须使用 driverlib 和.cfg 文件中配置时钟频率、对吧?
要配置时钟的东西太多了
尊敬的 Duc:
我能够让 UART 回波示例与波特率115200和以4MHz 运行的 SMCLK 配合使用。 我无法使其在 SMCLK = 24MHz 时工作。 板级配置文件中的 UART 波特率配置为:
{
.outputBudrate = 115200、
.inputClockFreq = 4000000、
.prescalar = 2、
hwRegUCBRFx = 2、
hwRegUCBRSx = 3、
过采样= 1.
}、
在 uartecho.cfg 中、我添加了:
boot.configureDCO = false;
VAR ClockFreqs = xdc.useModule('ti.sysbios.family.msp430.ClockFreqs');
bios.cpufreq.lo = 4000000;
ClockFreqs.SMCLK = 4000000;
ClockFreqs.ACLK = 32768;
我从 SYS/BIOS 获取了 boot.c 文件、并通过更改 UCS 控制寄存器2中的乘法器将其修改为将 SMCLK 设置为4MHz。 我要附加此 boot.c 文件。 我从 main()调用函数 Boot_configureDCO ()。
我仍在研究它为什么不适用于24MHz。
此致、
Janet
感谢 Janet、
您能否向我展示如何配置为在 MSP430F5529 Launchpad 上使用2个 UART 外设? 我无法配置使用 UART 外设 A0和 A1。 我刚刚在 uartecho 示例中编辑了 Board.h、MSP430F5529.h 和 MSP430F5529.c、但它不起作用。
/*
* ****************************************************************************
* @def MSP430F5529_UARTName
* @brief Enum of UART names on the MSP430F5529
*/
typedef
enum
MSP430F5529_UARTName {
MSP430F5529_UART_A0 = 0,
MSP430F5529_UART_A1 = 1,
MSP430F5529_UART_COUNT
//Number of UART objects
} MSP430F5529_UARTName;
/*
* *****************************************************************
* @def uartUSCIAHWAttrs
* @brief UART hardware attributes
*/
const
UARTUSCIA_HWAttrs uartUSCIAHWAttrs[MSP430F5529_UART_COUNT] =
{
{
.baseAddr = USCI_A0_BASE,
.clockSource = USCI_A_UART_CLOCKSOURCE_SMCLK,
.bitOrder = USCI_A_UART_LSB_FIRST,
.numBaudrateEntries =
sizeof
(uartUSCIABaudrates)/
sizeof
(UARTUSCIA_BaudrateConfig),
.baudrateLUT = uartUSCIABaudrates
},
{
.baseAddr = USCI_A1_BASE,
.clockSource = USCI_A_UART_CLOCKSOURCE_SMCLK,
.bitOrder = USCI_A_UART_LSB_FIRST,
.numBaudrateEntries =
sizeof
(uartUSCIABaudrates)/
sizeof
(UARTUSCIA_BaudrateConfig),
.baudrateLUT = uartUSCIABaudrates
}
};
/*
* *****************************************************************
* @def UART_config
* @brief UART configuration list
*/
const
UART_Config UART_config[] = {
{
.fxnTablePtr = &UARTUSCIA_fxnTable,
.object = &uartUSCIAObjects[0],
.hwAttrs = &uartUSCIAHWAttrs[0]
},
{
.fxnTablePtr = &UARTUSCIA_fxnTable,
.object = &uartUSCIAObjects[1],
.hwAttrs = &uartUSCIAHWAttrs[1]
},
{NULL, NULL, NULL}
};
void IOSEKPeripheral_initUART (void)
{
//初始化 UART 引脚
//P3.3、4 = USCI_A0 TXD/RXD
//--------------------------------------
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、
GPIO_PIN3 | GPIO_PIN4);
//P4.4、5 = USCI_A1 TXD/RXD
//--------------------------------------
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、
GPIO_PIN4 | GPIO_PIN5);
//初始化 UART 驱动程序
//--------------------------------------
UART_INIT();
}
尊敬的 Duc:
您的配置对我来说似乎正常。 测试板文件中的内容如下所示:
e2e.ti.com/.../3034.MSP_5F00_EXP430F5529LP.c
您可以将此文件与您的文件进行比较。
此致、
Janet
尊敬的 Duc:
我很高兴听到它正在工作。
此致、
Janet