# STM32 中无法直接使用指针的解决方案

当我在使用位带操作 led 灯时 首先需要对 GPIO 口进行初始化 所以就需要用到结构体来储存不同寄存器的值

教程中给的是直接使用结构体

1
2
3
4
5
6
7
8
9
10
11
12
 /*例程做法*/
GPIO_InitTypeDef GPIOF_Light;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

GPIOF_Light.GPIO_Mode = GPIO_Mode_OUT;
GPIOF_Light.GPIO_OType = GPIO_OType_PP;
GPIOF_Light.GPIO_Pin = GPIO_Pin_9;
GPIOF_Light.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIOF_Light.GPIO_Speed = GPIO_Fast_Speed;

GPIO_Init(GPIOF,GPIOF_Light);

但是在撸代码的过程中 打 "." 十分不方便 而且有些时候感觉没有使用结构体指针来的灵活 所以我就在想使用结构体指针来完成 但是遇到了问题

1
2
3
4
5
6
7
8
9
10
11
12
/*我的写法*/
GPIO_InitTypeDef* GPIOF_Light = (GPIO_InitTypeDef*)malloc(sizeof(GPIO_InitTypeDef));

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

GPIOF_Light->GPIO_Mode = GPIO_Mode_OUT;
GPIOF_Light->GPIO_OType = GPIO_OType_PP;
GPIOF_Light->GPIO_Pin = GPIO_Pin_9;
GPIOF_Light->GPIO_PuPd = GPIO_PuPd_DOWN;
GPIOF_Light->GPIO_Speed = GPIO_Fast_Speed;

GPIO_Init(GPIOF,GPIOF_Light);

但是报错了

image-20210426171718009

warning不用管 没问题 是keil乱报

网上查了一下发现 在 keil 里面默认情况下都是很精简的 如果要是用 C 语言的高级操作 必须在设置中勾选使用 microLiB 才行

所以勾选了之后就没问题了

image-20210426171903252 image-20210426172028281