最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。
对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。
1.初始化GPIO
- void IIC_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
- }
复制代码
2.IIC的io口方向设置
- //IO方向设置
- #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
- #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码
数据手册中CRL寄存器的内容:
a.输入设置
我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。
b.输出设置
我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:
3.IO操作函数
- #define IIC_SCL PBout(6) //SCL
- #define IIC_SDA PBout(7) //SDA
- #define READ_SDA PBin(7) //输入SDA
复制代码- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 ,内容取自正点原子的sys.h文件,0<n<16
- #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。
-
-
-
- #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
- #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
复制代码
ODR寄存器相关介绍:
IDR寄存器相关介绍:
————————————————
版权声明:陈俊帆Linux
如有侵权请联系删除
|