STM32 GPIO使用
今天第一次使用STM32虽然它的IO功能强大 但是只看数据手册还是真是搞不懂该怎么用
资料比较零散,查了下资料小总结下STM32的gpio使用
要使用IO必须先使能它的相关时钟
先看下两大时钟管理体系
分为三个功能 1复位后功能 2第二功能 3重映射功能(我叫它第三功能)
普通IO使用流程
使能时钟
配置
使用读写
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*允许总线CLOCK,在使用GPIO之前必须允许相应端的时钟.
从STM32的设计角度上说,没被允许的端将不接入时钟,也就不会耗能,
这是STM32节能的一种技巧,*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
//* PB 5 6 7DS1302-----------------------------------
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //50M时钟速度
GPIO_Init(GPIOB, &GPIO_InitStructure);
//key bz relay led--------------------------------
/*PA10 11,输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PC10 11 12按键输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* PE,8,9输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //50M时钟速度
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* PE4,5,6按键输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);
//lcd------------------------------------------------------
/*PA8 9,输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PC6,7,8,9输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //50M时钟速度
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*PD8,9,10,11,12,13,14,15,输出*/
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //50M时钟速度
GPIO_Init(GPIOD, &GPIO_InitStructure);
// LED7_ON;
// LED8_ON;
//
// /* PD3,4,5,6按键输入--这里使用直接操作寄存器的方式配置IO,上拉输入*/
// GPIOD->CRL&=(~(0x3<<12)); //PD3输入
// GPIOD->CRL&=(~(0x3<<16)); //PD4输入
// GPIOD->CRL&=(~(0x3<<20)); //PD5输入
// GPIOD->CRL&=(~(0x3<<24)); //PD6输入
//
// GPIOD->CRL=(GPIOD->CRL&(~(0x03<<14)))|(0x02<<14);//PD3上下拉模式
// GPIOD->CRL=(GPIOD->CRL&(~(0x03<<18)))|(0x02<<18);//PD4上下拉模式
// GPIOD->CRL=(GPIOD->CRL&(~(0x03<<22)))|(0x02<<22);//PD5上下拉模式
// GPIOD->CRL=(GPIOD->CRL&(~(0x03<<26)))|(0x02<<26);//PD6上下拉模式
//
// GPIOD->BSRR=GPIO_Pin_3; //PD3上拉
// GPIOD->BSRR=GPIO_Pin_4; //PD4上拉
// GPIOD->BSRR=GPIO_Pin_5; //PD5上拉
// GPIOD->BSRR=GPIO_Pin_6; //PD6上拉
}
第二功能使用流程
使能IO时钟
配置IO为第二功能
使能第二功能时钟
配置第二功能
使用第二功能
比如UART的使用
void USART2_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// USART_ClockInitTypeDef USART_ClockInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOE, &GPIO_InitStructure);
RS485_CTL_L(); //RECEIVE
//使能串口2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
// A2 做T2X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// A3 做R2X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
// USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
// USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
// USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
// USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
// USART_ClockInit(USART2, &USART_ClockInitStructure);
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
//串口2使用接收中断
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
重映射功能(第三功能)使用流程
使能io时钟
配置IO为复用
重映射IO为第三功能
使能第三功能时钟
配置第三功能
使用第三功能
比如我用PB8 PB9 做I2C1
void I2C_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/* PB8,9 SCL and SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* I2C1_SCL on PB08, I2C1_SDA on PB09 */
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); //使用重映射功能
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x30;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;//100K速度
I2C_Cmd(I2C1, ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
最后贴上重映射表
文章评论(0条评论)
登录后参与讨论