先使能io口寄存器时钟
在FWLIB文件夹下的stm32f10x_rcc.c下的stm32f10x_rcc.h的头文件里的void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)为初始化使能函数
1. 第一个参数uint32_t RCC_APB2Periph使能那一个外设的时钟包括(
#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000))
2. 第二个参数FunctionalState NewState表示使能或者不使能(
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))注:ENABLE(使可能)为确认使能DISABLE(使残废)为不使能
例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);//使能GPIOB和GPIOE的时钟
)
初始化io口模式
在FWLIB文件夹下的stm32f10x_rcc.c下的stm32f10x_gpio.h的头文件里的void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)为初始化函数
第一个参数GPIO_TypeDef* GPIOx输入的是GPIO(A—G)指定是那一组io口
第二个参数GPIO_InitTypeDef* GPIO_InitStruct为结构体参数有三个变量所以要先定义一个结构体类型GPIO_InitTypeDef GPIO_InitStructure;//定义结构体类型,然后定义结构体的三个变量
1.GPIO_Pin:指定哪一个io口(0-15 all)
2.GPIO_Speed:指定速度(10MHz;2MHz;50MHz)
3.GPIO_Mode:指定输出模式(8中输出模式的一种)
例:GPIO_InitTypeDef GPIO_InitStructure;//先定义结构体类型,然后定义结构体的三个变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0–>PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure);//指定GPIOE口使其输出模式为E.5的输出为推挽输出,输出速度为50MHz。
设置io口值(1.高电平:0.低电平)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//输出高电平
第一个参数为选择那一个io口,第二个参数为设置io口上的那一个端子
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//输出低电平
第一个参数为选择那一个io口,第二个参数为设置io口上的那一个端子
例:GPIO_ResetBits(GPIOB,GPIO_Pin_5);//输出GPIOB的第五个端子为低电平
GPIO_SetBits(GPIOE,GPIO_Pin_5);//输出GPIOE的第五个端子为低电平
注:
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
其中assert_param(IS_GPIO_ALL_PERIPH(xxxxx))之类的为有效性判断
例:#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) ||
((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) ||
((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) ||
((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))
总结
1.使能io口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟
2.初始化io口设定输入或输出模式
GPIO_InitTypeDef GPIO_InitStructure;定义的初始化指针
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
(输入的时候不需要注明GPIO_Speed,输出的时候需要注明GPIO_Speed)