意法半导体在出这个款板的时候也同步推出了stdperiph_driver这个库文件。
然后根据库以及demonstration 大概可以看见如下的内容。
在main.c中有个这样的调用
STM_EVAL_LEDToggle(LED4);
这个函数的原型来自于 stm32f4_discovery.c 类似如下
void STM_EVAL_LEDOn(Led_TypeDef Led)
{
GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led];
}
在stdperiph_driver中可以看见关于 led_typedef 处的定义 ,定义为 enum类型。
GPIO_PORT在定义处为 GPIO_typedef struct 的指针。
GPIO_TypeDef* GPIO_PORT[LEDn] = {LED4_GPIO_PORT, LED3_GPIO_PORT, LED5_GPIO_PORT, LED6_GPIO_PORT};
Ledx_gpio_port 用宏定义为 gpiod
Gpiod用宏定义为 gpiod_base
Gpiod_base 同样的用宏定义为 ahb1periph_base 加一段offset 0x0c00
熟悉arm的不难知道 ahb1periph_base 的地址为0x40020000
所以 gpio_typedef* gpio_port[] 定义一个数组指针分别指向同一个地址,也就是gpio register 的地址
然后根据下面的struct 用作bitband 操作,可仔细观察address offset 和 stm32_manual 的关系。
typedef struct
{
__IO uint32_t