请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 值[]);