原创 STM32 IO 使用 以及 重定义功能

2013-5-30 13:13 5177 16 16 分类: MCU/ 嵌入式 文集: 单片机与ARM

 

STM32  GPIO使用

今天第一次使用STM32虽然它的IO功能强大 但是只看数据手册还是真是搞不懂该怎么用

资料比较零散,查了下资料小总结下STM32的gpio使用

 

要使用IO必须先使能它的相关时钟

先看下两大时钟管理体系

 

ahb1.jpg

 

ahb2.jpg

 

分为三个功能  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);
 
}
 
 
 
最后贴上重映射表
remap.jpg
 

文章评论0条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /2 下一条