这位于 Tiva C LaunchPad 上。
我尝试使用1个引脚作为过零检测引脚、并触发中断。 我希望中断类型为高级检测类型、以便在过零时立即获得中断。 但是、我尝试使用的引脚仅用作下降沿检测。 以下是引脚和中断的配置代码(完整初始化例程如下所示):
//将端口 E 的引脚1配置为具有高电平检测中断的输入。
//这用于过零检测
GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_1);
IntEnable (INT_GPIOE);
GPIOIntEnable (GPIO_Porte _BASE、GPIO_INT_PIN_1);
GPIOIntRegister (INT_GPIOE、零交叉);
GPIOIntTypeSet (INT_GPIOE、GPIO_INT_PIN_1、GPIO_HIGH_LEVEL);
Dummie=GPIOIntTypeGet (INT_GPIOE、GPIO_INT_PIN_1);
我添加了'dmie' int 以查看中断类型的实际值是多少、无论我在其中放置的类型是什么(_low_level 或_rising_edge 等)、它始终为65、536 (十进制)。 我还将一个万用表连接到该引脚、以确认何时处于0V 以及何时进入3.3V (由 LaunchPad 引脚提供)。 中断部分工作正常、但仅下降沿工作。
有没有关于我在这里可能会做些什么的想法?
Int Initialize (空)
{
//将系统时钟初始化为40MHz
SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
//启用外设
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
//我们必须等待几个时钟周期才能启用外设
//在继续之前,此 while 循环将允许启用外设
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC1))
{
}
//将 Timer0配置为一次性计时器
TimerConfigure (TIMER0_BASE、TIMER_CFG_ONE_SHOT);
//使能并将 Timer0上的中断配置为超时
IntEnable (INT_TIMER0A);
TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
//将 GPIO 端口 E 引脚2、3初始化为模拟引脚
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2|GPIO_PIN_3);
//将端口 F 的引脚1配置为输出。 这是连接红色 LED 的位置
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);
//将端口 E 的引脚1配置为具有高电平检测中断的输入。
//这用于过零检测
GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_1);
IntEnable (INT_GPIOE);
GPIOIntEnable (GPIO_Porte _BASE、GPIO_INT_PIN_1);
GPIOIntRegister (INT_GPIOE、零交叉);
GPIOIntTypeSet (INT_GPIOE、GPIO_INT_PIN_1、GPIO_LOW_LEVEL);
Dummie=GPIOIntTypeGet (INT_GPIOE、GPIO_INT_PIN_1);
//为 ADC 0和1配置序列发生器
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_PROCESSOR、0);
//配置 ADC 步骤
ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH1|ADC_CTL_IE|ADC_CTL_END);
//启用 ADC 序列发生器0和1
ADCSequenceEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC1_BASE、0);
//启用中断
IntMasterEnable();
返回(0);
}