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/MSP-EXP430FR2433:通过 UART 获取计时器值

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP-EXP430FR2433, MSP430FR2633

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/892110/ccs-msp-exp430fr2433-getting-the-timer-value-with-uart

器件型号:MSP-EXP430FR2433
主题中讨论的其他器件: MSP430FR2633

工具/软件:Code Composer Studio

您好!

我正在使用 MSP-EXP430FR2433。 在我的 launchboard 上、我有2个 LED (P1.0/RED 和 P1.1/Green)和2个开关(P2.3和 P2.7)。 我的项目是更改红色 LED 的闪烁速度。 如果我按下 P2.3开关、它将降低速度;如果按下 P2.7开关 、它将提高闪烁速度。 我知道这个部件。 但我不知道如何使用 UART 获取计时器的值、因此我可以在 PC 上看到它。 有人可以帮帮我吗?

谢谢

以下是我的代码:

#include 


unsigned int aku1 = 0; // counter1
unsigned int aku2=0; // counter2
int 计数器= 0x1111;

#define SMCLK_115200 0
#define SMCLK_9600 1

#define UART_MODE SMCLK_115200//SMCLK_9600//

void initUART ()
{
//将 USCI_A0配置为 UART 模式
UCA0CTLW0 |= UCSWRST; //将 eUSCI 置于复位
#if UART_MODE = SMCLK_115200

UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK
//波特率设置
//使用表21-5
UCA0BRW = 8;
UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700为 UCBRSx = 0xF7

#Elif UART_MODE = SMCLK_9600

UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK
//波特率设置
//使用表21-5
UCA0BRW = 104;
UCA0MCTLW |= UCOS16 | UCBRF_2 | 0xD600;//0xD600为 UCBRSx = 0xD6
#else
#错误"请将波特率指定为115200或9600 "
#endif

UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
UCA0IE |= UCTXIE + UCRXIE; //启用 USCI_A0 RX 中断
}

void initClockTo16MHz ()
{
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;

_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz
CSCTL2 = FLLD_0 + 487; //设置为 fDCOCLKDIV =(FLLN + 1)*(fFLLREFCLK/n)
// =(487 + 1)*(32.768 kHz/1)
// = 16MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定

CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;
}

void initGPIO ()
{
//配置 GPIO
P1DIR |= BIT0; // P1.0输出
P1OUT &=~BIT0; // P1.0 törlés

P1DIR |= BIT1; // P1.1输出
P1OUT &=~BIT1; // P1.1 törlés

P2REN |= BIT3; // felhúzóellenállás ó n engedlyeze é se
P2OUT |= BIT3; //为 P2.3选择上拉模式
P2IE |= BIT3; // P2.3中断输入
P2IES |= BIT3; // P2.3高/低边沿
P2IFG &=~BIT3; // P2.7 IFG törlése

P2REN |= BIT7; //启用内部上拉/下拉电阻器
P2OUT |= BIT7; //为 P2.7选择上拉模式
P2IE |= BIT7; // P2.7中断被启用
P2IES |= BIT7; // P2.7高/低边沿
P2IFG &=~BIT7; // P2.7 IFG törlése

}

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT

initGPIO();
initClockTo16MHz();
inituart();
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

//TimerA0 konconfig
TA0CCTL0 |= CCIE; //启用 TACCR0中断
TA0CCR0 = 0x1111;
TA0CTL |= TASSEL_SMCLK | MC_1 | ID_8; // SMCLK、最高为相等模式

//TimerA1 konfig
TA1CCR0 = 0x5fff;
TA1CTL |= tassel_SMCLK | MC_1 | ID_8; // SMCLK、最高为相等模式

_bis_SR_register (LPM0_bits | GIE); // LPM3 (低功耗模式) s interruptk engedlyez
__no_operation(); // v é gtelen ciklus
}

//计时器 A0中断服务例程
#pragma vector = TIMER0_A0_vector
__interrupt void Timer_A (void)

{
P1OUT ^= BIT0; // P1.0 LED villogtatása
}

//计时器 A1中断服务例程
#pragma vector = Timer1_A0_vector //P1.1 LED visszajelző beállítása
_interrupt void Timer_B (void)

{
if (aku1 == aku2)
{
TA1CCTL0 &=~CCIE;
aku1=0;
}
其他
{
P1OUT ^= BIT1;
aku1++;
}

}

