【STM】IO口配置库函数、寄存器方式
库函数函数:
一个初始化函数:初始化一个或者多个IO口(同一组)的工作模式、输出类型、速度以及上下拉方式
1 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 2 typedef struct 3 { 4 uint32_t GPIO_Pin//指定要初始化的端口 5 GPIOMode_TypeDef GPIO_Mode;//端口模式 6 GPIOSpeed_TypeDef GPIO_Speed;//速度 7 GPIOOType_TypeDef GPIO_OType; //输出类型 8 GPIOPuPd_TypeDef GPIO_PuPd;//上拉或者下拉 9 }GPIO_InitTypeDef;
0 GPIO_Init函数初始化样例:
1 GPIO_InitTypeDef GPIO_InitStructure; 2 3 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟 4 5 //GPIOF9,F10初始化设置 6 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口 7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 8 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz 10 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 11 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF9,F10
两个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);读取某个GPIO的输入电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);读取某组GPIO的输入电平
两个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);读取某个GPIO的输出电平
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);读取某组GPIO的输出电平
四个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);设置某个IO口输出高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);设置某个IO口输出低电平
下边两个不常用
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
库函数步骤:
使能IO口时钟,调用函数RCC_AHB1PeriphClockCmd();
不同的外设调用的时钟使能函数可能不一样
初始化IO口模式,调用函数GPIO_Init();
操作IO口,输出高低电平。
GPIO_SetBits();
GPIO_ResetBits();
寄存器步骤:
使能IO口时钟,配置相关寄存器寄存器RCC->AHB1ENR
初始化IO口模式,配置四个配置寄存器
GPIOx_MODER
GPIOx_OTYPER
GPIOx_OSPEEDR
GPIOx_PUPDR
操作IO口,输出高低电平。配置寄存器GPIOX_ODR或BSRRL/BSRRH
1 void LED_Init(void) 2 { 3 RCC->AHB1ENR|= 1<<5; 4 //PF9 5 GPIOF->MODER &= ~(3<<2*9); 6 GPIOF->MODER |= 1<<(2*9); 7 8 GPIOF->OSPEEDR &= ~(3<<2*9); 9 GPIOF->OSPEEDR |= 2<<(2*9); 10 11 GPIOF->PUPDR &= ~(3<<2*9); 12 GPIOF->PUPDR |=1<<(2*9); 13 14 GPIOF->OTYPER &= ~(1<<9); 15 GPIOF->OTYPER |=0<<9; 16 17 GPIOF->ODR|= 1<<9;//1 18 19 //PF10 20 21 GPIOF->MODER &= ~(3<<2*10); 22 GPIOF->MODER |= 1<<(2*10); 23 24 GPIOF->OSPEEDR &= ~(3<<2*10); 25 GPIOF->OSPEEDR |= 2<<(2*10); 26 27 GPIOF->PUPDR &= ~(3<<2*10); 28 GPIOF->PUPDR |=1<<(2*10); 29 30 GPIOF->OTYPER &= ~(1<<10); 31 GPIOF->OTYPER |=0<<10; 32 33 GPIOF->ODR|= 1<<10; 34 }
1 int main(void) 2 { 3 delay_init(168); 4 LED_Init(); 5 while(1) 6 { 7 GPIOF->ODR&=~(1<<9); 8 GPIOF->ODR&=~(1<<10); 9 delay_ms(500); 10 11 GPIOF->ODR |= 1<<9; 12 GPIOF->ODR |=1<<10; 13 delay_ms(500); 14 } 15 }