ARM day5

作业:封装流水灯

led.h

cs 复制代码
#ifndef __LED_H__
#define __LED_H__

// 定义GPIO端口结构体,包含GPIO端口的各种寄存器
typedef struct
{
    unsigned int MODER;     // 端口模式寄存器
    unsigned int OTYPER;    // 端口输出类型寄存器
    unsigned int OSPEEDR;   // 端口速度寄存器
    unsigned int PUPDR;     // 端口上拉/下拉寄存器
    unsigned int IDR;       // 端口输入数据寄存器
    unsigned int ODR;       // 端口输出数据寄存器
    unsigned int BSRR;      // 端口位设置/重置寄存器
}gpio_t;

// 定义GPIOE和GPIOF的地址
#define GPIOE ((gpio_t *)0x50006000)
#define GPIOF ((gpio_t *)0x50007000)

void led1_init();


void led2_init();


void led3_init();

void led1_ctl(int flag);


void led2_ctl(int flag);


void led3_ctl(int flag);

#endif 

led.c

cs 复制代码
#include "led.h"

void led1_init()
{
    // 设置PE10为输出模式
    GPIOE->MODER &= (~(0x3 << 20));
    GPIOE->MODER |= (0x1 << 20);
    // 设置PE10为推挽输出
    GPIOE->OTYPER &= (~(0x1 << 10));
    // 设置PE10为低速输出
    GPIOE->OSPEEDR &= (~(0x3 << 20));
    // 设置PE10无上拉下拉
    GPIOE->PUPDR &= (~(0x3 << 20));
}
void led2_init()
{
    // 设置Pf10为输出模式
    GPIOF->MODER &= (~(0x3 << 20));
    GPIOF->MODER |= (0x1 << 20);
    // 设置PF10为推挽输出
    GPIOF->OTYPER &= (~(0x1 << 10));
    // 设置PF10为低速输出
    GPIOF->OSPEEDR &= (~(0x3 << 20));
    // 设置PF10无上拉下拉
    GPIOF->PUPDR &= (~(0x3 << 20));
}
void led3_init()
{
    // 设置PE8为输出模式
    GPIOE->MODER &= (~(0x3 << 16));
    GPIOE->MODER |= (0x1 << 16);

    // 设置PE8为推挽输出
    GPIOE->OTYPER &= (~(0x1 << 8));

    // 设置PE8为低速输出
    GPIOE->OSPEEDR &= (~(0x3 << 16));

    // 设置PE8无上拉下拉
    GPIOE->PUPDR &= (~(0x3 << 16));
}

void led1_ctl(int flag)
{
    if (flag == 1)
    {
        GPIOE->ODR |= (0x1 << 10);
    }
    else if (flag == 0)
    {
        GPIOE->ODR &= (~(0x1 << 10));
    }
}

void led2_ctl(int flag)
{
    if (flag == 1)
    {
        GPIOF->ODR |= (0x1 << 10);
    }
    else if (flag == 0)
    {
        GPIOF->ODR &= (~(0x1 << 10));
    }
}

// LED3控制
void led3_ctl(int flag)
{
    if (flag == 1)
    {
        GPIOE->ODR |= (0x1 << 8);
    }
    else if (flag == 0)
    {
        GPIOE->ODR &= (~(0x1 << 8));
    }
}

main.c

cs 复制代码
#include "led.h"
// 手动封装一个延时函数
void delay_ms(int ms)
{
	int i, j;
	for (i = 0; i < ms; i++)
	{
		for (j = 0; j < 2000; j++)
		{
		}
	}
}
int main()
{
	// 使能GPIO的外设时钟
	*((unsigned int *)0X50000A28) |= (0X3 << 4);
	led1_init();
	led2_init();
	led3_init();

	while (1)
	{
		// LED1亮
		led1_ctl(1);
		led2_ctl(0);
		led3_ctl(0);
		delay_ms(500);
		// LED2亮
		led1_ctl(0);
		led2_ctl(1);
		led3_ctl(0);
		delay_ms(500);
		delay_ms(500);
		// LED3亮
		led1_ctl(0);
		led2_ctl(0);
		led3_ctl(1);
		delay_ms(500);
		delay_ms(500);
	}
	return 0;
}

封装流水灯

相关推荐
GilgameshJSS9 小时前
STM32H743-ARM例程33-TOUCH
c语言·arm开发·stm32·单片机·嵌入式硬件
wanhengidc12 小时前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
陌上花开缓缓归以1 天前
phy降速自愈到100M重试流程分析
arm开发
凉、介1 天前
ARM 总线技术 —— APB
arm开发·笔记·学习
电鱼智能的电小鱼2 天前
基于电鱼 ARM 工控机的煤矿主控系统高可靠运行方案——让井下控制系统告别“死机与重启”
arm开发·人工智能·嵌入式硬件·深度学习·机器学习
陌上花开缓缓归以2 天前
linux系统启动失败之flash异常分析
arm开发
电鱼智能的电小鱼3 天前
基于电鱼 ARM 工控机的井下AI故障诊断方案——让煤矿远程监控更智能、更精准
网络·arm开发·人工智能·算法·边缘计算
GilgameshJSS3 天前
STM32H743-ARM例程35-DHCP
c语言·arm开发·stm32·单片机·嵌入式硬件
GilgameshJSS3 天前
STM32H743-ARM例程34-BootROM
c语言·arm开发·stm32·单片机·嵌入式硬件
robin8611093 天前
Keil(MDK-ARM)和 STM32CubeIDE对比
arm开发·stm32·嵌入式硬件