【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 }    

 

posted @ 2016-03-05 20:56  喜闻乐见小逗逗  阅读(918)  评论(0编辑  收藏  举报