led初始化函数
void LED_Init(void)
{
/*库函数配置
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
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(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 */
//寄存器配置
RCC->APB2ENR |= 1 << 3; //使能端口时钟
RCC->APB2ENR |= 1 << 6;
GPIOB ->CRL &= 0XFF0FFFFF;//CRL为端口配置低配置寄存器,配置引脚输出/输入模式,速度
GPIOB ->CRL |= 0XFF3FFFFF;
GPIOB ->ODR |= 1<<5;//ODR为端口数据输出寄存器,输出高电平
GPIOE ->CRL &= 0XFF0FFFFF;//CRL为端口配置低配置寄存器,配置引脚输出/输入模式,速度
GPIOE ->CRL |= 0XFF3FFFFF;
GPIOE ->ODR |= 1<<5;//ODR为端口数据输出寄存器,输出高电平
}
主函数
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
/*位段法
LED0=0;
LED1=0;
delay_ms(300); //延时300ms
LED0=1;
LED1=1;
delay_ms(300); //延时300ms*/
/*调用函数法
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
delay_ms(300); //延时300ms
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(300); //延时300ms*/
/*寄存器法*/
//BRR为端口清除寄存器(16位),置1时将对应ODR(端口输出寄存器)位置0
//BSRR为端口清除/配置寄存器(32位),高16位为对应ODR位置0.低16位为对应ODR置1
/*
GPIOB->BRR |= 1 << 5; //同理GPIOB->BRR=GPIO_Pin_5;
GPIOE->BRR |= 1 << 5; //同理GPIOE->BRR=GPIO_Pin_5;
delay_ms(300); //延时300ms/
GPIOB->BSRR |= 1 << 5; //同理GPIOB->BSRR=GPIO_Pin_5;
GPIOE->BSRR |= 1 << 5; //同理GPIOE->BSRR=GPIO_Pin_5;
delay_ms(300); //延时300ms*/
//寄存器写法同样等效
GPIOB->ODR &= 0 << 5;
GPIOE->ODR &= 0 << 5;
delay_ms(300); //延时300ms*/
GPIOB->ODR |= 1 << 5;
GPIOE->ODR |= 1 << 5;
delay_ms(300); //延时300ms*/
}
}
ODR的作用相当于BRR/BSRR,但是ODR与它们差在,ODR会受中断影响,而它们俩不会