例程:STM32F103系列 I2C软件模拟实验(战舰例程)
问题:下面两行关于“IO方向”的代码不太明白。之前一直看的例程都是库函数的代码,突然间冒出来两行寄存器的代码一时间手足无措。
- 1
- 2
咋办/strong>
解决:
纯逻辑分析
首先有下面几个必然成立的逻辑关系(十六进制):
A & F = A; A | F = F;
A & 0 = 0; A | 0 = A;
假设 CRL=0X########
Ⅰ.
CRL = CRL & 0X0FFFFFFF = 0X######## & 0X0FFFFFFF = 0X0#######
32位的8 (1000b) 按位(非循环)左移28位,(u32)8<<=28 => 0X80000000
CRL = CRL | 0X80000000 = 0X8#######
Ⅱ.
CRL = CRL & 0X0FFFFFFF = 0X######## & 0X0FFFFFFF = 0X0#######
32位的3 (0011b) 按位(非循环)左移28位,(u32)3<<=28 => 0X30000000
CRL = CRL | 0X30000000 = 0X3#######
这么一堆逻辑计算后,还是一头雾水,跟IO口的方向有什么关系续!
络查找
最受启发的一篇博文,谢谢这位博主!(点击可查看)
查到这个问题涉及GPIO端口配置寄存器,关键词CRL,需要查看Manual。
Manual查找(多图预警)
目前接触到的STM32的手册有三种:
Datasheet 数据手册:主要内容是器件的技术特征、性能参数
RM0008(Reference Manual) 器件参考使用手册:寄存器版的编程手册
UM0427(User Manual) 固件库手册:库函数功能、参数等描述,库函数编程手册
这里主要参考RM(该版中文版我已上传资源,需要的朋友欢迎搬走)。
(1) I2C的GPIO配置表
(2) GPIO配置方式回顾
浮空输入 floating input
上拉输入 pull-up input
下拉输入 pull-down input
模拟输入 analog
开漏输出 open-drain output
推挽输出 push-pull output
复用开漏输出 alternate function open-drain
复用推挽输出 alternate function push-pull
(3) GPIO寄存器具体有哪些呢下表
(4) GPIO寄存器是如何配置端口的呢/h2>
如(3)中所示,GPIO有两个32位的端口配置寄存器,这里需要查找的是CRL端口配置低寄存器,如下面的表格所示,32位的每一位表示什么,置0还是置1,置位后对应怎样的输入输出模式,都写得一清二楚
Ⅱ. 同理,因为0X3=0011b,所以此时GPIOB的CRL寄存器(第7个IO口) MODE=11>00,处于输出模式,最大速度50MHz,CNF=00,通用推挽输出
总结
SDA对应IO口的输入输出方向和模式全部了解,与君共勉,以上!
【声明】本博文为个人学习笔记,仅供参考。转发请注明出处。如发现有误,还请不吝赐教,谢谢!
注:此文装载他处。
GPIOx_CRL为0-7pin端口控制寄存器,GPIOx_CRH为8-15pin端口控制寄存器
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!