无法在stm32f030rc上使用PC15作为GPIO输入

Unable to use PC15 as GPIO input on stm32f030rc

我正在使用 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;
}

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 以进行比较。在我能想到的这3种可能的原因中,这是最有可能的一种。