使用C汇编完成点灯

该博客展示了如何在STM32微控制器上使用汇编语言定义GPIO地址,并通过C语言结构体封装GPIO控制器。代码示例详细解释了初始化LED、开关LED以及循环点亮不同LED的方法,涉及时钟使能、GPIO模式配置、速度设置和上下拉控制等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在汇编语言中0x50000A28是一个地址,在c语言中需要通过指针来实现地址的访问,并通过*来访问地址中的值,用结构体对GPIO控制器进行封装 typedef struct{

volatile unsigned int MODER; 

volatile unsigned int OTYPER;

 volatile unsigned int OSPEEDR;

volatile unsigned int PUPDR; 

volatile unsigned int IDR; 

volatile unsigned int ODR;

}gpio_t;

之后再将#define GPIOE ((gpio_t*)0x50006000)即刻通过GPIOE对各个寄存器进行访问更改

实现结果:

 

 

如图所示完成不同led循环点亮

代码示例:

gpio.c

#include "gpio.h"
extern void printf(const char *fmt, ...);
void led1_init()
{
	//时钟使能
	rcc_ahb4_ensetr |= (0x1 << 4);
	//将[21]端口置0
	GPIOE->MODER &= (~(0x1 <<21));
	//将[20]端口置1  设置为输出模式
	GPIOE->MODER |= (0x1 <<20);
	//设置为推挽模式
	GPIOE->OTYPER &= (~(0x1 << 10));
	
	//设置低速模式
	GPIOE->OSPEEDR &=(~(0x3<<20));

	//将[21:20]置0 禁止上下拉
	GPIOE->PUPDR &= (~(0x3 <<20 ));


}

void led1_on()
{
	GPIOE->ODR |= (0x1<<10);

}


void led1_off()
{
	GPIOE->ODR &= (~(0x1<<10));

}


void led2_init()
{
	//时钟使能
	rcc_ahb4_ensetr |= (0x1 << 5);
	//将[21]端口置0
	GPIOF->MODER &= (~(0x1 <<21));
	//将[20]端口置1  设置为输出模式
	GPIOF->MODER |= (0x1 <<20);
	//设置为推挽模式
	GPIOF->OTYPER &= (~(0x1 << 10));
	
	//设置低速模式
	GPIOF->OSPEEDR &=(~(0x3<<20));

	//将[21:20]置0 禁止上下拉
	GPIOF->PUPDR &= (~(0x3 <<20 ));


}

void led2_on()
{
	GPIOF->ODR |= (0x1<<10);

}


void led2_off()
{
	GPIOF->ODR &= (~(0x1<<10));

}





void led3_init()
{
	//时钟使能
	rcc_ahb4_ensetr |= (0x1 << 4);
	//将[17]端口置0
	GPIOE->MODER &= (~(0x1 <<17));
	//将[16]端口置1  设置为输出模式
	GPIOE->MODER |= (0x1 <<16);
	//设置为推挽模式
	GPIOE->OTYPER &= (~(0x1 << 8));
	
	//设置低速模式
	GPIOE->OSPEEDR &=(~(0x3<<16));

	//将[17:16]置0 禁止上下拉
	GPIOE->PUPDR &= (~(0x3 <<16 ));


}

void led3_on()
{
	GPIOE->ODR |= (0x1<<8);

}


void led3_off()
{
	GPIOE->ODR &= (~(0x1<<8));

}










gpio.h

#ifndef __GPIO_H__
#define __GPIO_H__

//封装RCC寄存器
#define rcc_ahb4_ensetr (*(volatile unsigned int *)0x50000A28)

typedef struct{
	volatile unsigned int MODER;
	volatile unsigned int OTYPER;
	volatile unsigned int OSPEEDR;
	volatile unsigned int PUPDR;
	volatile unsigned int IDR;
	volatile unsigned int ODR;
}gpio_t;

#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)

void led1_init();

void led1_on();

void led1_off();

void led2_init();

void led2_on();

void led2_off();

void led3_init();

void led3_on();

void led3_off();

#endif





main.c

#include "gpio.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()

{

	led1_init();

	led2_init();

	led3_init();

	while(1)

	{

		led1_on();

		delay_ms(1000);

		led1_off();

		led2_on();

		delay_ms(1000);

		led2_off();

		led3_on();

		delay_ms(1000);

		led3_off();

	}











	return 0;

}

印刷电路板(PCB)作为电子元件的关键支撑体,在电子设备中扮演着不可或缺的角色,其市场发展态势备受关注。QYResearch 的调研数据为我们揭示了该市场的全景:2024 年,全球印刷电路板市场规模约达 782.9 亿美元,而展望 2031 年,这一数字有望攀升至 1012.7 亿美元,在 2025 - 2031 期间,年复合增长率(CAGR)预计保持在 3.8%。然而,当前美国 2025 年关税框架的潜在变动,已然在全球市场掀起波澜,对印刷电路板市场的竞争格局、区域经济协同以及供应链体系产生着深远影响。 一、印刷电路板基础概述 印刷电路板,又被称作印制电路板或印刷线路板,常见英文缩写为 PCB(Printed circuit board)或 PWB(Printed wire board)。其内部存在金属导体,承担着连接电子元器件线路的重任。传统电路板主要运用印刷蚀刻阻剂的工艺,以此构建电路的线路与图面,这也是其名称的由来。在现代电子技术领域,PCB 通过电子印刷术制造而成,它成功搭建起电子元器件之间的电气连接桥梁,成为各类电子设备的核心组件。无论是体积小巧的智能穿戴设备,还是大型的服务器系统,只要其中配备集成电路等电子元件,PCB 必然 “参与其中”。 二、市场规模增长引擎 (一)中国主导地位凸显 中国在全球印刷电路板市场中占据着举足轻重的地位。据预测,2025 年中国市场规模有望达到 4333.21 亿元,在全球市场的占比将超过 50%。这一卓越成绩的背后,人工智能(AI)与新能源汽车产业功不可没,二者已成为驱动中国 PCB 市场增长的核心动力。以 AI 产业为例,随着 AI 技术的迅猛发展,对算力的需求呈爆发式增长,这使得 AI 服务器的市场需求大幅提升。而每台 AI 服务器中 PCB 的价值量可达 5000 元,预计到 2025 年,全球 AI 服务器相关的 PC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值