OpenEdv-开源电子网

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

STM32点亮第一个LED :PBout(0)=0;和采用GPIOB->ODR=0<<0有什么不同?

[复制链接]

5

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-1-14
在线时间
0 小时
发表于 2014-1-14 14:42:57 | 显示全部楼层 |阅读模式
 #include <stm32f10x_lib.h>
 #include"led.h"
 int main(void)
 {
  Stm32_Clock_Init(9);
  led_init();
  PBout(0)=0;
  // GPIOB->ODR=0<<0;

while(1);

 }

请问:采用PBout(0)=0;和采用GPIOB->ODR=0<<0;都能点亮LED,请问二者有什么不同啊??
为什么视频教程上采用PBout(0)=0而没有采用GPIOB->ODR=0<<0??
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2014-1-14 15:03:39 | 显示全部楼层
PBout(0)=0只将PB0清零,GPIOB->ODR=0<<0?是将PB0~PB15都清零
清零操作:
将PB0清零可以这样写:GPIOB->ODR&=~(1<<0),
将PB1清零可以这样写:GPIOB->ODR&=~(1<<1),
……
……
将PB15清零可以这样写:GPIOB->ODR&=~(1<<15),
置1操作:
将PB0置1可以这样写:GPIOB->ODR|=(1<<0),
将PB1置1可以这样写:GPIOB->ODR|=(1<<1),
……
……
将PB15置1可以这样写:GPIOB->ODR|=(1<<15),
其它以此类推~
回复 支持 1 反对 0

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1851
金钱
1851
注册时间
2012-9-16
在线时间
287 小时
发表于 2014-1-14 14:52:47 | 显示全部楼层
分析一下PBout(0)的代码,就明白了!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 0 反对 1

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
发表于 2014-1-14 15:00:44 | 显示全部楼层
其实,本质上都是一样的,都是往寄存器里写值而已。首先你要理解STM32的地址映射和位带区的概念,等你看懂了,你再去看PXout(n)和PXin(n)的代码你会发现其实就是一层层的地址偏移,而STM32的库里面,也是把GPIOB->ODR最终定义成地址的。这些道理和51单片机很类似,只不过STM32把内部的位带区“膨胀”了而已。更详细的内容你可以看看《ARM Cortex-M3 权威指南》的第五章,那里讲的很详细。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-6 16:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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