1.点亮一个LED需要先使能GPIO口所对应的APB总线上的时钟
//使能时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
uint32_t RCC_APB2Periph //开启所对应GPIO组的时钟
RCC_APB2Periph_AFIO
RCC_APB2Periph_GPIOA
RCC_APB2Periph_GPIOB,
RCC_APB2Periph_GPIOC,
RCC_APB2Periph_GPIOD,
RCC_APB2Periph_GPIOE,
RCC_APB2Periph_GPIOF,
RCC_APB2Periph_GPIOG,
RCC_APB2Periph_ADC1,
RCC_APB2Periph_ADC2,
RCC_APB2Periph_TIM1,
RCC_APB2Periph_SPI1,
RCC_APB2Periph_TIM8,
RCC_APB2Periph_USART1,
RCC_APB2Periph_ADC3,
RCC_APB2Periph_TIM15,
RCC_APB2Periph_TIM16,
RCC_APB2Periph_TIM17,
RCC_APB2Periph_TIM9,
RCC_APB2Periph_TIM10,
RCC_APB2Periph_TIM11;
FunctionalState NewState //启用时钟或者关闭时钟
ENABLE
DISABLE
2.初始化GPIO口
//初始化 GPIO
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIO_TypeDef* GPIOx //需要初始化的GPIO口所对应的 GPIO组
GPIO_InitTypeDef* GPIO_InitStruct //初始化 GPIO的结构体
GPIO_Mode//输入模式
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 //复用推挽输出
GPIO_Pin = GPIO_Pin_4 //需要初始化的 GPIO口
GPIO_Speed = GPIO_Speed_50MHz; //GPIO频率
GPIO_Speed_10MHz
GPIO_Speed_2MHz
GPIO_Speed_50MHz
3.向GPIO口发送高低电平 控制LED
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //将GOIO设置为 低电平
GPIO_TypeDef* GPIOx //控制的GPIO口所对应的GPIO组
uint16_t GPIO_Pin //控制的GPIO口
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//将GOIO设置为 高电平
GPIO_TypeDef* GPIOx //控制的GPIO口所对应的GPIO组
uint16_t GPIO_Pin //控制的GPIO口
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//设置GPIO为低/高
GPIO_TypeDef* GPIOx //控制的GPIO口所对应的GPIO组
BitAction BitVal
Bit_RESET: to clear the port pin //设为低电平
Bit_SET: to set the port pin //设为高电平
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); //控制对指定GPIO组的多个GPIO口操作
GPIO_TypeDef* GPIOx //控制的GPIO口所对应的GPIO组
uint16_t PortVal
//一组GPIO分为16个 使用16位2进制控制
//例如开启第6个端口则为
//0x0040
//0000 0000 0100 0000
完整代码展示
//模拟延时函数 不精准
void Delay(int time)
{
for(int i = 0;i<time;i++)
for(int j = 0;j<3200;j++);
}
int led_tick = 1, i;
int main(void)
{
//初始化GPIO口
GPIO_InitTypeDef GPIOA_InitStructTure;
GPIOA_InitStructTure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOA_InitStructTure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
GPIOA_InitStructTure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIOA 开启时钟 开启一组GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&GPIOA_InitStructTure);
//将 指定 IO口 设置为 高电平
GPIO_WriteBit(GPIOA,GPIO_Pin_All,Bit_SET);
while(1)
{
//GPIOA0 - 6 流水灯形式 逐渐位移
for(i = 0;i<6;i++)
{
GPIO_Write(GPIOA,~(led_tick<<i));
Delay_ms(500);
}
}
}