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.

[参考译文] MSP432P401M:中断产生的问题

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/573186/msp432p401m-interrupt-generated-problem

部件号:MSP432P401M

您好,

      我正在使用 自己 的MSP432P401M板 。  ADC具有3.3V的外部参考电压,我可以成功地对电压进行采样。 根据AVcc.ADC14内部振荡器乘以采样(16x)和转换,在A1上制作单个样本。  计时器32 (模块0)以32位,自由运行和定期模式设置。计时器计数加载时的初始值为0xFFFFFF。  计时器中断触发,ISR被执行。 在ISR内 ,软件将ADC14_CTL0_SC设置为开始采样和 转换- ADC14_CTL0在EOC时自动清除并增加计数器n的值。它只会清除中断标志并返回到主应用程序并进入while循环。  

1)当此代码为DEBUG时, 计数器m和n的值为增量,但响应非常慢。

这是我的代码:-

包括"MSP432P401M.h"

#include <stdint.h>

无符号int I;
无符号int j;
unsigned int l=1;

//用于调试的计数器
无符号int m=0;
无符号int n=0;

//*********************************************************************************************************
//主代码
内部主(无效)

//停止看门狗计时器
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;

// GPIO设置
P5->SEL1 |= BIT4;//为ADC配置WFP 5.4
p5->SEL0 |= BIT4;


//未使用的针脚设置

P10->DIR &=~(BIT0 + BIT1 + BIT2 + BIT3);//将P10设置为输入方向
P10->REN || BIT0 + BIT1 + BIT2 + BIT3;//在P10上启用上拉/下拉电阻器
P10->out &=~(BIT0 + BIT1 + BIT2 + BIT3);//将P10电阻设为下拉

P1->DIR &=~(BIT1 + BIT4 + BIT5 + BIT6 + BIT7);
P1->REN || BIT1 + BIT4 + BIT5 + BIT6 + BIT7;
P1->out &=~(BIT1 + BIT4 + BIT5 + BIT6 + BIT7);

P2->DIR &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);
P2->REN || BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
P2->out &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);

P8->DIR &= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
P8->REN || BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
P8->out &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);

P9->DIR &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);
P9->REN || BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;
P9->out &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);

P6->DIR &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);
P6->REN || BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
p6->out &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);

P4->DIR &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);
P4->REN || BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
P4->out &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);

P5->DIR &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);
P5->REN || BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
p5->out &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);

P7->DIR &=~(BIT0 + BIT1 + BIT2 + BIT3);
P7->REN || BIT0 + BIT1 + BIT2 + BIT3;
p7->out &=~(BIT0 + BIT1 + BIT2 + BIT3);

//ADC设置
ADC14->CTL0 = ADC14_CTL0_SHT0_2 | ADC14_CTL0_SHP | ADC14_CTL0_ON;//采样时间,S&H = 16,ADC14 ON
//ADC14->CTL1 = ADC14_CTL1_RES_2;//使用采样计时器,12位转换结果
ADC14->CTL1 = ADC14_CTL1_RES_3;//使用采样计时器,14位转换结果
ADC14->MCTL[0]|= ADC14_MCTLN_Inch_1;// A1 ADC输入选择;Vref=AVCC
// ADC14->IER0 |= ADC14_IER0_IE0;//启用ADC连接完全中断

同时(1)

如果(l == 1)

// Timer32设置为定期,自由运行,32位,无预缩放
TIMER32_1->CONTROL = TIMER32_CONTROL_SIZE | TIMER32_CONTROL_OneShot;

//加载计时器32计数器,带初始值
TIMER32_1->load= 0xFFFFFF;

//在NVIC中启用Timer32中断
__enable_IRQ();
NVIC->ISER[0]=1<<(T32_INT1_IRQn)和31);

//从ISR退出时禁用睡眠
SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;

//启动Timer32并启用中断
TIMER32_1->CONTROL |= TIMER32_CONTROL_ENABLE | TIMER32_CONTROL_IE;


//输入LPM0并等待定时器中断唤醒
//__sleep();
//__no_operation();


M++;
如果(m>5万)

M=0;
}

l=0;

}
}
}
void T32_INT1_IRQHandler (void)

// p1->out ^= BIT0;//切换WFP 1.0 LED

//开始采样/转换
ADC14->CTL0 || ADC14_CTL0_ENC | ADC14_CTL0_SC;
n++;
如果(n=5万)

N=0;
}


TIMER32_1->INTCLR || BIT0;//清除Timer32中断标志

//禁用计时器和中断
TIMER32_1->CONTROL &=~(TIMER32_CONTROL_ENABLE |TIMER32_CONTROL_IE);
L= 1;

}

2)如果我正在从我的代码中删除l=1,则计数器n不是增量

这是我的代码:-

(GPIO引脚设置和ADC设置与上述代码相同)

同时(1)

// Timer32设置为定期,自由运行,32位,无预缩放

TIMER32_1->CONTROL = TIMER32_CONTROL_SIZE | TIMER32_CONTROL_OneShot;

//加载计时器32计数器,带初始值
TIMER32_1->load= 0xFFFFFF;

//在NVIC中启用Timer32中断
__enable_IRQ();
NVIC->ISER[0]=1<<(T32_INT1_IRQn)和31);

//从ISR退出时禁用睡眠
SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;

//启动Timer32并启用中断
TIMER32_1->CONTROL |= TIMER32_CONTROL_ENABLE | TIMER32_CONTROL_IE;


//输入LPM0并等待定时器中断唤醒
//__sleep();
//__no_operation();


M++;
如果(m>5万)

M=0;
}

}

void T32_INT1_IRQHandler (void)

// p1->out ^= BIT0;//切换WFP 1.0 LED

//开始采样/转换
ADC14->CTL0 || ADC14_CTL0_ENC | ADC14_CTL0_SC;
n++;
如果(n=5万)

N=0;
}


TIMER32_1->INTCLR || BIT0;//清除Timer32中断标志

//禁用计时器和中断
TIMER32_1->CONTROL &=~(TIMER32_CONTROL_ENABLE |TIMER32_CONTROL_IE);
}

为什么计数器值n不递增??