通过对控制寄存器的封装,实现LED灯的循环点亮。
头文件:
1 #ifndef __LED_H__
2 #define __LED_H__
3
4 //结构体封装
5 typedef struct
6 {
7 volatile unsigned int MODER;
8 volatile unsigned int OTYPER;
9 volatile unsigned int OSPEEDR;
10 volatile unsigned int PUPDR;
11 volatile unsigned int IDR;
12 volatile unsigned int ODR;
13 }gpio_t;
14 #define GPIOE ((gpio_t*)0x50006000)
15 #define GPIOF ((gpio_t*)0x50007000)
16
17 #define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)
18
19 //LED1灯初始化
20 void led1_init(void);
21 //LED1灯点亮
22 void led1_on(void);
23 //LED1灯熄灭
24 void led1_off(void);
25
26 //LED2灯初始化
27 void led2_init(void);
28 //LED2灯点亮
29 void led2_on(void);
30 //LED2灯熄灭
31 void led2_off(void);
32
33 //LED3始化
34 void led3_init(void);
35 //LED3灯点亮
36 void led3_on(void);
37 //LED3灯熄灭
38 void led3_off(void);
39
40 #endif
源文件:
#include "led.h"
//LED1灯初始化
void led1_init(void)
{
//1.设置GPIOE控制器使能 4位置1
RCC_MP_AHB4ENSETR |= (0x1<<4);
//2.设置PE10引脚为输出模式 21:20 位置 01
GPIOE->MODER &= (~(0x3<<20));
GPIOE->MODER |= (0x1<<20);
//3.设置PE10引脚为推晚输出模式 10位置0
GPIOE->OTYPER &= (~(0x1<<10));
//4.设置PE10引脚为低速输出 21:20 位置 00
GPIOE->OSPEEDR &= (~(0x3<<20));
//5.设置PE10引脚禁止上下拉电阻 21:20位置 00
GPIOE->PUPDR &= (~(0x3<<20));
}
//LED1灯点亮
void led1_on(void)
{
//1.设置PE10引脚输出高电平 10 位置 1
GPIOE->ODR |= (0x1<<10);
}
//LED1灯熄灭
void led1_off(void)
{
//1.设置PE10引脚输出低电平 10 位置 0
GPIOE->ODR &= (~(0x1<<10));
}
//LED2灯初始化
void led2_init(void)
{
//1.设置GPIOF控制器使能 5位置1
RCC_MP_AHB4ENSETR |= (0x1<<5);
//2.设置PF10引脚为输出模式 21:20 位置 01
GPIOF->MODER &= (~(0x3<<20));
GPIOF->MODER |= (0x1<<20);
//3.设置PF10引脚为推晚输出模式 10位置0
GPIOF->OTYPER &= (~(0x1<<10));
//4.设置PF10引脚为低速输出 21:20 位置 00
GPIOF->OSPEEDR &= (~(0x3<<20));
//5.设置PF10引脚禁止上下拉电阻 21:20位置 00
GPIOF->PUPDR &= (~(0x3<<20));
}
//LED2灯点亮
void led2_on(void)
{
//1.设置PF10引脚输出高电平 10 位置 1
GPIOF->ODR |= (0x1<<10);
}
//LED2灯熄灭
void led2_off(void)
{
//1.设置PF10引脚输出低电平 10 位置 0
GPIOF->ODR &= (~(0x1<<10));
}
//LED3灯初始化
void led3_init(void)
{
//1.设置GPIOE控制器使能 4位置1
RCC_MP_AHB4ENSETR |= (0x1<<4);
//2.设置PE8引脚为输出模式 17:16 位置 01
GPIOE->MODER &= (~(0x3<<16));
GPIOE->MODER |= (0x1<<16);
//3.设置PE8引脚为推晚输出模式 8位置0
GPIOE->OTYPER &= (~(0x1<<8));
//4.设置PE8引脚为低速输出 17:16 位置 00
GPIOE->OSPEEDR &= (~(0x3<<16));
//5.设置PE8引脚禁止上下拉电阻 17:16位置 00
GPIOE->PUPDR &= (~(0x3<<16));
}
//LED3灯点亮
void led3_on(void)
{
//1.设置PE8引脚输出高电平 8 位置 1
GPIOE->ODR |= (0x1<<8);
}
//LED3灯熄灭
void led3_off(void)
{
//1.设置PE8引脚输出低电平 8 位置 0
GPIOE->ODR &= (~(0x1<<8));
}
主函数测试:
1 #include "led.h"
2
3 extern void printf(const char *fmt, ...);
4 void delay_ms(int ms)
5 {
6 int i,j;
7 for(i = 0; i < ms;i++)
8 for (j = 0; j < 1800; j++);
9 }
10
11
12 int main()
13 {
14 led1_init();
15 led2_init();
16 led3_init();
17 while(1)
18 {
19 led1_on();
20 delay_ms(500);
21 led1_off();
22
23 led2_on();
24 delay_ms(500);
25 led2_off();
26
27 led3_on();
28 delay_ms(500);
29 led3_off();
30 }
31 return 0;
32 }
make:
实验现象截图: