硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6167|回复: 6
收起左侧

[客户分享] F4系列HAL库GPIO的BSRR寄存器怎么不按照BSRRH和BSRRL定义了,使用很不方便

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
发表于 2019-4-24 00:42:50 | 显示全部楼层 |阅读模式
早前的时候可以如下方式,方便的设置引脚高低电平:
GPIOA->BSRRL = GPIO_PIN_PIN1;
GPIOA->BSRRH = GPIO_PIN_PIN1;


现在的新版的HAL库,取消这种定义方式,不知道怎么搞的,这波操作有点失误。
  1. typedef struct
  2. {
  3.   __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  4.   __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  5.   __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  6.   __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  7.   __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  8.   __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  9.   __IO uint32_t BSRR;     /*!< GPIO port bit set/reset register,      Address offset: 0x18      */
  10.   __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  11.   __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
  12. } GPIO_TypeDef;
复制代码


之前的标准库定义BSRRL和BSRRH
  1. typedef struct
  2. {
  3.   __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  4.   __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  5.   __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  6.   __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  7.   __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  8.   __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  9.   __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  10.   __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  11.   __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  12.   __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
  13. } GPIO_TypeDef;
复制代码


BSRR寄存器定义:
QQ截图20190424003511.jpg



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
 楼主| 发表于 2019-4-24 00:47:35 | 显示全部楼层
QQ截图20190424004644.jpg
回复

使用道具 举报

56

主题

905

回帖

1073

积分

至尊会员

积分
1073
发表于 2019-5-1 22:34:29 | 显示全部楼层
这个看来得单独开一个函数自己封装了。。。。
回复

使用道具 举报

4

主题

52

回帖

64

积分

初级会员

积分
64
发表于 2019-5-7 08:29:31 | 显示全部楼层
不知道理解的对不对,uint16_t没有uint32_t执行的效率高。但(uint32_t)GPIO_Pin<<16也是需要移位操作,搞不懂为啥。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
 楼主| 发表于 2019-5-7 13:15:13 | 显示全部楼层
cortex 发表于 2019-5-7 08:29
不知道理解的对不对,uint16_t没有uint32_t执行的效率高。但(uint32_t)GPIO_Pin

速度应该是一样的,字节,半字也有专门的汇编指令的,

回复

使用道具 举报

0

主题

125

回帖

125

积分

初级会员

积分
125
发表于 2019-6-8 16:17:21 | 显示全部楼层
32bit用起来更方便此,可以同一时间设0设1
其实习惯了用16bit 可以加个宏来用16bit的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
 楼主| 发表于 2019-6-9 08:32:48 | 显示全部楼层
Edmund1964 发表于 2019-6-8 16:17
32bit用起来更方便此,可以同一时间设0设1
其实习惯了用16bit 可以加个宏来用16bit的

是的,现在就是修改了下宏,没有以前看着舒服了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 03:52 , Processed in 0.186348 second(s), 36 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表