我正在尝试计算两个外部信号之间的差值。 在我的代码中、我设置了计时器 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";
}