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.
工具/软件:Code Composer Studio
大家好
我在通过反向通道 UART 发送文本字母以在 CCS 终端窗口上显示时遇到问题
我正在 MSP430FR2355 Launchpad 演示板上使用 EUSCI_A1 (该演 示板提供两个 COM 端口、一个用于 eZ-FET 调试、另一个用于用户应用)。
我已经将 CCS 终端设置为使用 MSP 应用 UART1。 (原理图上的 UCA1)。
在应用中、将 EUSCI A1配置为对 UCA1TXD 使用 P4.3、对 UCA1RXD 使用 P4.2。 波特率设置为9600。
此时、我仅尝试向 CCS 终端发送一个字符。 当然、它不起作用。 我已经验证了 eUSCI A1是否由 eZ-FET 使用。
我的引脚设置如下:
//配置 P4.3 - UCA1TXD 和 P4.2 - UCA1RXD
GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
GPIO_setAsOutputPin (GPIO_PORT_P4、GPIO_PIN3);
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN2、GPIO_secondary 模块_function);
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P4、GPIO_PIN3、GPIO_secondary 模块功能);
空 Init_UART()
{
//配置 UART
EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockPrescalar = 52;
param.firstModReg = 1;
param.secondModReg = 0x49;
param.parity = EUSCI_A_UART_NO_parity;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numerofStopBits = EUSCI_A_UART_Oe_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.oversaming= EUSCI_A_UART_oversaming_BAUDRATE_generation;
///EUSCI_A_UART_INIT (EUSCI_A1_BASE、¶m);
if (STATUS_FAIL = EUSCI_A_UART_INIT (EUSCI_A1_BASE、¶m))
返回;
EUSCI_A_UART_ENABLE (EUSCI_A1_BASE);
}
我解锁了引脚
PMM_unlockLPM5 ();
然后使用
EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"H");
发送"Hello World!"的第一个字符。
我本可以假设将 EX-FET 配置为 EUSCI 以尽可能快的速度运行(即115.2K 波特) 、但示例代码将其设置为9600 (典型终端)。 我访问了 COM 端口设置、并验证了 MSP 调试接口和 MSP 应用 UART1接口均设置为9600 b/s、8个数据位、无奇偶校验、1个停止位和无流量控制。
此时、我没有为 EUSCI 启用中断、因为我没有接收任何字符、只发送。
我从按钮处理程序发送字符、但我认为这不重要。 我们非常感谢您的任何帮助。
Matt、您好!
非常感谢您花时间提供帮助。 我的时钟被弄乱了。 使用 CS_getMCLK ();和 CS_getMCLK ();我发现是的、我有一个8MHz SMCLK、但我的 MCLK 是1MHz。 是的、这是怎么实现的? 我想 getxCLK()函数是使用错误参数计算的。
我按照不同但相似 的示例在寄存器级别设置字段、如下所示:
_bis_SR_register (SCG0);//禁用 FLL
CSCTL1 = DCORSEL_3;// DCO 范围= 8MHz、调制被启用
_DELAY_CYCLES (3);
CSCTL2 =(0x00f3);//FLLD_0 + 243;// DCOCLKDIV = 8mH
CSCTL3 =(0x0000);//SELREF 至 XT1CLK、FLLREFDIV 设置为1分频
CS_initClockSignal (CS_SMCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK_DIVIDER_1);
CS_initClockSignal (CS_ACLK、CS_VLOCLK_select、CS_clock_divider);// 10kHz
_BIC_SR_register (SCG0);//启用 FLL
但是软件上帝今天对我不是很友好… SMCLK 为8MHz、MCLK 为1Hz。 有些事情做得不好…
我是否可以直接上传源代码或图像。 文字“COPY”(复制)/“Paste”(粘贴)会丢失颜色...?
再次感谢你能抽出时间。 我非常感谢。
器件型号:MSP430FR2355
工具/软件:Code Composer Studio
我的原始代码有计时问题、我认为现在已经解决了。 在时钟配置期间、我设法将二进制文件发送到 CCS 终端、但时钟频率不是我用于配置 EUSCI A1 (即 launchpad 板(MSP430FR2355)上的 eZ-FET 使用的 UART)的参数的目标值。 所有内容均可编译和链接。 时钟频率运行由 getMCLK ()函数验证。 我已经介绍了传递给 UART 的参数、验证了 UART (A1)的实例、并对照演示板的原理图检查了引脚排列。 除了使用 UART 参数设置之外、我还有其他损失、但这是一种未命中/未命中的方法。 我们非常感谢您的任何帮助。
谢谢你
Jim
#include
uint32_t myACLK = 0;
uint32_t mySMCLK = 0;
uint32_t myMCLK = 0;
//函数
void initClocks (void){
cs_setExternalClockSource (32768);//CS_get?CLK 需要知道外部时钟源
myACLK=CS_getACLK();
myMCLK=CS_getMCLK ();
mySMCLK=CS_getSMCLK();
//使用 include 中的 msp430fr2355.h 注册级别语句
//根据器件数据表的要求为8MHz 以上的 MCLK 操作配置一个 FRAM 等待状态
//必须在配置时钟系统之前完成。
FRCTL0 = FRCTLPW | NWAITS_1;//对于高达8MHz 的频率,使用 FRCTLPW | NWAITS_0;对于高达16MHz 的频率,使用 NWAITS_1;对于高达24MHz 的频率,使用 NWAITS_2
_bis_SR_register (SCG0);//禁用 FLL 以启用对寄存器的写入。
CSCTL3 |= SELREF_XT1CLK;//将 CTL1设置为 FLL 基准源(32.768kHz)
CSCTL4 = SELMS_DCOCLKDIV | SELA_VLOCLK;//为 MCLK 选择 DCOCLKDIV、为 ACLK 选择 VLO (10kHz)
CSCTL0 = 0x0000;//设置可能的最低 DCOx、MODx ofer:mod=0 DCO=0
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM = 5、DCO 范围= 16MHz
CSCTL2 = FLLD_0 + 487;// DCOCLKDIV = 16MHz;对于8MHz 运行、使用:CSCTL2 = FLLD_1 + 244;在/2分频器中设置 FLLD=1结果、FLLN=244
// DCO 范围位被改变时、DCO 最坏情况的稳定时间为 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。 32 x 32 x 8 MHz/32、768Hz = 250000 = MCLK 周期、以便 DCO 稳定。
CSCTL5 = DIVS_1;//对于 SMCLK (8MHz)将 MCLK 除以2
_DELAY_CYCLES (250000);//等待 FLL 稳定
_BIC_SR_register (SCG0);
myACLK=CS_getACLK ();//10kHz
mySMCLK=CS_getSMCLK();//8MHz
myMCLK=CS_getMCLK ();//16MHz
}
initTimer(void){
myACLK=CS_getACLK ();//10kHz
Timer_B_initContinuousModeParam initB1 ={};//初始化程序选择 TB1
initb1.clockSource=timer_B_CLOCKSOURCE_ACLK;
initb1.clockSourceDivider=timer_B_CLOCKSOURCE_divider;
initb1.timerInterruptEnable_TBIE = Timer_B_TBIE_INTERRUPT_ENABLE;
initb1.timerClear = timer_B_do_clear;
initb1.startTimer=false;
Timer_B_initContinuousMode (timer_B1_base、&initB1);
}
空 Init_UART()
{
//配置 UART
EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockPrescalar = 52;
param.firstModReg = 1;
param.secondModReg = 0x49;
param.parity = EUSCI_A_UART_NO_parity;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numerofStopBits = EUSCI_A_UART_Oe_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.oversaming= EUSCI_A_UART_oversaming_BAUDRATE_generation;
///EUSCI_A_UART_INIT (EUSCI_A1_BASE、¶m);
if (STATUS_FAIL = EUSCI_A_UART_INIT (EUSCI_A1_BASE、¶m))
返回;
EUSCI_A_UART_ENABLE (EUSCI_A1_BASE);
}
空 initGPIO()
{
//设置 P1.6 LED
GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
GPIO_setAsOutputPin (GPIO_PORT_P6、GPIO_PIN6);
//将 P2.3和 P1.1设置为输入按钮
GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P2、GPIO_PIN3);
GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P4、GPIO_PIN1);
//P2IES &=~BIT3;//低电平到高电平的转换
P2IFG = 0x00;//清除所有中断标志
//使能引脚中断
GPIO_enableInterrupt (GPIO_PORT_P2、GPIO_PIN3);
GPIO_enableInterrupt (GPIO_PORT_P4、GPIO_PIN1);
//配置 P4.3 - UCA1TXD 和 P4.2 - UCA1RXD
GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
GPIO_setAsOutputPin (GPIO_PORT_P4、GPIO_PIN3);
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN2、GPIO_secondary 模块_function);
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P4、GPIO_PIN3、GPIO_secondary 模块功能);
}
int main (void){
volatile uint32_t i;
volatile uint16_t j;
//停止看门狗计时器
WDT_A_HOLD (WDT_A_base);
initClocks();
initGPIO();
init_uart();
///EUSCI_A_UART_ENABLE (EUSCI_A1_BASE);
//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PMM_unlockLPM5 ();
PM5CTL0 &=~LOCKLPM5;
//关闭 LED
GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
//启动计时器 B1及其中断
initTimer();
Timer_B_startCounter (timer_B1_base、timer_B_Continuous_mode);
Timer_B_enableInterrupt (timer_B1_base);
_bis_SR_register (GIE);//启用中断
while (1)
{
volatile uint8_t i;
}
}
volatile uint32_t i;
volatile uint32_t j;
#pragma vector=Timer1_B1_vector
_interrupt void TOG_LED (void){
GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
Timer_B_clearTimerInterrupt (timer_B1_base);
}
#pragma vector=port2_vector
//定义中断矢量
_interrupt void ISR_button_P23 (void){
_delay_cycles (2000000);//等待去抖
P1OUT &=~BIT0;
P2IFG = 0x00;//清除中断标志
P6OUT |= BIT6;
对于(j=6;j>0;j--)//等待6个周期
{
for (i=200000;i>0;i--);
};
P6OUT &=~BIT6;
}
#pragma vector=Port4_vector
//定义中断矢量
_interrupt void ISR_button_P41 (void){
_delay_cycles (2000000);//等待去抖
//GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P4、GPIO_PIN3、GPIO_secondary 模块功能);
EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"H");
EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"E");
EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"L");
EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"L");
EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"O");
P1OUT &=~BIT0;
P4IFG = 0x00;//清除中断标志
P6OUT &=~BIT6;
对于(j=6;j>0;j-)//三次闪存-每个闪存循环两次代码
{
P6OUT ^= BIT6;
_delay_cycles (4000000);//替换为计时器
EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"H");
}
P6OUT &=~BIT6;
///EUSCI_A_UART_transmitData (EUSCI_A1_BASE、"H");
}
您好、Matt
我在帖子顶部看到"已解决"、并认为它已关闭、这就是我打开第二个主题的原因。
我正在使用代码示例、但仍然有问题。 其中一个代码示例使用了用于 UART 和 SMCLK 的8MHz 时钟源。
我使用 ACLK 源将 eUSCI A1切换为32768Hz 晶振时钟。 我在寄存器级别设置时钟。 启动时、SMCLK = MCLK = 1048576Hz。 ACLK = 32768Hz。 和预期的一样。 运行时钟初始化后、MCLK = 15990784Hz (16MHz)、SMCLK = 7995392Hz (8MHz)、ACLK = 32768Hz (32KHz)。 我计划在将来降低 SMCLK 和 MCLK 速度、但现在会这样做。
我已经按如下方式设置 CCS 终端:波特率9600、数据大小8、无奇偶校验、1个停止位。 MSP 应用 UART1 COM 端口上的默认编码(ISO-8859-1)。
EUSCIA1配置通过参数聚合结构传递 、值设置为使用 ACLK (32KHz)、从用户指南中获取的32KHz 晶体预分频器/调制值、LSB、无奇偶校验、1个停止和低频操作的值。
UART 由按钮处理程序调用。 按下按钮可将光标穿过终端(空字符)。
在将 API EUSCI_A_UART_INIT 置为有效之前、设置 UCA1CTLW0的值以选择 aclk、无奇偶校验、一个停止和异步操作会在 终端"Description"上产生部分可读字符。 如下所示(我未对寄存器语句添加注释)。 在更改到我的设置之前、UART 似乎正在使用 ezFET 配置。 这表明终端设置正确。 那么、问题出在我的 UART 设置中。
在 API 初始化函数之后应用 UART 寄存器级配置、会在 终端上生成"Description"。 我已附加代码
您好、Matt、
我在 eusci_a_UART 头文件中的此注释中发现:
"请注意、如果 TX 中断被禁用、此函数会手动轮询 TX IFG 标志、等待一个指示写入到发送缓冲区是安全的并且不会超时"
我的简单例程不会轮询 UCTXIFG 标志、因此我需要手动设置该标志来启用 UART 传输并检查何时完成(为下一个做好准备)。
也许这是我的代码中的问题、但它没有解释我收到的奇怪字符。 我需要进一步了解。
James、
该头文件引用的是 eusci_a_uart.c 中的这一行代码:
//轮询发送中断标志 while (!(HWREG16 (baseAddress + OFS_UCAxIFG)& UCTXIFG));
只要 TxBuffer 为空、该位就应置位、您就可以发送下一个数据包。 当新数据可以写入 Tx 缓冲寄存器时、该标志会自动置位。
问题似乎出在时钟或 UART 外设的初始化方面。 缩小范围的一种好方法是将代码剥离以隔离问题。 您能否尝试修整项目中与 UART 和时钟初始化无关的任何部分? 不要按按钮传输数据、而是尝试在应用中定期传输数据。 在拆分版本中发现问题后、我们可以逐步添加其余功能、直到您的原始项目处于运行状态。
此致、
Matt
您好、Matt
你好 Bruce
我在检查 launchpad 原理图时也发现了此问题。 我最初被表4-2误导 、表4-2显示 UCA1TXD/UCA1RXD 为正(而表4-2显示 RST 为反相)。 但是、我尝试使用软件更改引脚极性没有成功。
正如我对 API 的理解、函数"GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P4、GPIO_PIN3、GPIO_secondary 模块_function)"仅将引脚分配给外设模块。 图6-6"采用施密特触发器的端口 P4输入/输出(SLASEC4B)显示模块没有反相路径。 我认为信号极性需要来自模块本身。 例如、eCOMP 提供了一个控制寄存器、允许其输出反相(CPINV)。 我没有找到任何 eUSCI 使我能够改变其极性的东西。
今天早上、我尝试了您的建议、使用 GPIO_PRIMARY_MODULE_FUNCTION、但获得了相同的"二进制"类型的结果。 我不知道 Matt 如何让它正常工作。 Matt、您是否使用了相同的 launchpad (可能您的 UART 引脚未反相)? 请向我发送您的代码。 我的代码示例当然不严重、只是为了了解该部件需要做些什么。 但感谢您指出这一点。 我感谢为指导我所做的努力。
谢谢 Bruce、感谢 Matt、我非常感谢你们的帮助和努力。 但此时、我认为无需使用外部试验电路板和 eUSCIA0、就可以让这个特定的 Launchpad 与 CCS 中的输出终端进行通信。 如果您知道某种方法、请告诉我如何反转。 如果您的代码与 MSP430FR2355 Launchpad 配合使用、请将其压缩到我的电脑上。
再次感谢大家、非常感谢大家为帮助我解决这个问题所付出的努力。
在他的位置、我可能别无选择、只能 切换到使用同相反向反向通道 UART 进行通信的其他 Launchpad。
Jim
/cfs-file/__key/communityserver-discussions-components-files/166/driverlib_5F00_UART_5F00_test.zip
Jim、
只需使用 Launchpad 和 USB 电缆即可与 CCS 终端进行通信。 如果您无法在设置中正确查看通信、则我们的硬件设置可能会有所不同。 我提供了您随定义的主模块函数提供的示例代码的压缩版本。 我没有对您的代码进行任何其他更改、它可以在我的笔记本电脑上工作。
您必须对电路板进行编程、断开调试器的连接、然后连接到 CCS 终端以确保 UART 正常打印。
我已使用开箱即用的 MSP430FR2355 Launchpad 设置代码、然后按左按钮、屏幕上将显示"HELLOHHHH"。
此致、
Matt