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.

[参考译文] CCS/EK-TM4C1294XL:休眠 RTC 中断方式不正确

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/574469/ccs-ek-tm4c1294xl-hibernate-rtc-not-interrupting-in-the-right-way

器件型号: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);
}

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

    您可能需要首先尝试 TivaWare 外设驱动程序库用户指南中显示的示例。 示例如313页所示。 TivaWare/examples/boards/ek_tm4c1294xl/hibernate"下还有一个示例项目。

    中断是否仅来自休眠模块、而不来自计时器等其他模块? 您是否尝试禁用计时器中断并查看它是否会产生影响?

    在针对休眠模块的 TivaWare 用户指南中,它说在使用任何 RTC 功能之前调用 HibernateRTCEnable()。 目前,在 ROM_HibernateRTCEnable()之前调用了 ADC_InitHibernateRTC()。 您能否尝试反转它们并查看它们是否有所不同?

    另外,在 HibernateRTCHandler()中,我想知道如果调用以下命令,它是否会有所不同:

    HibernateRTCMatchSet (0、HibernateRTCGet ()+ 60)代替

    ROM_HibernateRTCSet (0);

    HibernateRTCMatchSet (0、60);

    15.2.2.27休眠 RTCEnable

    描述:
    此函数启用休眠模块中的 RTC。 RTC 可用于唤醒
    或在特定时间产生中断的情况下从休眠状态唤醒。 这种情况
    在使用休眠模块的任何 RTC 功能之前、必须调用该函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    蔡国荣、

    我不确定发生了什么、但经过多次尝试后、我使用相同的代码成功地使其在今天正常工作。 可能编译器在我重新启动之前被调试过?

    [引用用户="Charles Tsaa"]
    描述:
    此函数启用休眠模块中的 RTC。 RTC 可用于唤醒
    或在特定时间产生中断的情况下从休眠状态唤醒。 这种情况
    在使用休眠模块的任何 RTC 功能之前、必须调用该函数。[/QUERP]

    根据我的理解,在使用 HibernateRTCGet ()或 HibernateRTCSSGet ()之前必须调用此函数。 对此我有一定的要求、但配置函数似乎不受影响。 也许这是未来 TivaWare 版本中需要考虑的问题。

    感谢您的帮助!