stm32f4discovery led toggle (二)

意法半导体在出这个款板的时候也同步推出了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 MODER; /*!< GPIO port mode register, Address offset: 0x00 */

__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */

__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */

__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */

__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */

__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */

__IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */

__IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */

__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */

__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */

} GPIO_TypeDef;

 

 

然后还原这句话 GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led];

也就是 把0x1000这个数据送到 0x40020c18这个地址。

 

然后我们对照着 gpio_typedef 进行查看也就把GPIO port bit set/reset low register 送入 0x1000这个数据

Gpio有16个io那么我们对照着 pin12进行换算也就是0001 0000 0000 0000B

也就是 0x1000

具体的可以参照我的上一篇文章。

转载于:https://www.cnblogs.com/makc/p/4020747.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值