请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:EK-TM4C1294XL 工具/软件:Code Composer Studio
您好!
我尝试使用休眠 RTC 模块来跟踪时间、但当我设置中断时间时、中断时间不是每60秒中断一次、而是看起来中断速度快了很多倍(实际上、中断速度快了很多倍)。 另外、在设置 RTC 后、我无法通过按 ENTER 退出程序、每次执行该操作时、它都会"重置"程序。 我尝试从互联网复制类似的示例、但它始终为我提供相同的行为。
这可能是什么原因? 我将以错误的方式配置中断?
/* * adc.c * *创建日期:2017年1月24日 * 作者:Helder Sales */ #include "adc.h" #include "../wdog/wdog.h "#include "../../includes.h #include "../../../command/read/read.h " //验证 char unsigned char ch; //输入引脚数和类型 uint8_t numarg、输入、pinPE、pinPK; // time uint8_t minute、 小时; 内联无符号 char adc_InitADCPins (char * g_cInput) { //argv 静态 char * argv[8 + 1]; char *pcChar; uint_fast8_t argc = 0; bool bFindArg= true; pcChar = g_cInput; while (* pcChar) { if (*pcChar =') { *pcChar = 0; bFindArg= true; } 否则 if (bFindArg) { argv[argc]= pcChar; argc++; bFindArg= false; } pcChar++; } char *num = argv[1]; unsigned int aux; uint8_t condition = sscanf (num、"%u%c"、&aux、&ch); pinPE = strcmp (argv[0]、"PE"); pinPK = strcmp (argv[0]、"PK"); numarg = argc; 输入= aux; if ((pinPE!= 0 & pinPK!= 0)||条件!= 1) { 输入= 0; return (输入); } //使能引脚 J ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOJ); ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOJ); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ); while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_GPIOJ)); //将引脚 PJ0配置为输入 ROM_GPIOPinTypeGPIOInput (GPIO_PORTJ_BASE、GPIO_PIN_0); //常规配置(上拉) GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU); if (pinPE = 0) { //使能引脚 E ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOE); ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOE); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_GPIOE)); if (输入==1) //使能引脚 PE0作为 ADC ROM_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0); if (输入== 2) //使能引脚 PE0/PE1作为 ADC ROM_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1); if (输入== 3) //使能引脚 PE0/PE1/PE2作为 ADC ROM_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); if (输入== 4) //使能引脚 PE0/PE1/PE2/PE3作为 ADC ROM_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3); } 否则、如果(pinPK ==0) { //使能引脚 K ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOK); ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOK); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK); while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_GPIOK)); if (输入==1) //使能引脚 PK0作为 ADC ROM_GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0); if (输入== 2) //使能引脚 PK0/PK1作为 ADC ROM_GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0 | GPIO_PIN_1); if (输入== 3) //使能引脚 PK0/PK1/PK2作为 ADC ROM_GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); if (输入== 4) //使能引脚 PK0/PK1/PK2/PK3作为 ADC ROM_GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3); } return (inputs); } inline void ADC_InitADC (unsigned char inputs、unsigned char oversamplevalue) { //启用 ADC0 ROM_SysCtlPeripheralDisable (SYSCTL_Periph_ADC0); ROM_SysCtlPeripheralReset (SYSCTL_Periph_ADC0); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_ADC0)); //启用 ADC1 ROM_SysCtlPeripheralDisable (SYSCTL_Periph_ADC1); ROM_SysCtlPeripheralReset (SYSCTL_Periph_ADC1); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC1); while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_ADC1)); //配置 ADC0序列2、由处理器触发、优先级0 (最高) ROM_ADCSequenceConfigure (ADC0_BASE、2、ADC_TRIGGER_PROCESSOR、0); //配置 ADC1序列3、由处理器触发、优先级1 ROM_ADCSequenceConfigure (ADC1_base、3、ADC_TRIGGER_PROCESSOR, 1); //步骤0序列2、MCU 的温度采样序列(0到最高)、配置采样后的中断、告诉 ADC1这是最后一次转换 ROM_ADCSequenceStepConfigure (ADC1_base、3、0、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); if (pinPE = 0) { if (输入==1) { //步骤0序列2、通道0的采样、序列(0到最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 //(要了解有关通道的更多信息、请参阅数据表第1056页) ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH3 | ADC_CTL_IE | ADC_CTL_END); } 否则、如果(输入== 2) { //步骤0序列2、通道0/1的采样、序列(0到最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH3); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、1、ADC_CTL_CH2 | ADC_CTL_IE | ADC_CTL_END); } 否则、如果(输入== 3) { //步骤0序列2、通道0/1/2的采样、序列(0到最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH3); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、1、ADC_CTL_CH2); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、2、ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END); } 否则、如果(输入== 4) { //步骤0序列2、通道0/1/2/3的采样、序列(0到最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH3); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、1、ADC_CTL_CH2); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、2、ADC_CTL_CH1); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、3、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END); } } 否则、如果(pinPK ==0) { if (输入==1) { //步骤0序列2、通道16的采样、序列(0到最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH16 | ADC_CTL_IE | ADC_CTL_END); } 否则、如果(输入== 2) { //Step 0序列2、通道16/17的采样、序列(0至最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH16); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、1、ADC_CTL_CH17 | ADC_CTL_IE | ADC_CTL_END); } 否则、如果(输入== 3) { //步骤0序列2、通道16/17/18的采样、序列(0至最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH16); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、1、ADC_CTL_CH17); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、2、ADC_CTL_CH18 | ADC_CTL_IE | ADC_CTL_END); } 否则、如果(输入== 4) { //步骤0序列2、通道16/17/18/19的采样、序列(0至最高)、配置采样后的中断、告诉 ADC CH19是最后一次转换 ROM_ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH16); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、1、ADC_CTL_CH17); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、2、ADC_CTL_CH18); ROM_ADCSequenceStepConfigure (ADC0_BASE、2、3、ADC_CTL_CH19 | ADC_CTL_IE | ADC_CTL_END); } } //将 ADC 配置为2MSPS (PLL/15 = 32MHz、采样率为满) ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、15); //将 ADC 配置为125KSPS (PLL/30 = 16MHz、采样率1/8) ADCClockConfigSet (ADC1_base、ADC_CLOCK、SRC_PLL | ADC_CLOCK RATE_RATE、8、30); //过采样(样本平均值、有效速度=(MSPS)*(过采样值)) ROM_ADCHardwareOversampleConfigure (ADC0_BASE、过采样值); ROM_ADCHardwareOversampleConfigure (ADC1_base、64); //habilita ADC0序列2. ROM_ADCSequenceEnable (ADC0_BASE、2); //habilita ADC1序列3. ROM_ADCSequenceEnable (ADC1_base、3); } 内联 void ADC_InitHibernateRTC (void) { //启用休眠模块 ROM_SysCtlPeripheralDisable (SYSCTL_Periph_HIBERNATE); ROM_SysCtlPeripheralReset (SYSCTL_Periph_HIBERNATE); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE); while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE)); ROM_HibernateEnableExpClk (120000000); ROM_HibernateClockConfig (HIBERNATE_OSC_HIGRIVE); ROM_HibernateRTCSet (0); ROM_HibernateRTCMatchSet (0、60); ROM_HibernateIntEnable (HIBERNATE_INT_RTC_MATH_0); HibernateIntRegister (HibernateRTCIntHandler); } inline void Init_Timer1 (unsigned int freq) { //启用计时器1 ROM_SysCtlPeripheralDisable (SYSCTL_Periph_Timer1); ROM_SysCtlPeripheralReset (SYSCTL_Periph_Timer1); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_Timer1)); //定时器1时钟= PIOSC ROM_TimerClockSourceSet (Timer1_base、timer_clock_PIOSC); ROM_TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE); uint32_t uiPeriod = 16000000 / freq; ROM_TimerLoadSet (Timer1_base、timer_A、uiPeriod -1); ROM_IntPrioritySet (INT_TIMER1A、1); ROM_IntEnable (INT_TIMER1A); ROM_TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT); ROM_TimerEnable (Timer1_base、timer_A); } void Timer1IntHandler (void) { ROM_TimerIntClear (Timer1_base、timer_TINA_TIMEOUT); //使用长度为 FIFO 的阵列(数据表页) 1056) uint32_t ADC0Values[4]; uint32_t ADC1Values[1]; //将 ADC 值转换为温度 uint8_t TempValueC; //将 ADC0Values 转换为电压 uint16_t Value1、Value2、Value3、Value4; 静态 uint16_t Value1max = 0; 静态 uint16_t Value2max = 0; 静态 uint16_t Value3max = 0; 静态 uint16_t Value4max = 0; 静态 uint16_t Value1min = 4095*0.8058608059; 静态 uint16_t Value2min = 4095*0.8058608059; 静态 uint16_t Value3min = 4095*0.8058608059; 静态 uint16_t Value4min = 4095*0.8058608059; //清除 ADC 中断状态 ROM_ADCIntClear (ADC0_BASE、2); ROM_ADCIntClear (ADC1_BASE、3); //启用转换的触发器 ROM_ADCProcessorTrigger (ADC0_BASE、2); ROM_ADCProcessorTrigger (ADC1_base、3); //等待转换完成 while (!ROM_ADCIntStatus (ADC0_BASE、2、false)||!ROM_ADCIntStatus (ADC1_base、3、false)); //读取 ADC 获得的值 ROM_ADCSequenceDataGet (ADC0_BASE、2、ADC0Values); ROM_ADCSequenceDataGet (ADC1_base、3、ADC1Values); //将 ADC 值转换为温度 TempValueC =(uint8_t)(147.5 -(((75.0 * 3.3 *(float) ADC1Values[0]))/ 4096.0); if (输入== 4) { //将 ADC 值转换为电压 Value1 = ADC0Values[0]*0.8058608059; Value2 = ADC0Values[1]*0.8058608059; Value3 = ADC0Values[2]*0.8058608059; Value4 = ADC0Values[3]*0.8058608059; if (Value1max < Value1) Value1max = Value1; if (Value2max < Value2) Value2max = Value2; if (Value3max < Value3) Value3max = Value3; if (Value4max < Value4) Value4max = Value4; if (Value1min > Value1) Value1min = Value1; if (Value2min > Value2) Value2min = Value2; if (Value3min > Value3) Value3min = Value3; if (Value4min > Value4) Value4min = Value4; if (pinPE = 0) //打印 ADC 结果 UARTprintf ("PE0读数=%04u mV ||最大值 PE0 =%04u mV ||最小值 PE0 =%04u mV\n" "PE1读数=%04u mV ||最大值 PE1 =%04u mV ||最小值 PE1 =%04u mV\n" "PE2读数=%04u mV ||最大值 PE2 =%04u mV ||最小值 PE2 =%04u mV\n" "PE3读数=%04u mV ||最大值 PE3 =%04u mV ||最小值 PE3 =%04u mV\n"\} "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[5a\r"、Value1、Value1最大值、Value1最小值、Value2、 Value2max、Value2min、 Value3、Value3max、Value3min、Value4、Value4max、 Value4min、小时、分钟、ROM_HibernateRTCGet ()、TempValueC); 其他 UARTprintf ("PK0读数=%04u mV ||最大值 PK0 =%04u mV ||最小值。 PK0 =%04u mV\n" "pK1读数=%04u mV ||最大值。 pK1 =%04u mV ||最小值。 pK1 =%04u mV\n" "PK2读数=%04u mV ||最大值 PK2 =%04u mV ||最小值 PK2 =%04u mV\n" "PK3读数=%04u mV ||最大值 PK3 =%04u mV ||最小值 PK3 =%04u mV\n"\} "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[5a\r"、Value1、Value1最大值、Value1最小值、Value2、 Value2max、Value2min、 Value3、Value3max、Value3min、Value4、Value4max、 Value4min、小时、分钟、ROM_HibernateRTCGet ()、TempValueC); } 否则、如果(输入== 3) { //将 ADC 值转换为电压 Value1 = ADC0Values[0]*0.8058608059; Value2 = ADC0Values[1]*0.8058608059; Value3 = ADC0Values[2]*0.8058608059; if (Value1max < Value1) Value1max = Value1; if (Value2max < Value2) Value2max = Value2; if (Value3max < Value3) Value3max = Value3; if (Value1min > Value1) Value1min = Value1; if (Value2min > Value2) Value2min = Value2; if (Value3min > Value3) Value3min = Value3; if (pinPE = 0) //打印 ADC 结果 UARTprintf ("PE0读数=%04u mV ||最大值 PE0 =%04u mV ||最小值 PE0 =%04u mV\n" "PE1读数=%04u mV ||最大值 PE1 =%04u mV ||最小值 PE1 =%04u mV\n" "PE2读数=%04u mV ||最大值 PE2 =%04u mV ||最小值 PE2 =%04u mV\n"\} "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[4a\r"、Value1、Value1最大值、Value1最小值、Value2、 Value2max、Value2min、 Value3、Value3最大值、Value3最小值、小时、分钟、 ROM_HibernateRTCGet ()、TempValueC); 其他 //打印 ADC 结果 UARTprintf ("PK0读数=%04u mV ||最大值 PK0 =%04u mV ||最小值。 PK0 =%04u mV\n" "pK1读数=%04u mV ||最大值。 pK1 =%04u mV ||最小值。 pK1 =%04u mV\n" "PK2读数=%04u mV ||最大值 PK2 =%04u mV ||最小值 PK2 =%04u mV\n"\} "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[4a\r"、Value1、Value1最大值、Value1最小值、Value2、 Value2max、Value2min、 Value3、Value3最大值、Value3最小值、小时、分钟、 ROM_HibernateRTCGet ()、TempValueC); } 否则、如果(输入== 2) { //将 ADC 值转换为电压 Value1 = ADC0Values[0]*0.8058608059; Value2 = ADC0Values[1]*0.8058608059; if (Value1max < Value1) Value1max = Value1; if (Value2max < Value2) Value2max = Value2; if (Value1min > Value1) Value1min = Value1; if (Value2min > Value2) Value2min = Value2; if (pinPE = 0) //打印 ADC 结果 UARTprintf ("PE0读数=%04u mV ||最大值 PE0 =%04u mV ||最小值 PE0 =%04u mV\n" "PE1读数=%04u mV ||最大值 PE1 =%04u mV ||最小值 PE1 =%04u mV\n"\} "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[3a\r"、Value1、Value1最大值、Value1最小值、Value2、 Value2max、Value2min、 小时、分钟、ROM_HibernateRTCGet ()、TempValueC); 其他 //打印 ADC 结果 UARTprintf ("PK0读数=%04u mV ||最大值 PK0 =%04u mV ||最小值。 PK0 =%04u mV\n" "pK1读数=%04u mV ||最大值。 pK1 =%04u mV ||最小值。 pK1 =%04u mV\n\n" "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[3a\r"、Value1、Value1最大值、Value1最小值、Value2、 Value2max、Value2min、 小时、分钟、ROM_HibernateRTCGet ()、TempValueC); } 否则、如果(输入= 1) { //将 ADC 值转换为电压 Value1 = ADC0Values[0]*0.8058608059; if (Value1max < Value1) Value1max = Value1; if (Value1min > Value1) Value1min = Value1; if (pinPE = 0) //打印 ADC 结果 UARTprintf ("PE0读数=%04u mV ||最大值 PE0 =%04u mV ||最小值 PE0 =%04u mV\n"\} "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[2A\r"、Value1、Value1最大值、Value1最小值、小时 Minute、ROM_HibernateRTCGet ()、TempValueC); 其他 //打印 ADC 结果 UARTprintf ("PK0读数=%04u mV ||最大值 PK0 =%04u mV ||最小值。 PK0 =%04u mV\n"\} "已用时间:%02uhrs %02umin %02usec MCU 温度:%u*C\x1b[2A\r"、Value1、Value1最大值、Value1最小值、小时 Minute、ROM_HibernateRTCGet ()、TempValueC); } if (Value1min = 0 && ROM_SysCtlPeripheralReady (SYSCTL_Periph_WDOG0)) { FEedWatchdog = false; while (1); } } 无效休眠 RTCIntHandler (void) { ROM_HibernateIntClear (HIBERNATE_INT_RTC_MATH_0); 分钟++; if (分钟==60) { 小时++; 分钟= 0; } ROM_HibernateRTCSet (0); HibernateRTCMatchSet (0、60); } 内联 void ADC_Loop (unsigned int freq) { 小时= 0; 分钟= 0; UARTFlushRx(); init_Timer1 (freq); ADC_InitHibernateRTC(); ROM_HibernateRTCEnable(); while (UARTPeek ('\r')=-1); UARTFlushRx(); ROM_IntDisable (INT_TIMER1A); ROM_HibernateIntDisable (HIBERNATE_INT_RTC_MATH_0); ROM_TimerIntClear (Timer1_base、timer_TINA_TIMEOUT); ROM_HibernateIntClear (HIBERNATE_INT_RTC_MATH_0); ROM_TimerDisable (Timer1_base、timer_A); HibernateIntUnregister(); ROM_SysCtlPeripheralDisable (SYSCTL_Periph_HIBERNATE); ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOE); ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOJ); ROM_SysCtlPeripheralDisable (SYSCTL_Periph_ADC0); ROM_SysCtlPeripheralDisable (SYSCTL_Periph_Timer1); ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOE); ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOJ); ROM_SysCtlPeripheralReset (SYSCTL_Periph_ADC0); ROM_SysCtlPeripheralReset (SYSCTL_Periph_Timer1); ROM_SysCtlPeripheralReset (SYSCTL_Periph_HIBERNATE); if (输入== 4) UARTprintf ("\n\n\n\n\n\n\n\n\n\n 程序已终止。\n"); if (输入== 3) UARTprintf ("\n\n\n\n\n\n\n\n 程序已终止。\n"); if (输入== 2) UARTprintf ("\n\n\n\n\n\n 程序已终止。\n"); if (输入==1) UARTprintf ("\n\n\n 程序已终止。\n"); } 内联 int adc_main (int argc、char * argv[]) { //文本以指示哪些引脚处于活动状态 字符 text[8][32]={"PE0"、"PE0/PE1"、"PE0/PE1/PE2"、"PE0/PE1/PE3"、"PE0/PE1/PE2/PE3"、"PK0"、 "PK0/PK1"、"PK0/PK1/PK2"、"PK0/PK1/PK2/PK3"}; unsigned int freq、oversamplevalue; char * num1 = argv[1]; char * num2 = argv[3]; uint8_t condition = sscanf (num1、"%u%c"、&freq、&ch); if (freq <= 0 || argc == 1 || argc == 3 || argc > 4 || condition!= 1) 返回(CMD_ERROR); 否则、if (strcmp (argv[2]、"过采样")=0) { uint8_t condition2 = sscanf (num2、"%u%c"、&oversamplevalue、&ch); if ((oversamplevalue ==2 || oversamplevalue ==4 || oversamplevalue ==8 || oversamplevalue ==16 || oversamplevalue ==32 || oversamplevalue ==64)&& condition2==1) { UARTprintf ("\n 模拟数字转换器\n" "类型:单端。\n" "过采样:%u\n" "更新速率:%u Hz\n\n" "选择端口和输入数量(PE/PK、1-4)\n\n" ">>"、泛号、freq); Read_Command(); 输入= ADC_InitADCPins (g_cInput_Read ()); ADC_InitADC (输入、过采样值); if (输入< 1 ||输入> 4 ||数字> 2) return (CMD_ERROR); } 否则 if (condition2!= 1) 返回(CMD_ERROR); 其他 { UARTprintf ("\n 硬件过采样仅接受2、4、8、16、32和64个)\n"\}; return (CMD_ERROR); } } 否则、如果(argc == 2) { UARTprintf ("\n 模拟数字转换器\n" "类型:单端。\n" "过采样:停用\n" "更新速率:%u Hz\n\n" "选择端口和输入数量(PE/PK、1-4)\n\n" ">>"、freq); Read_Command(); 输入= ADC_InitADCPins (g_cInput_Read ()); ADC_InitADC (输入、0); if (输入< 1 ||输入> 4 ||数字> 2) return (CMD_ERROR); } if (pinPE = 0) UARTprintf ("\n 输入数:%u\n" "输入:%s\n"\} "按\"输入\"或用户开关1以启动。\n" "程序运行后、再次按\" Enter \"退出。\n"、输入、&text[inputs-1]); 其他 UARTprintf ("\n 输入数:%u\n" "输入:%s\n"\} "按\"输入\"或用户开关1以启动。\n" "程序运行后、再次按\" Enter \"退出。\n"、输入、&text[Inputs+3]); while (1) { //GPIOPinRead = 0或 GPIO_PIN_0 if (!ROM_GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0)) { UARTprintf ("\n"); 中断; } if (UARTPeek ('\r')!=-1) 中断; } ADC_Loop (freq); return (CMD_sucess); }