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.

[参考译文] MSP430G2553:内在函数出现问题#39;__BIC_SR_REGISTER_ON_EXIT (GIE);#39;ADC 中断处理例程结束时

Guru**** 2577385 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/608676/msp430g2553-problem-with-intrinsic-function-__bic_sr_register_on_exit-gie-at-the-end-of-the-adc-interrupt-handling-routine

器件型号:MSP430G2553

大家好、我将开始学习如何  使用 Launchpad 对 msp430g2553进行编程。 我正在编写一个库来使用 ADC、转换已正确完成、但我遇到了以下问题。 当我从 ADC 中断处理例程返回时、我使用内在函数来指定它在活动模式下返回(在 ADC.c 存档中为'_BIC_SR_REGISTER_ON_EXIT (GIE);')。 在主代码中、我仅禁用 WDT、将 DCO 设置为1MHz 并配置 ADC。 如果在无限循环之前、我没有使 CPU 休眠(main.c 中的"__bis_SR_register (GIE);")、它就能正常工作、它会进入'if'语句、执行'for'并计算数组的平均值。 但是、如果我睡眠 CPU ("_bis_SR_register (CPUOFF | GIE);"、main.c 中的注释行)、当中断处理例程结束时 、它不会进入"while"循环、为什么我在中断处理例程结束时打开 CPU?  提前感谢。

main.c:

include "msp430g2553.h"
#include "adc.h"

int adc.[16];
int avgadc = 0;
unsigned int i;


int main (void){

WDTCTL = WDTPW + WDTHOLD; //停止 WDT
BCSCTL1 = CALBC1_1MHz; //将 DCO 设置为1MHz
DCOCTL = CALDCO_1MHz; //将 DCO 设置为1MHz

ADCConfigure();

ADCAcquireHum (ADC);

_bis_SR_register (GIE);
//_bis_SR_register (CPUOFF | GIE);

while (1){

if (ADCflag = task_done){

对于(i = 0;i < 16;i++){

avgADC = avgADC + ADC[i];

}

avgADC = avgADC >> 4;

}

}


adc.c:


#include "adc.h"

void ADCConfigure (void){

ADC10CTL1 = CONSEQ_2 + INCH_3; //重复单通道,A3
ADC10CTL0 = SREF_1 | REF2_5V | REFON | REFOUT | ADC10SHT_2 | MSC | ADC10ON | ADC10IE;//采样保持时间+ ADC10开启+中断使能
ADC10DTC1 = 0x10; // 16次转换
ADC10AE0 |= BIT3;
ADCflag = 0;
}

void ADCAcquireHum (int values[]){

ADC10CTL0 &=~ENC; //禁用转换
while (ADC10CTL1 & BUSY); //如果 ADC10忙则等待
ADC10SA =(int)值; //将数据传输到下一个数组(DTC 自动递增地址)
ADC10CTL0 |= ENC | ADC10SC; //启用转换和转换开始

}

#pragma vector=ADC10_vector
__interrupt void ADC10_ISR (void){

ADC10CTL0 &=~ENC;
ADCflag |= task_done;

__BIC_SR_REGISTER_ON_EXIT (GIE);//返回活动模式
}

ADC.h:


#include 

//定义 ADC 通道
#define ADC_A3 INCH_3

//定义 ADC 输入引脚
#define ADC_PIN_A1 BIT5 //将引脚 P1.5定义为 ADC 输入

//定义 ADC 通道标志。
#define TASK_DONE 8

volatile int ADCflag;

void ADCConfigure (void);
void ADCAcquireHum (int 值[]);

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CPUOFF 位用于打开/关闭 CPU。 GIE 启用/禁用中断。 ISR 的最后一行应该是
    >_BIC_SR_REGISTER_ON_EXIT (CPUOFF);

    至于"原因":键位于"_ON_EXIT"中。 其效果是在退出 ISR 时打开 CPU ("BIC"表示"位清零")。 该宏实际上修改了堆栈中保存的状态寄存器(SR)、然后在 ISR 返回时加载该寄存器。

    就个人而言、我难以记住所有字母表、我通常使用"LPM0;"停止 CPU、使用"LPM0_EXIT"从 ISR 重新启动 CPU。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好、我对该内在函数('_BIC_SR_register_ON_EXIT ()')的运行没有很好的理解、但在您的解释中、我已经理解了。 现在、您建议的更改可以正常工作。 非常感谢。