大家好,今天来为大家解答stm32有多少个gpio口这个问题的一些问题点,包括stm32gpio冷知识也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
本文目录
stm32用gpio点亮一个led
如果你LED一边接地,一边接GPIO。这样就可以关闭LED灯GPIO_ResetBits就是将对应的GPIO位输出0,两边电压差为0时就关闭LED灯了
stm32f1的gpio有多少种输出工作模式
stm32f1的gpio有四种输出工作模式:
-开漏输出(GPIO_Mode_Out_OD)
-开漏复用功能(GPIO_Mode_AF_OD)
-推挽式输出(GPIO_Mode_Out_PP)
-推挽式复用功能(GPIO_Mode_AF_PP)
-输入浮空(GPIO_Mode_IN_FLOATING)
-输入上拉(GPIO_Mode_IPU)
-输入下拉(GPIO_Mode_IPD)
-模拟输入(GPIO_Mode_AIN)
我发现,stm32l4为什么gpio时钟低于2M就不工作了
ARM的芯片都是这样,外设通常都是给了时钟后才能设置它的寄存器(即才能使用这个外设)STM32、LPC1XXX等等都是这样这么做的目的是为了省电,使用了所谓时钟门控的技术你的问题原因在于没有给时钟的情况下无法设置GPIO的寄存器补充:寄存器是基于触发器的,触发器的赋值是一定需要时钟的,而寄存器的时钟是由总线时钟提供的,就是说没有总线时钟的话,你给寄存器值它是不会读入的。
为了验证这个问题,你可以用jlink步步调试一下,看看在APB2不提供时钟的情况下,GPIO各个寄存器的值变否stm32f103普通io口可以作为i2c通信接口吗
可以,模拟i2c即可,举例:
voidIIC_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
IIC_SCL=1;
IIC_SDA=1;
}
//产生IIC起始信号
voidIIC_Start(void)
{
SDA_OUT();//sda线输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:whenCLKishigh,DATAchangeformhightolow
delay_us(4);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
voidIIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:whenCLKishighDATAchangeformlowtohigh
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//发送I2C总线结束信号
delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
//0,接收应答成功
u8IIC_Wait_Ack(void)
{
u8ucErrTime=0;
SDA_IN();//SDA设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return1;
}
}
IIC_SCL=0;//时钟输出0
return0;
}
//产生ACK应答
voidIIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生ACK应答
voidIIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
voidIIC_Send_Byte(u8txd)
{
u8t;
SDA_OUT();
IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);//对TEA5767这三个延时都是必须的
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8IIC_Read_Byte(unsignedcharack)
{
unsignedchari,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++)
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if(!ack)
IIC_NAck();//发送nACK
else
IIC_Ack();//发送ACK
returnreceive;
}
voidI2C_WriteByte(uint16_taddr,uint8_tdata,uint8_tdevice_addr)
{
IIC_Start();
if(device_addr==0xA0)//eeprom地址大于1字节
IIC_Send_Byte(0xA0+((addr/256)<<1));//发送高地址
else
IIC_Send_Byte(device_addr); //发器件地址
IIC_Wait_Ack();
IIC_Send_Byte(addr&0xFF);//发送低地址
IIC_Wait_Ack();
IIC_Send_Byte(data);//发送字节
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
if(device_addr==0xA0)//
delay_ms(10);
else
delay_us(2);
}
uint16_tI2C_ReadByte(uint16_taddr,uint8_tdevice_addr,uint8_tByteNumToRead)//读寄存器或读数据
{
uint16_tdata;
IIC_Start();
if(device_addr==0xA0)
IIC_Send_Byte(0xA0+((addr/256)<<1));
else
IIC_Send_Byte(device_addr);
IIC_Wait_Ack();
IIC_Send_Byte(addr&0xFF);//发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(device_addr+1); //发器件地址
IIC_Wait_Ack();
if(ByteNumToRead==1)//LM75温度数据为11bit
{
data=IIC_Read_Byte(0);
}
else
{
data=IIC_Read_Byte(1);
data=(data<<8)+IIC_Read_Byte(0);
}
IIC_Stop();//产生一个停止条件
returndata;
}
stm32有多少个gpio口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于stm32gpio冷知识、stm32有多少个gpio口的信息别忘了在本站进行查找哦。