野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16656|回复: 7

LED点亮实验,程序理解不清晰(如图)

[复制链接]
发表于 2018-4-8 18:24:57 | 显示全部楼层 |阅读模式
打开GPIOB端口的时钟这一行程序能理解,第二行配置IO口程序无法理解:
( (1) << (4*0) );“4*0”是什么意思,是4*0=0的意思吗,如果是这个意思的话,直接将“( (1) << (4*0) )”改成“( (1) << 4 )”不就好了,还是说是因为4个位控制一个IO,
但是书上有个清空控制PB0的端口位代码:GPIOB_CRL &=~( 0x0F<< (4*0));这个代码的执行步骤是怎样的?而且图中好像没有清空控制PB0的端口位的代码,这样不影响吗

教学视频程序

教学视频程序
回复

使用道具 举报

发表于 2018-4-8 21:20:56 | 显示全部楼层
GPIOx->CRL  这个寄存器。多看几遍就明白了。

打开GPIOB端口的时钟这一行程序能理解,第二行配置IO口程序无法理解:
( (1) << (4*0) );“4*0”是什么意思
意思就是 1 << 0,1向左一定了0位,结果还是1,意思就是配置GPIOB的CRL寄存器的最低4位为 0001;即输出 PushPull模式。
这样写的作用是便于理解,还有方便后面操作PB的其它端口,比如PB5 直接改为 ( (1) << (4*5) )

但是书上有个清空控制PB0的端口位代码:GPIOB_CRL &=~( 0x0F<< (4*0));
这行代码的目的就是先将PB0的最后四位 清零。
回复 支持 反对

使用道具 举报

发表于 2018-4-9 08:22:14 | 显示全部楼层
这样的写法就是便于修改为其他gpio口时只要把0改成对应gpio口的pin就行了啦,至于清零啊 4是0100 f是1111对他们进行整4位左移后对应位变成0100或1111了,这是覆盖式的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-13 16:22:13 | 显示全部楼层
xiaoxiaojia 发表于 2018-4-8 21:20
GPIOx->CRL  这个寄存器。多看几遍就明白了。

打开GPIOB端口的时钟这一行程序能理解,第二行配置IO口程 ...

比如PB5 直接改为 ( (1) << (4*5) )   是不是可以这样理解: PB5有4个位,这个代码  “( (1) << (4*5) ) ” 运行后PB5这四位变成了 0001
GPIOB_CRL &=~( 0x0F<< (4*0)) 中的 0x0F<< (4*0) ,0x0F转换成二进制为0000 1111 ,PB0只有四个位,左移0位后,是将0000赋值给PB0还是1111赋值给PB0呢,然后0000或1111取反为1111或0000,这时候再”与“,请问是和谁相”与“,是和PB0的初始值相与吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-13 16:25:07 | 显示全部楼层
非谢家之宝树 发表于 2018-4-9 08:22
这样的写法就是便于修改为其他gpio口时只要把0改成对应gpio口的pin就行了啦,至于清零啊 4是0100 f是1111对 ...

这里面的 4 是指4*0中的4吗,不应该是0x0F对其进行覆盖吗
回复 支持 反对

使用道具 举报

发表于 2018-4-14 20:21:27 | 显示全部楼层

基础没学好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-15 16:07:20 | 显示全部楼层

嗯...............
回复 支持 反对

使用道具 举报

发表于 2018-5-3 17:21:14 | 显示全部楼层
我也看得糊里糊涂的。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2026-1-28 16:38 , Processed in 0.051217 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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