我目前正在开发 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
都能正确更新?
我已将 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()
的值。这可以帮助您验证是否将预期值传递到函数中。