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.

[参考译文] LAUNCHXL-F28379D:C2000 sci_echoback 示例不起作用! 字符不正确

Guru**** 2560390 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/637238/launchxl-f28379d-c2000-sci_echoback-example-not-working-incorrect-characters

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件: C2000WARE

大家好! 我是 C2000和一般微控制器的新手。 我尝试从 C2000ware 中学习几个示例、但我被困在 sci_ex3_echoback 示例中(在 driverlib/f2837xd/examples/cpu1/下)。 我已经阅读过几篇文章、发现 在本示例中、LAUNCHXL-F28379D 的 GPIO 引脚为43/42、而不是28/29。 我在终端中得到的结果如下:

这似乎是一个波特率问题。 我的终端配置为9600波特、8位数据、1个停止位、无奇偶校验、如示例所示。 Launchpad 可通过开箱即用示例正常工作。 我的代码是

//
//包含的文件
//
#include "driverlib.h"
#include "device.h"

//
定义
//
定义自动波特以使用自动波特锁定功能
//#define autobaud

//
////全局
//
uint16_t loopCounter = 0;

//
Main
//
void main (void)
{void
uint16_t receivedChar;
unsigned char *msg;

//
//配置 PLL、禁用 WD、启用外设时钟。
//
device_init();

//
//禁用引脚锁定并启用内部上拉。
//
DEVICE_initGPIO();

//
// GPIO28是 SCI Rx 引脚。
//
GPIO_setMasterCore (43、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_43_SCIRXDA);
GPIO_setDirectionMode (43、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (43、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (43、GPIO_QUAL_异 步);

//
// GPIO29是 SCI Tx 引脚。
//
GPIO_setMasterCore (42、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_42_SCITXDA);
GPIO_setDirectionMode (42、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (42、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (42、GPIO_QUAL_异 步);

//
//初始化中断控制器和矢量表。
//
interrupt_initModule();
interrupt_initVectorTable();

//
//初始化 SCIA 及其 FIFO。
//
SCI_performSoftwareReset (SCIA_BASE);

//
//为回声配置 SCIA。
//
SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、(SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_resetChannels (SCIA_BASE);
SCI_resetRxFIFO (SCIA_BASE);
SCI_resetTxFIFO (SCIA_BASE);
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF | SCI_INT_RXFF);
SCI_enableFIFO (SCIA_BASE);
SCI_enableModule (SCIA_BASE);
SCI_performSoftwareReset (SCIA_BASE);

#ifdef 自动波特率
//
//执行自动波特率锁定。
// SCI 要求用'A'或'A'来锁定波特率。
//
SCI_lockAutobaud (SCIA_BASE);
#endif

//
//发送起始消息。
//
MSG ="\r\n\n\nHello World!\0";
SCI_writeCharArray (SCIA_BASE、(uint16_t*) msg、17);
MSG ="\r\n 您将输入一个字符、DSP 将回显它!\n\n";
SCI_writeCharArray (SCIA_BASE、(uint16_t*) msg、62);

for (;;)
{
MSG ="\r\n 输入字符:\0";
sci_writeCharArray (SCIA_BASE、(uint16_t*) msg、22);

//
//从 FIFO 读取字符。
//
receivedChar = SCI_readCharBlockingFIFO (SCIA_BASE);

//
//回显字符。
//
MSG ="您已发送:\0";
SCI_writeCharArray (SCIA_BASE、(uint16_t*) msg、13);
SCI_writeCharBlockingFIFO (SCIA_BASE、receivedChar);

//
//递增循环计数变量。
//
loopCounter++;
}
}

//
//文件结束
// 
void
SCI_setConfig (uint32_t base、uint32_t lspclkHz、uint32_t baud、uint32_t config)
{
uint32_t 分频器;

//
//检查参数。
//所需的波特率是否大于支持的最大速率?
//
assert (SCI_isBaseValid (base));
assert (baud!= 0U);
assert (((baud * 16U)<= lspclkHz);

//
//停止 SCI。
//
SCI_disableModule (base);

//
//计算波特率分频器。
//
分频器=((lspclkHz/(波特* 8U))- 1U);

//
//设置波特率。
//
HWREGH (base + SCI_O_HBAUD)=(分频器和0xFF00U)>> 8U;
//HWREGH (基址+ SCI_O_HBAUD)= 0x0002;
HWREGH (base + SCI_O_LBAUD)=分频器和0x00FFU;
//HWREGH (基址+ SCI_O_LBAUD)= 0x0090;

//
//设置奇偶校验、数据长度和停止位数。
//
HWREGH (base + SCI_O_CCR)=((HWREGH (base + SCI_O_CCR)&
~(SCI_CONFIG_PAR_MASK |
SCI_CONFIG_STOP_MASK |
SCI_CONFIG_WLEN_MASK)| CONFIG);

//
//启动 SCI。
//
SCI_enableModule (base);
} 

你认为这可能是什么? 我尝试过几种波特率、但它们都不起作用。

提前感谢!!

Tony

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

    我发现了问题:我是。 使用 Launchpad 使 Launchpad 中的 XTAL 为10MHz、而不是 controlCARD 中的20MHz。 我必须更改  

    DEVICE_OSCSRC_FREQ 手动、因为从未调用过以下代码:

    
    LaunchPad 上的#ifdef _LAUNCHXL_F28379D //// 10MHz XTAL。 与 SYSCTL_getClock()一起使用。
    //
    #define DEVICE_OSCSRC_FREQ 10000000U
    
    //
    //定义以传递到 sysctl_setclock()。 将按如下方式配置时钟:
    // PLLSYSCLK = 10MHz (XTAL_OSC)* 40 (IMULT)* 1 (FULT)/2 (PLLCLK_BY_2)
    //
    #define DEVICE_SETTON_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT (40)|\
    SYSCTL_FMULT_NONE | SYSCTL_SYSDIV (2)|\
    SYSCTL_PLL_ENABLE)
    
    //
    // 200MHz SYSCLK 频率基于上述 device_setClock_CFG。 如果
    使用不同的时钟配置、请更新下面的//代码!
    //
    #define DEVICE_SYSCLK_FREQ (((DEVICE_OSCSRC_FREQ * 40 * 1)/ 2)
    
    //
    controlCARD 配置
    //
    #else
    
    //
    // controlCARD 上的20MHz XTAL。 与 SYSCTL_getClock()一起使用。
    //
    #define DEVICE_OSCSRC_FREQ 10000000U
    
    //
    //定义以传递到 sysctl_setclock()。 将按如下方式配置时钟:
    // PLLSYSCLK = 20MHz (XTAL_OSC)* 20 (IMULT)* 1 (FULT)/2 (PLLCLK_BY_2)
    //
    #define DEVICE_SETTON_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT (20)|\
    SYSCTL_FMULT_NONE | SYSCTL_SYSDIV (2)|\
    SYSCTL_PLL_ENABLE)
    
    //
    // 200MHz SYSCLK 频率基于上述 device_setClock_CFG。 如果
    使用不同的时钟配置、请更新下面的//代码!
    //
    #define DEVICE_SYSCLK_FREQ (((DEVICE_OSCSRC_FREQ * 20 * 1)/ 2)
    
    #endif 

    在哪里可以定义 _LAUNCHXL_F28379D 以便在每个示例中调用正确的配置?  

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

    该示例针对具有20MHz 外部振荡器的 controlCARD 编写。 LaunchPad 具有10MHz 外部振荡器。

    您需要进行相应的修改。 要么确保 SYSCLK 为200MHz、要么是波特率的两倍。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答、我通过定义来解决问题

    #ifndef _LAUNCHXL_F28379D
    #define _LAUNCHXL_F28379D
    #endif

    但是、我必须将 SYSCLK 更改为100MHz 才能使其正常工作

    #define DEVICE_OSCSRC_FREQ 10000000U
    #define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 20 * 1)/2)