【IIC】#define SDA_IN() {GPIOB->CRH=0XFFFFFF0F;GPIOB->CRH|=8<<4;}

2023-10-24 08:59
文章标签 iic define crh gpiob sda 0xffffff0f

本文主要是介绍【IIC】#define SDA_IN() {GPIOB->CRH=0XFFFFFF0F;GPIOB->CRH|=8<<4;},希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在软件IIC中看到以下代码,花了好长时间搞懂,特此记录

// SDA对应IO口方向的设置
#define SDA_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}// 1000 上拉输入模式 
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}// 输出模式,最大速度50mhz 

首先了解所操作的CRH寄存器

文档寄存器说明

1.清零

GPIOB->CRH&=0XFFFFFF0F

在这里插入图片描述
注意CRH是高八位IO控制寄存器,是一个32位的寄存器,其中CNFX 和 MODEX 这16位来控制一个IO的工作模式, 注意只用到每八位的[1:0]两位

SDA对应PB9
GPIOB->CRH&=0XFFFFFF0F
因此此代码将SDA对应的位置清零

2.设定

GPIOB->CRH|=8<<4

8 :1000
因为每16位对应4位二进制代码,为了跳过 PB8对应的位数,左移4来实现。

那么为了操作PB10 就是

GPIOB->CRH|=8<<8

那么为了操作PB11 就是

GPIOB->CRH|=8<<12

是不是很清除了呢?

这篇关于【IIC】#define SDA_IN() {GPIOB->CRH=0XFFFFFF0F;GPIOB->CRH|=8<<4;}的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274095

相关文章

2、#include和#define

#include和#define 一、#include二、#define宏定义1、宏变量2、宏函数 一、#include #include是预处理指令,会将头文件直接替换到文件中。 // hello.hvoid foo() {int c = 0;int d = 1;}// hello.cpp#include "hello.h"int main() {int a =

const与#define的优缺点

1.define由预处理程序处理,const由编译程序处理 2.#define不分内存,因为它是预编译指令,编译前进行了宏替换。const 不一定?某种说法,Const常量是占有内存的被“冻结”了的变量 3.const定义常量是有数据类型的,这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际

【STM32+HAL库】---- 硬件IIC驱动0.96OLED

硬件开发板:STM32G0B1RET6软件平台:cubemax+keil+VScode 内容原著声明 代码借鉴学习于以下文章: STM32 使用硬件IIC驱动0.96寸4针IOLED显示器(HAL库) 1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置引脚 1.3 导出工程 略… 2 代码 2.1 OLED_IIC_Config.h /*** **

【C++】define宏定义中的#,##,@#及\符号

一、# 名称:字符串化操作符 其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前 举例: #define example1(instr) #instr string str=example1(abc); 将会展成:string str="abc"; 注意:对空格的处理 a、忽略传入参数名前面和后

STM32 IIC

第一块:介绍协议规则,然后用软件模拟的形式来实现协议, 第二块:介绍STM32的IIC外设,然后用硬件来实现协议 因为IIC是同步时序的额,软件模拟协议也非常方便,像我们单片机一样,外挂芯片里的众多外设也是通过读写寄存器来控制运行的,寄存器本身也是存储器的一种,,这个芯片多有的寄存器也是都被分配到了一个线性的存储空间,如果我们想要读写寄存器来控制硬件电路,我们就至少需要定义两个字节数据,一个字节

nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R

用proguaid 只混淆Android项目的src下的包的话,如果出现了上面的问题: nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R 1.如果你想开发Androidsdk 首先把你的项目的src下面打一个包。 2.然后用proguaid混淆。混淆的时候,有时候老是不成功,然你解决上面的

宏__cplusplus/////ifnbsp;define…

在C与C++混合编写的代码中,我们常常会在头文件里看到如下的声明:   #ifdef __cplusplus //如果定义了表示是c++编译器extern "C" {  #endif  // 在这里写标准c程序   #ifdef __cplusplus  }  #endif   __cplusplus是c++编译器内部定义的宏,如果使用的c编译器__cplusplus不会被定义,所以它用来区分

Linux-IIC驱动(3)-IIC用户态驱动程序设计

之前已经说过,有2种i2c驱动程序的设计,比如说针对EEPROM的驱动程序。我们可以专门编写一个针对EEPROM的驱动程序。另一种方式就是通过i2c-dev,即通过i2c通用通用驱动,来编写一个应用程序,来完成对设备的控制。   我们现在就来实现i2c用户态驱动程序的设计。 通用设备驱动分析 首先需要分析i2c-dev,先打开i2c-dev.c这个文件,找到i2c_dev_init函

Linux-IIC驱动(2)-Linux下IIC子系统的介绍

IIC子系统架构   Linux下IIC的架构模型大概可以分为3层: 第一层是IIC的从设备驱动,他包含图中的device driver和i2c-dev。device driver需要用户编写,i2c-dev由内核实现,包含了IIC设备的通用方法,但是用户不能直接使用这个驱动,需要编写一个用户层驱动,它们2个合起来才可以实现一个驱动程序。   第二层总线驱动,他又叫做控制器驱动

Linux-IIC驱动(1)-IIC总线介绍

IIC我在很久之前就接触并使用过了,现在来回顾一下它的硬件结构和时序   硬件结构 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。硬件结构如下:   I2C总线只有两根双向信号线。 SDA: Serial Data Line-数据线 SCL :Serial Clock-时钟线   I2C总线