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.

[参考译文] MSP430F5438A:编辑一个 MSP430来计算两个外部信号间的时间差

Guru**** 2481465 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1275869/msp430f5438a-programming-a-msp430-to-calculate-the-time-difference-between-two-external-signals

器件型号:MSP430F5438A

我正在尝试计算两个外部信号之间的差值。 在我的代码中、我设置了计时器 A 和中断、以便在每个外部信号都上升时捕获时间戳。 我正在使用 RF3引脚1.2和1.4作为输入。 计算时差值时、它应在 LCD 屏幕上显示值。 不过、在测试代码时、不会检测到输入信号、似乎什么也不会发生。 我不知道我哪里出了问题。

#include "MSP430.h"
#include "hal_lcd.h"
#include "hal_lcd_fonts.h"

空针(空);
void PinInit (void);
void TimerA0Init (void);
void LCDInit (void);
void format_numerical_string();

Volatile unsigned long pulse1_TIMESTAMP = 0;
Volatile unsigned long pulse2_timestamp = 0;
volatile unsigned long time_diff = 0;

void format_numerical_string (unsigned int n);
char LCD_string[12]=" DeltaT:xxx\0";
/**
* main.c
*/
int main (空)
{
volatile unsigned int Delta_T、time_diff;

//硬件配置
WDTCTL = WDTPW | WDTHOLD;//秒表定时器
/*初始化连接引脚*/
Tiepins ();
/*初始化 GPIO 以实现最小电流消耗*/
PinInit ();
//初始化 LCD 和背光
LCDInit ();
/*初始化计时器 A0.1 */
TimerA0Init ();

_enable_interrupt ();//启用全局中断

while (1)
{
Delta_T = time_diff;
//更新 LCD。 打印消息字符串
format_numerical_string (Delta_T);
halLcdPrintLineCol (LCD_string、5、1、overwrite_text);

//在 SR 寄存器中设置位(LPM3_BITS + GIE)以进入 LPM3模式
__ bis_SR_register (LPM3_BITS + GIE);

返回0;

//msp430引脚初始化
空铁杆()
{
//连接未使用的端口
PAOUT = 0;PADIR = 0xFFFF;PASEL = 0;
PBOUT = 0;PBDIR = 0xFFFF;PBSEL = 0;
PCOUT = 0;PCDIR = 0xFFFF;PCSEL = 0;
PDOUT = 0;PDDIR = 0xFFFF;PDSEL = 0;
// P10.0至 USB RST 引脚、如果通过 J5启用
PEOUT = 0;PEDIR = 0xFEFF;PESEL = 0;
P11OUT = 0;P11DIR = 0xFF;P11SEL = 0;
PJOUT = 0;PJDIR = 0xFF;
P6OUT = 0x40;//关闭音频输出放大器

空 LCDInit()
{
halLcdInit ();

halLcdBackLightInit ();
halLcdSetBackLight (8);
halLcdSetContrast (90);
halLcdClearScreen ();
halLcdPrintLine (" ASL"、0、0);
halLcdPrintLineCol (LCD_string、5、1、0);

//msp430引脚初始化
空 PinInit()
{
//配置用于脉冲检测的输入引脚
//将 P1.2配置为输入
P1SEL |= BIT2;//为 P1位2选择 RF3
P1DIR &&~BIT2;//将 P1.2设置为输入
P1REN |= BIT2;//启用上拉/下拉电阻
P1IN |= BIT2;//设置上拉电阻

//将 P1.4配置为输入
P1SEL |= BIT4;//为 P1位4选择 RF3
P1DIR &&~BIT4;//将 P1.4设置为输入
P1REN |= BIT4;//启用上拉/下拉电阻
P1IN |= BIT4;//设置上拉电阻


//针对 P1.2和 P1.4上的上升沿启用中断
P1IES &=~BIT2;//在上升沿设置中断
P1IFG &&~BIT2;//清除任何挂起的中断
P1IE |= BIT2;//启用 P1.2的中断


P1IES &=~BIT4;//在上升沿设置中断
P1IFG &&~BIT4;//清除任何挂起的中断
P1IE |= BIT4;//启用 P1.4的中断

空 TimerA0Init()
{
//为计时器 A 设置捕捉,同步捕捉源
TA0CCTL0 = CM_1 + CCIS_0 + SCS + CAP + CCIE + CCI + CCIFG;
//为计时器 A 设置捕捉,同步捕捉源
TA0CCTL1 = CM_1 + CCIS_1 + SCS + CAP + CCIE + CCI + CCIFG;
//计时器源 SMCLK、连续模式、清除计时器、启用中断标志
TA0CTL = TASSEL_2 + MC_2 + TACLR + TAIE + TAIFG;
// TA0CCR0 = 0xFFFF;//将计时器设置为其最大值

#pragma vector = TIMER0_A0_Vector
__interrupt void Timer0_A0_ISR (void)
{
pulse1_timestamp = TA0CCR0;//捕获脉冲1的时间戳

P1IFG &&~BIT2;//清除任何挂起的中断

#pragma vector = TIMER0_A1_Vector
__interrupt void Timer0_A1_ISR (void)
{
if (TA0IV => TA0IV_TACCR1)//检查发生了哪个捕获事件
{
pulse2_timestamp = TA0CCR1;//捕获脉冲2的时间戳
time_diff = pulse2_timestamp - pulse1_timestamp;//计算时间差

P1IFG &&~BIT4;//清除任何挂起的中断

//创建带电压测量的字符串
void format_numerical_string (unsigned int n)
{
无符号字符1 ='0';
无符号字符阈值='0';
无符号字符百分位='0';

while (n >= 10)
{
One++;
N-= 10;

while (n >= 1)
{
十倍以上;
N-= 1;

百分位数+=n;
LCD_string[7]=一;
LCD_string[8]=十分之一;
LCD_string[9]=百分位;

//LCD_string[7]='1';
// LCD_string[8]='2';
//LCD_string[9]="3";

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

    尊敬的 Ciaran:

    在您的部分代码中、您执行此行:

    __ bis_SR_register (LPM3_BITS + GIE);

    这将使器件进入低功耗模式3、从而禁用 一些功能、包括一些时钟和器件的 CPU。 有关详细信息、请参阅  器件数据表的第9.2节。 尝试将此行更改为:

    __ bis_SR_register (GIE);

    这将防止器件进入低功耗模式。 请尝试一下、如果您需要进一步的建议、请告诉我。

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

    尊敬的 Dylan:

    感谢您的答复。 遗憾的是、此编辑未做任何更改、仍没有生成输出值

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

    根据数据表(SLAS655H)表9-43和表9-54:

    TA0CCTL0 = CM_1 + CCIS_0 + SCS + CAP + CCIE + CCI + CCIFG;

    这请求位于 P1.1上的 TA0.CCI0A 和

    > TA0CCTL1 = CM_1 + CCIS_1 + SCS + CAP + CCIE + CCI + CCIFG;

    这请求 TA0.CCI1B、位于 P8.1上。

    P1.2和 P1.4分别为 TA0.CCI1A 和 TA0.CCI3A。  实际连接了哪些引脚?

    ----------------

    也就是说、我期望(删除 LPM 设置后)输出为"000"、根本没有输出。 您是否相当确定您的 LCD 显示功能正在工作?

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

    尊敬的 Ciaran:

    您是否能够解决您的问题?  

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

    Bruce、您好!

    我已经注意到该错误并进行了更正。 我要连接引脚 P1.2和 P1.4。 LCD 显示屏功能工作正常  

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

    Ciaran、

    您是说您的设备永远不会进入任一计时器捕获 ISR 吗? 我仔细查看了您的代码、并将其与我们发布的计时器捕获示例进行了比较、到目前为止我找不到任何代码中断差异。

    您是否尝试过未首先使用 LCD 的项目版本? 从我们的计时器采集示例之一开始构建您的应用程序代码可能会揭示问题并帮助您更快地前进。