更改C程序中局部变量的值

问题描述 投票:0回答:1

我目前正在开发 STM32 微控制器的驱动程序,并且 GPIO 初始化代码存在问题。

这是我的代码的相关部分:

#define SPI1_MOSI       7
#define SPI1_SCK        5
void GPIO_Inits()
{
    //SCK
    SPI_Pins.GPIO_PinConfig.GPIO_PinNumber = SPI1_SCK;
    GPIO_Init(&SPI_Pins);

    //MOSI
    SPI_Pins.GPIO_PinConfig.GPIO_PinNumber = SPI1_MOSI;
    GPIO_Init(&SPI_Pins);
}

驱动程序代码

        uint32_t temp1, temp2;
        temp1 = 0;
        temp2 = 0;
        temp1 = GPIOHandle->GPIO_PinConfig.GPIO_PinNumber/8;
        temp2 = GPIOHandle->GPIO_PinConfig.GPIO_PinNumber%8;
        GPIOHandle->pGPIOx->AFR[temp1] &= ~(0xF << 4*temp2);
        GPIOHandle->pGPIOx->AFR[temp1] |= GPIOHandle->GPIO_PinConfig.GPIO_PinAltFuncMode << (4*temp2);

我不明白为什么当我在 MOSI Pin 上调用

temp2
GPIO_Init
没有改变,重新初始化时它仍然 = 5
temp2 = 0

这是我的 makefile 标志

CC=arm-none-eabi-gcc
CFLAGS_COMMON = -g -mthumb -mfloat-abi=soft -c -std=gnu11 -O0
LDFLAGS_COMMON = -mthumb -mfloat-abi=soft --specs=nano.specs -Wl,-Map=final.map

我已将

temp2
声明为 易失性,但多次调用该函数后,其值似乎仍然没有改变。如何确保每次函数调用时
temp2
都能正确更新?

c embedded
1个回答
0
投票

我已将 temp2 声明为易失性,但多次调用该函数后,其值似乎仍然没有改变。

volatile
在这里可能没有必要。 volatile 关键字通常与硬件寄存器、多线程程序中的共享变量以及 ISR 修改的变量一起使用。

如何确保 temp2 在每次函数调用时正确更新?

SPI_Pins
是一个共享的全局结构体,用于配置每个GPIO引脚(SCK和MOSI),因此调用
GPIO_Init()
将使用相同的结构体,并且每次其内容都会被覆盖。

尝试为每次调用 GPIO_Init() 使用独立的数据

void GPIO_Inits()
{
    GPIO_Handle_t SCK_PinConfig, MOSI_PinConfig;

    //SCK
    SCK_PinConfig.GPIO_PinConfig.GPIO_PinNumber = SPI1_SCK;
    GPIO_Init(&SCK_PinConfig);

    //MOSI
    MOSI_PinConfig.GPIO_PinConfig.GPIO_PinNumber = SPI1_MOSI;
    GPIO_Init(&MOSI_PinConfig);
}

如果当前在驱动程序代码中声明的 temp2 仍然遇到,尝试在每次调用

GPIO_PinConfig.GPIO_PinNumber
之前和之后跟踪
GPIO_Init()
的值。这可以帮助您验证是否将预期值传递到函数中。

© www.soinside.com 2019 - 2024. All rights reserved.