头文件代码:
#ifndef __LED_H__
#define __LED_H__
#define RCC_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
//结构体封装寄存器
typedef struct{
volatile unsigned int MODER; //00
volatile unsigned int OTYPER; //04
volatile unsigned int OSPEEDR; //08
volatile unsigned int PUPDR; //0C
volatile unsigned int IDR; //10
volatile unsigned int ODR; //14
}gpio_t;
typedef enum{
LED1 = 1,
LED2 = 2,
LED3 = 3,
}led_t;
typedef enum{
OFF = 0,
ON = 1,
}state_t;
//LED灯初始化函数
void led_init();
//LED灯状态函数
void led_state(led_t led,state_t state);
#endif
源文件代码:
#include"led.h"
//LED灯初始化函数
void led_init()
{
/*************************LED1--->PE10*************************/
/****************RCC章节初始化**************/
RCC_AHB4_ENSETR |= (0x1<<4);
/****************GPIO章节初始化************/
//设置PE10引脚为输出模式
GPIOE->MODER &= (~(0x3<<20));
GPIOE->MODER |= (0x1<<20);
//设置PE10引脚为推挽输出模式
GPIOE->OTYPER &= (~(0x1<<10));
//设置PE10引脚为低速输出
GPIOE->OSPEEDR &= (~(0x3<<20));
//设置PE10引脚禁止上下拉
GPIOE->PUPDR &= (~(0x3<<20));
/*************************LED2--->PF10*************************/
/****************RCC章节初始化**************/
RCC_AHB4_ENSETR |= (0x1<<5);
/****************GPIO章节初始化************/
//设置PE10引脚为输出模式
GPIOF->MODER &= (~(0x3<<20));
GPIOF->MODER |= (0x1<<20);
//设置PE10引脚为推挽输出模式
GPIOF->OTYPER &= (~(0x1<<10));
//设置PE10引脚为低速输出
GPIOF->OSPEEDR &= (~(0x3<<20));
//设置PE10引脚禁止上下拉
GPIOF->PUPDR &= (~(0x3<<20));
/*************************LED3--->PE8*************************/
/****************RCC章节初始化**************/
RCC_AHB4_ENSETR |= (0x1<<4);
/****************GPIO章节初始化************/
//设置PE10引脚为输出模式
GPIOE->MODER &= (~(0x3<<16));
GPIOE->MODER |= (0x1<<16);
//设置PE10引脚为推挽输出模式
GPIOE->OTYPER &= (~(0x1<<8));
//设置PE10引脚为低速输出
GPIOE->OSPEEDR &= (~(0x3<<16));
//设置PE10引脚禁止上下拉
GPIOE->PUPDR &= (~(0x3<<16));
}
//LED灯状态函数
void led_state(led_t led,state_t state)
{
if(1==led && 1==state)
{
//LED1点亮
GPIOE->ODR |= (0x1<<10);
}
else if(1==led && 0==state)
{
//LED1熄灭
GPIOE->ODR &= (~(0X1<<10));
}
else if(2==led && 1==state)
{
//LED2点亮
GPIOF->ODR |= (0x1<<10);
}
else if(2==led && 0==state)
{
//LED2熄灭
GPIOF->ODR &= (~(0X1<<10));
}
else if(3==led && 1==state)
{
//LED3点亮
GPIOE->ODR |= (0x1<<8);
}
else if(3==led && 0==state)
{
//LED3熄灭
GPIOE->ODR &= (~(0X1<<8));
}
}
测试文件代码:
#include "led.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
//LED灯初始化
led_init();
while(1)
{
//实现san
led_state(LED1,ON);
delay_ms(1000);
led_state(LED2,ON);
delay_ms(1000);
led_state(LED3,ON);
delay_ms(1000);
led_state(LED1,OFF);
delay_ms(1000);
led_state(LED2,OFF);
delay_ms(1000);
led_state(LED3,OFF);
delay_ms(1000);
}
return 0;
}