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.

[参考译文] CCS/MSP430FR2355:使用 CCS 终端窗口与 MSP-EXP430FR2355 launchpad 反向通道 UART 进行通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/765040/ccs-msp430fr2355-using-ccs-terminal-window-to-communicate-with-the-msp-exp430fr2355-launchpad-backchannel-uart

器件型号:MSP430FR2355

工具/软件: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 模块功能);  

EUSCI A1设置如下:

空 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、&param);

if (STATUS_FAIL = EUSCI_A_UART_INIT (EUSCI_A1_BASE、&param))
返回;

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 启用中断、因为我没有接收任何字符、只发送。

我从按钮处理程序发送字符、但我认为这不重要。  我们非常感谢您的任何帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、
    我取得了一些进展。 我曾认为我已将 DCO 设置为8MHz、并使用它来提供 SMCLK。 嗯、DCO 设置不正确。 我使用了
    _bis_SR_register (SCG0);//禁用 FLL
    CSCTL1 = DCORSEL_3;// DCO 范围= 8MHz
    _DELAY_CYCLES (3);
    CSCTL2 = FLLD_0 + 243;// DCOCLKDIV = 8mH
    _BIC_SR_register (SCG0);//启用 FLL
    CS_initClockSignal (CS_SMCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK_DIVIDER_1);


    我现在在终端上看到的字符不清晰。 因此、我认为 DCO 设置为8MHz 和/或分配给 SMCLK 时仍然有问题。

    我使用的是寄存器级别、因为我无法获取用于设置 DCO 的 API 宏。 initClockSignal()为 initClockSource 字段采用 CS_DCOCLKDIV_select。 但是,如果 CS_DCOCLKDIV_SELECT (SELMS_DCOCLKDIV)设置为8MHz 或其他...,我还不能解密 欢迎在这里提供任何帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 James、

    您在终端上看不到传输字符的原因尚不清楚。 请上传您的源代码、以便我可以尝试重新创建您的问题并确定问题是什么?

    此致、

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

    TI Resource Explorer (dev.ti.com/.../ )中有一个寄存器级 UART 回波示例(msp430fr235x_euscia0_UART_01.c)、可帮助您正确设置 UART 外设。 您可能需要更改用于匹配反向通道 UART 的 EUSCI、以使其在 Launchpad 上正常工作;或者、您也可以使用跳线连接到 eZ-FET 电路、这两种方式都可以正常工作。

    此致、

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

    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”(粘贴)会丢失颜色...?  

    再次感谢你能抽出时间。 我非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将介绍 MSP430FR2xx 系列数据表、尝试了解 DCOCLKDIV 块。 FD LPF 模块似乎比较了两个频率并调整了 DCO、以最大程度地减小其差异。 如果是、则 FLLREFDIC 和 FLLN-FLLD 对需要生成匹配频率。 DCO 似乎设置为以24MHz 运行、因此 FD LPF 传入频率需要是一些整数倍。 晶振为32KHz、将 FLLREFDIV 设置为1分频意味着 FLLN-FLLD 输出的频率需要为32KHz。将 FLLD 分频器设置为32会为 FLLN 分频至32KHz 留下750Hz。 这不是达到32KHz 的整数倍。 FLLN 除数需要设置在23.5左右、并动态调整。


    如果我使用默认的24MHz 预设、那么我可以将 MCLK 设置为16KHz、只需将 SMCLK 除以2即可获得8MHz (我的 UART 需要)
    我正在尝试使用 DCORSEL、MOD 来设置16MHz 运行。 使用 REF0CLK 可能是最简单的方法、只需选择 MCLK 和 SMCLK 分频器...

    无论如何、我并不确切地说哪种方法更好。 我本以为晶体在温度和电压范围内比 REF0或 DCO 更稳定。 (笑声)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经将时钟处理得更好、但终端上仍然没有字符。时钟处理得更好(在为该部件寻找时钟 API 时花费了很多精力、但在末尾使用了寄存器级编程)。   我使用 getSMCLK()来验证8MHz 时钟是否符合预期。 但终端上仍然没有输出。 以下是我的代码。 除了使用字复制/粘贴之外,还必须有更好的方法来发布代码。。
    我们非常感谢您的任何帮助。
    #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;  将 FLL=1结果设置为/2分频器且 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、&param);
      if (STATUS_FAIL = EUSCI_A_UART_INIT (EUSCI_A1_BASE、&param))
       返回;
      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");

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

    器件型号: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、&param);
    if (STATUS_FAIL = EUSCI_A_UART_INIT (EUSCI_A1_BASE、&param))
    返回;
    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");

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

    有一种方法可以将代码、源代码、图像和文件上载到您的帖子中;您需要使用"插入代码、附加文件等..." "答复框"窗口右下角的链接。

    上面引用的 TI Resource Explorer 中有很多有关时钟系统的示例、其中的示例展示了如何使用 DCO 或外部晶体等不同的源将 MCLK 和 SMCLK 初始化为不同的频率。 在寄存器级别还有更多针对不同板载外设的示例、因此通常最好在这里开始了解它们是如何初始化和实现的。

    如果您已经解决了有关时钟方案的问题、并且现在在 CCS 中存在 UART 和终端问题、提供 CCS 终端属性的屏幕截图可能会有所帮助。 此外、您还可以附加源代码的压缩版本、以便我可以尝试在我的末尾重新创建您的问题

    此致、

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

    我还继续、合并了您创建的与原始线程相同问题的新线程。 请尝试将同一问题的支持保留在同一主题的本地、以便我们可以跟踪这些问题以获得正确的解决方案。 感谢您在调试过程中的耐心等待。

    此致、

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

    您好、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"。 我已附加代码

    。  

    //#include
    #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)
        CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK;//为 MCLK 选择 DCOCLKDIC、为 ACLK 选择 XT1 (32768Hz)
        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 ={};
       param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_ACLK;
       param.clockPrescalar = 3;
       param.firstModReg = 0;
       param.secondModReg = 0x92;
       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_LOW_FREQUENCY BAUDRATE_generation;
       //UCA1CTLW0 =(0x0000);//以已知状态启动
       //UCA1CTLW0 = UCSSEL | UCSYNC ;//选择 aclk、无奇偶校验、一个停止和异步操作
       ///EUSCI_A_UART_INIT (EUSCI_A1_BASE、&param);
       if (STATUS_FAIL = EUSCI_A_UART_INIT (EUSCI_A1_BASE、&param))
           返回;

       _delay_cycles (10000);
       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 (1000000);//等待去抖
       //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、

    我在 eusci_a_UART 头文件中的此注释中发现:  

    "请注意、如果 TX 中断被禁用、此函数会手动轮询 TX IFG 标志、等待一个指示写入到发送缓冲区是安全的并且不会超时"


    我的简单例程不会轮询 UCTXIFG 标志、因此我需要手动设置该标志来启用 UART 传输并检查何时完成(为下一个做好准备)。  

    也许这是我的代码中的问题、但它没有解释我收到的奇怪字符。 我需要进一步了解。

     

     

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

    James、

    该头文件引用的是 eusci_a_uart.c 中的这一行代码:

    //轮询发送中断标志
    while (!(HWREG16 (baseAddress + OFS_UCAxIFG)& UCTXIFG)); 

    只要 TxBuffer 为空、该位就应置位、您就可以发送下一个数据包。 当新数据可以写入 Tx 缓冲寄存器时、该标志会自动置位。

    问题似乎出在时钟或 UART 外设的初始化方面。 缩小范围的一种好方法是将代码剥离以隔离问题。 您能否尝试修整项目中与 UART 和时钟初始化无关的任何部分? 不要按按钮传输数据、而是尝试在应用中定期传输数据。 在拆分版本中发现问题后、我们可以逐步添加其余功能、直到您的原始项目处于运行状态。

    此致、

    Matt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN2、GPIO_secondary 模块_function);
    > GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P4、GPIO_PIN3、GPIO_secondary 模块功能);

    根据数据表(SLASEC4B)表6-66、P4.2/3的次级(P4SEL=10)功能为/UCA1RXD 和/UCA1TXD、即反相。 主要功能是非反相的、因此请尝试:

    > GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN2、GPIO_PRIMARY_MODULE_Function);
    > GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P4、GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    James、

    我导入了您的代码、实施了 Bruce 建议的更改、现在我在终端上看到了正确的"hello"打印输出。 很棒的发现,布鲁斯! )

    从我可以告诉的内容来看、您正在中断服务例程中执行大量命令、这可能会导致代码中其他时间敏感事件出现问题。 最佳做法是使中断保持较短且良好、并根据中断中设置的标志在主函数中执行任务。

    此致、

    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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我也做了一个改变,从失败走向成功。 我在示波器上看到了反相信号。

    反向通道 UART 未反相、而是您的代码请求 USCI 提供反向输出(原理图6-6中的模块1和2)。

    正如 Matt 指出的:请注意调试器处于活动状态时、反向通道 UART 运行速度非常慢的令人困惑的症状。 在这种情况下、您可能需要等待4-5秒才能看到输出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Matt
    你好 Bruce
    表6-66清楚地显示了 eUSCI_A1有一个同相选项以及选择它所需的控件。 我本应该自己看到这一点。 我的错误是假设 API 的设置外设模块功能管理外设连接。 现在我看到这个函数管理表6-66 (第95页)的连接。 "...primary_module..."、"secondary _module..."的宏扩展 展开至 P4SEL 选择位。 使用高级 API 时、我会更加谨慎。 虽然我在用户指南中有 API 示例、但是否有一个地方记录了 API 的宏。 现在、我对头代码进行解密。

    再次感谢大家。 我非常感谢所有的帮助。