0

我正在使用 stm32f030rc 进行项目。我需要将 PC15 用作 GPIO 输入,但似乎我做不到。

我知道这对 PC14/PC15 与 LFE 振荡器共享,但我当然没有使用该功能。此外,我能够读取 PC14 GPIO 上的正确引脚电平。在关于我的模型的数据表中,PC15 引脚被标记为 I/O,OSC32_OUT 作为附加功能:它可以用作输入吗?

作为参考,这是我用来测试功能的 C 代码;我正在使用 libopencm3 进行初始化。

#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>

static void clock_setup(void)
{
    rcc_clock_setup_in_hsi_out_48mhz();

    /* Enable GPIOA, GPIOB, GPIOC clock. */
    rcc_periph_clock_enable(RCC_GPIOA);
    rcc_periph_clock_enable(RCC_GPIOB);
    rcc_periph_clock_enable(RCC_GPIOC);
    rcc_periph_clock_enable(RCC_DBGMCU);

    /* Enable clocks for GPIO port B and C*/
    gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO5);
    gpio_mode_setup(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO15);
    gpio_mode_setup(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO14);
}

int main(void)
{
    unsigned long long i = 0;

    clock_setup();

    /* Blink the LED (PA8) on the board with every transmitted byte. */
    while (1)
    {
        gpio_toggle(GPIOA, GPIO5); /* LED on/off */
        for (i = 0; i < 400000; i++) /* Wait a bit. */
            __asm__("nop");

        // This conditional is never entered
        if (gpio_get(GPIOC, GPIO15) == 0) {
            __asm__("nop");
            __asm__("nop");
            __asm__("nop");
        }

       // This one works
        if (gpio_get(GPIOC, GPIO14) == 0) {
            __asm__("nop");
            __asm__("nop");
            __asm__("nop");
        }

    }

    return 0;
}
4

1 回答 1

1

PC14 和 PC15 具有相同的配置属性。当然,将这些引脚用作输出(包括 PC13)有一些限制,但只要不激活 LSE 功能,就可以将它们用作输入。

PC14 & PC15 是上电后的 GPIO 输入,考虑到 LSE 默认是关闭的,即使没有任何配置,你应该可以直接使用它们。

由于您对 PC14 没有任何问题,我怀疑 3 个可能的原因:

1) 库提供的 GPIO 代码中的错误。虽然不太可能,但很容易测试。您可以删除 PC14 和 PC15 的配置代码,因为它们默认为上电后的 GPIO 输入。这消除了 gpio_mode_setup() 函数中存在错误的可能性。为避免使用 gpio_get() 函数,可以使用以下代码:

if (GPIOC->IDR & (1 << 15) == 0)

2) 库提供的时钟配置代码中的一个错误。同样,这不太可能,但您可以通过删除 rcc_clock_setup_in_hsi_out_48mhz() 函数来测试它。MCU 使用上电后以 8 MHz 运行的 HSI。

3) 这可能是硬件问题。我建议检查 PC15 上的电压。通过将其物理连接到 GND 来测试它。还要测量 PC14 进行比较。在我能想到的这三个可能的原因中,这是最可能的一个。

于 2019-08-06T19:00:31.563 回答