一、目的
在正点原子精英版上实现LED0、LED1两个灯每间隔1秒同时闪烁。
二、硬件电路分析
由电路图可知:LED0-PB5,LED1-PE5。
三、软件设计
本次实验主要是控制GPIOB.5和GPIOE.5输出进而控制LED0和LED1的状态。其核心是对着两个引脚进行配置,配置流程如下:
(1)使能端口时钟。(GPIO是挂载在APB2总线上的外设)
(2)设置引脚模式。将两个引脚都设置为推挽输出模式(设置为推挽输出模式可以使该引脚输出强高低电平)
(3)初始时将这两个引脚拉高。
四、程序
1.库函数版本
/*------------------------------库函数------------------------------*/
void LED_init(void) //LED初始化函数
{
GPIO_InitTypeDef GPIO_InitStructure; //一定要放这里,放下面会报错
//时钟使能-使能GPIOB和GPIOE端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //LED0-PB5
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //LED1-PE5
//配置GPIOB.5和GPIOE.5模式
//GPIOB.5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB5拉高
//GPIOE.5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE5拉高
}
主函数
#include "led.h"
/*--------------库函数版本---------------*/
int main(void)
{
LED_init();
delay_init();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
delay_ms(1000);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(1000);
}
}
2.寄存器版本
/*------------------------------寄存器版本-----------------------------*/
void LED_init(void)
{
//时钟使能
RCC->APB2ENR |= (1 << 3); //使能GPIOB端口时钟
RCC->APB2ENR |= (1 << 6); //使能GPIOE端口时钟
//端口模式设置
GPIOB->CRL &= ~(15 << 20); //清零
GPIOB->CRL |= (3 << 20); //0011 设置GPIOB.5为推挽输出模式
GPIOB->BSRR |= (1 << 5); //将GPIOB.5上拉
GPIOE->CRL &= ~(15 << 20); //清零
GPIOE->CRL |= (3 << 20); //0011 设置GPIOE.5为推挽输出模式
GPIOE->BSRR |= (1 << 5); //将GPIOE.5上拉
}
主函数
#include "led.h"
/*--------------寄存器版本-----------------*/
int main(void)
{
LED_init();
delay_init();
while(1)
{
GPIOB->BSRR |= (1 << 5);
GPIOE->BSRR |= (1 << 5);
delay_ms(300);
GPIOB->BRR |= (1 << 5);
GPIOE->BRR |= (1 << 5);
delay_ms(300);
}
}