//端口2中断服务例程
#pragma vector=port2_vector
__interrupt void Port_2_7 (void)
{
IF (P2IFG 和 BIT3) //ha 一个 P2.3-as gomb 中断标志 aktív
{
if (TA0CCR0 = 0x0000) // a TimerA0 elte a minimumot
{
P2IFG &=~BIT3; // P2.3 IFG 环形
TA1CCTL0 |= CCIE; // TA1CCR0中断设计
TA1CCR0 = 0x8fff; // TimerA1 sebessg é nek megadása
TA0R = 0; // TimerA0计数器 nullázása
UCA0RXBUF=TA0CCR0;
aku2 = 4; // 2-t villan A visszajelző LED (P1.1)

}
其他
{
P2IFG &=~BIT3; // P2.3 IFG törlés
TA0CCR0 = TA0CCR0 - 0x1111; // TimerA0 é t é k é nek csökkentese è re
计数器=计数器- 0x1111;
TA0R = 0; // TimerA0计数器 nullázása
TA1CCTL0 |= CCIE; // TimerA1中断输入
TA1CCR0 = 0x5fff; // TimerA1 sebessg é nek megadása
UCA0RXBUF = TA0CCR0;
aku2 = 4; // 2-t villan A visszajelző LED (P1.1)
}
}

IF (P2IFG 和 BIT7) // ha a P2.7-as gomb interrupt flagje aktív
{
IF (TA0CCR0 == 0xFFFF) // a timerA0 elte a maximumot
{
P2IFG &=~BIT7; // P2.7 IFG 清零
TA1CCTL0 |= CCIE; // TimerA1中断设计
TA1CCR0 = 0x8fff; // TimerA1 sebessg é nek megadása
TA0R = 0; // TimerA0计数器 nullázása
UCA0RXBUF=TA0CCR0;
aku2 = 6; // 3-t villan A visszajelző LED (P1.1)
}
其他
{
P2IFG &=~BIT7; // P2.7 IFG 清零
TA0CCR0 = TA0CCR0 + 0x1111; // TimerA0 é t é k é nek növelése è re
计数器=计数器+ 0x1111;
TA0R = 0; // TimerA0计数器 nullázása
TA1CCTL0 |= CCIE; // TimerA1中断设计
TA1CCR0 = 0x5fff; // TimerA1 sebessg é nek megadása
UCA0RXBUF = TA0CCR0;
aku2 = 6; // 3-t villan A visszajelző LED (P1.1)
}
}


//*********
// UART 中断
//
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (USCI_A1_vector))#USCI_A0

Compiler #a0_aid!
#endif
{
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
}{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
/* while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = UCA0RXBUF;
__no_operation();*/
中断;
USCI_UART_UCTXIFG 案例:
while (!(UCA0IFG&UCRXIFG));
UCA0RXBUF = UCA0TXBUF;
__no_operation();
中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:break;
}
}

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

    好的、让我们看看我们是否可以让您启动并运行。

    我首先看不到的是选择端口引脚的辅助功能-这会将引脚从数字输入/输出(默认)更改为其他功能、例如 UART。

    由于您使用的是 UCA0、这意味着端口引脚 P1.4和 P1.5需要切换至它们的次级功能、如此处所示。  通过设置与 IO 引脚对应的 P1SEL 寄存器位,可以在 initGPIO()函数中执行此操作。

    P1SEL |=(GPIO_PIN4 | GPIO_PIN5);

    接下来、我在代码中看到、在几个地方、你将把当前定时器的计数器值复制到 UCA0RXBUF 中。  您不想这么做。  这是 UART 在接收到一个字节时自动填充的寄存器。  相反、您希望使用 UCA0TXBUF 发送数据、但必须首先将16位二进制值转换为 ASCII、以便它在 PC 终端上正确显示。

    我已经为 MSP430FR2633附加了一个 UART 示例、该示例接收来自 PC 终端的消息、并且可以将固定(静态)消息发送回 PC 或我的 TA0R 寄存器的值。

    请查看文件底部的 TIMER0 ISR 处理程序、了解如何在发送到 PC 之前将 TA0R 寄存器值转换为 ASCII。

    这个演示的酷之处在于、当 CPU 保持在 LPM0模式时、数据只使用中断进行传输。

    查看代码、了解如何配置时钟和 IO 引脚。  您可以根据自己的需求进行调整。  如果您有任何疑问、请访问 know.e2e.ti.com/.../5383.main.c

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

    首先感谢您!

    我有一个问题。 如果我想通过 USB 电缆进行通信,我是否必须写入您所说的 P1SEL |={GPIO_PIN4|GPIO_PIN5};,或者只需更改电路板上跳线的位置?

    谢谢

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

    您只需确保安装了 RX 和 TX 跳线。

    查看 FR2433 Launchpad 用户指南中的第2.2.4节

    是的,P1SEL |=(GPIO_PIN4|GPIO_PIN5)****注意使用“()"而不是“{}”,就像您在前一答复中所说的那样。

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

    您好!

    我几天都没有听到您的声音,因此我假设您能够解决您的问题。
    如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。