OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5015|回复: 13

STM32如何用标准库函数给多个IO口同时设置高低电平?

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-12-10 11:59:47 | 显示全部楼层 |阅读模式
1金钱
如题,我想要将STM32的一组IO口同时设置为高电平,譬如我想要将PA1   PA3   PA5    PA7设置为高电平,PA2    PA4设置为低电平用库函数应该如何操作。
PS:下面是我查到的资料,但是用的寄存器修改的,如果是库函数应该如何设置?
规则:  
一、置GPIOD->BSRR低16位的某位为'1',则对应的I/O端口置'1';而置GPIOD->BSRR低16位的某位为'0',则对应的I/O端口不变。  
二、置GPIOD->BSRR高16位的某位为'1',则对应的I/O端口置'0';而置GPIOD->BSRR高16位的某位为'0',则对应的I/O端口不变。  
三、置GPIOD->BRR低16位的某位为'1',则对应的I/O端口置'0';而置GPIOD->BRR低16位的某位为'0',则对应的I/O端口不变。

例如:  
1)要设置D0、D5、D10、D11为高,而保持其它I/O口不变,只需一行语句:  
  GPIOD->BSRR = 0x0C21;// 使用规则一

2)要设置D1、D3、D14、D15为低,而保持其它I/O口不变,只需一行语句:  
  GPIOD->BRR = 0xC00A;// 使用规则三

3)要同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变,也只需一行语句:  
  GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二  


最佳答案

查看完整内容[请看2#楼]

我找到了,可以用这个函数 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) { /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); GPIOx->ODR = PortVal; } 可以一次性给多个IO口赋值(注意:是16位的!) 举例:GPIO_Write(GPIOD,0x0100) //使PD8置高
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-12-10 11:59:48 | 显示全部楼层
我找到了,可以用这个函数
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));  
  GPIOx->ODR = PortVal;
}
可以一次性给多个IO口赋值(注意:是16位的!)
举例:GPIO_Write(GPIOD,0x0100)   //使PD8置高
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-12-10 12:14:33 | 显示全部楼层
操作对应的寄存器
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8687
金钱
8687
注册时间
2020-5-11
在线时间
4170 小时
发表于 2020-12-10 13:13:14 | 显示全部楼层
本帖最后由 LcwSwust 于 2020-12-10 13:20 编辑

若只需赋值则写ODR即可,我习惯操作ODR,  若是只需置位或清零某些位,可以用C语言的位运算。

GBIOD->ODR=GBIOD->ODR & 0xFFFD | 0x01 ;
专治疑难杂症
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-12-10 13:46:47 | 显示全部楼层
库函数没这玩意, 学寄存器吧
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-12-10 14:37:57 | 显示全部楼层

希望可以用库函数来操作
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-12-10 14:39:13 | 显示全部楼层
本帖最后由 ufbycd 于 2020-12-10 14:40 编辑

LL库:
  1. LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_0 | LL_GPIO_PIN_5 | LL_GPIO_PIN_10 | LL_GPIO_PIN_11)
复制代码

其实就是对寄存器操作的宏封装
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-12-10 14:46:58 | 显示全部楼层
ufbycd 发表于 2020-12-10 14:39
LL库:
其实就是对寄存器操作的宏封装

这样或许也可以,但我没用过LL库,所以希望可以用标准库的方式。这个问题我已经找到答案了,还是谢谢你,我刚发了一个驱动步进电机的问题,如果您有时间,方便帮我看看嘛,谢谢你~
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-12-10 14:47:40 | 显示全部楼层
edmund1234 发表于 2020-12-10 13:46
库函数没这玩意, 学寄存器吧

我在网上找到了,可以用GPIO_Write()来实现
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-12-10 14:48:36 | 显示全部楼层
LcwSwust 发表于 2020-12-10 13:13
若只需赋值则写ODR即可,我习惯操作ODR,  若是只需置位或清零某些位,可以用C语言的位运算。

GBIOD->O ...

哈哈哈,我对寄存器操作不是太熟,谢谢你的答案,看来有时间的话还是要深刻的学习下寄存器比较好。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-12-10 15:02:14 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-12-10 14:46
这样或许也可以,但我没用过LL库,所以希望可以用标准库的方式。这个问题我已经找到答案了,还是谢谢你, ...

标准库已经很久没更新了,其替代就是LL库,API风格跟标准库差不多,效率更高,而且可以HAL库共存。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-12-10 15:11:55 | 显示全部楼层
ufbycd 发表于 2020-12-10 15:02
标准库已经很久没更新了,其替代就是LL库,API风格跟标准库差不多,效率更高,而且可以HAL库共存。

CUBEMX用的好像是HAL库吧,现在由于ST不更新标准库了,所以打算慢慢转HAL库
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-12-10 15:33:24 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-12-10 15:11
CUBEMX用的好像是HAL库吧,现在由于ST不更新标准库了,所以打算慢慢转HAL库

HAL跟LL都是在CubeMX里推出的,一般的外设都支持选择生成HAL还是LL源码,个别复杂的外设(如:摄像头)只支持HAL。

所以同一个项目常常HAL、LL混合使用,追求效率的简单外设用LL,复杂或不关心效率的外设就用HAL。也可以在CubeMX内选择内用HAL生成初始化代码,自己再用LL进行功能实现。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-12-10 15:50:22 | 显示全部楼层
ufbycd 发表于 2020-12-10 15:33
HAL跟LL都是在CubeMX里推出的,一般的外设都支持选择生成HAL还是LL源码,个别复杂的外设(如:摄像头)只 ...

好的,学习了,多谢科普~~
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 20:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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