STM32流水灯

void LED_Init(void)

GPIO_InitTypeDef  GPIO_InitStructure;

 

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 使能PA端口时钟

(RCC时钟你可以先不用看)

 

GPIO的库函数

 

库函数中主要用到的有如下:

GPIO_Init

GPIO_StructInit

GPIO_SetBit

GPIO_ResetBit      其他的根据需要在用!

函数 GPIO_Init

 

 

这个是设置为0

 

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  //LED0-->PA.8端口配置

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_Init(GPIOA, &GPIO_InitStructure);

 GPIO_SetBits(GPIOA,GPIO_Pin_8);  //PA.8输出高

 

 

GPIO配置

LED0=0;  //  使用了位带操作GPIO_ResetBits(GPIOA,GPIO_Pin_8);

 

#define LED0 PAout(8)    //PA8

 

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出

 

位操作

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

 

 

跟你讲一下寄存器怎么看?

 

下面这个表很重要,必须看懂!

 

GPIO寄存器描述

端口配置低寄存器(GPIOx_CRL) (x=A..E)

 

端口配置高寄存器(GPIOx_CRH) (x=A..E)

 

注意MODE[1:0]>00为输出模式,GPIO_Mode_AIN = 0x0,

 

举例子

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出

GPIO_Mode_Out_PP = 0x10,            PA8的  

 

速率

typedef enum

  GPIO_Speed_10MHz = 1,

  GPIO_Speed_2MHz, 

  GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || 

                              ((SPEED) == GPIO_Speed_50MHz))

 

方式

typedef enum

{ GPIO_Mode_AIN = 0x0,

  GPIO_Mode_IN_FLOATING = 0x04,

  GPIO_Mode_IPD = 0x28,

  GPIO_Mode_IPU = 0x48,

  GPIO_Mode_Out_OD = 0x14,

  GPIO_Mode_Out_PP = 0x10,

  GPIO_Mode_AF_OD = 0x1C,

  GPIO_Mode_AF_PP = 0x18

}GPIOMode_TypeDef;

 

#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))

 

端口输入数据寄存器(GPIOx_IDR) (x=A..E)

端口输出数据寄存器(GPIOx_ODR) (x=A..E)

端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)

端口位清除寄存器(GPIOx_BRR) (x=A..E)

 

原文地址:https://www.cnblogs.com/dongsnow/p/4336998.html