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.

[参考译文] TM4C1237E6PM:使用 GPIO_PinRead 读取输入引脚的速度有多快?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/958001/tm4c1237e6pm-how-fast-can-i-read-an-input-pin-with-gpio_pinread

器件型号:TM4C1237E6PM

我正在尝试每100ms 读取一次 Tiva 器件上的输入 PA2、使用一个软件定时器、将1/0值存储在一个16位移位寄存器中。  我正在从频率发生器以5Hz 方波发送。  移位寄存器在0xAAAA 和0x5555之间切换、但通常读取一个0的字符串、移位寄存器更改为0x0000。  我从读取记录了最多22个连续0。  连续的0随机发生、有时相隔仅7秒、有时相隔65秒。

PA2引脚在文件 pin_mux.c 中以这种方式定义

// GPIOInput 的使能引脚 PA2、PA3、PA4、PA5、PA6
MAP_GPIOPinTypeGPIOInput (GPIO_PORta_base、
(GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6);

引脚按这种方式读取

BT_STAT_Val =((GPIOPinRead (GPIO_Porta_base、PA2_Bluetooth_STAT)& PA2_Bluetooth_STAT)>> 2);
如果(BT_STAT_Val = 0)
consecute_0s++;
其他
consecute_0s = 0;

我正在寻找 GPIOPinRead 读取0序列的原因。  我已经验证了示波器上的输入信号、它是连续方波。  我是否可能尝试太快地读取输入?

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

    你好、Chuck、

     首先、所有5Hz 输入意味着一个周期为200ms。 假设高相位和低相位上的输入为50%占空比、则每个相位为100ms。  如果不是50%、则会更糟糕。 例如、高相位为10ms、低相位为190mS。 您尝试以100ms 对输入进行采样、这将是一个问题、因为您违反 了奈奎斯特标准 、在该标准中、只要采样频率大于要采样的最高频率的两倍、就可以正确重建重复波形。 如果您的输入不能减慢、那么我建议您将采样频率从100ms 增加到50ms 或更快、假设输入为50%占空比。 如果高相位大约为10ms、则您的采样频率需要为50ms 或更快。  

     另一个问题是如何使用 SW 计时器创建100mS? 您是否正在使用 SysCtlDelay()? 我强烈建议您为此工作使用硬件计时器。 您创建的 SW 计时器可能会受到中断的影响、这些中断会导致额外延迟、从而导致不准确。