ARM---day02

汇编点灯

复制代码
.text 
.global _start
_start:

@1.设置GPIOE寄存器的时钟使能  RCC_MP_AHB4ENSETR[5:4]->1     0x50000a28
LDR R0,=0X50000A28
LDR R1,[R0]  @从r0为起始地址的4 5字节数据取出放在R1
ORR R1,R1,#(0x3<<4)  @第4 5位设置为1
STR R1,[R0]  @写回

@2.设置PE10管脚为输出模式  GPIOE_MODER[21:20]->01   0x50006000
LDR R0,=0x50006000
LDR R1,[R0]
BIC R1,R1,#(0x3<<20)   @[21:20]清0
BIC R1,R1,#(0x3<<16)   @[17:16]清0
ORR R1,R1,#(0x1<<20) 
ORR R1,R1,#(0x1<<16)
STR R1,[R0] 

@设置PF10管脚为输出模式
LDR R0,=0x50007000
LDR R1,[R0]
BIC R1,R1,#(0x3<<20)   @[21:20]清0
ORR R1,R1,#(0x1<<20) 
STR R1,[R0]

@3.设置PE8、PE10管脚为推挽输出  GPIOE_OTYPER[10,8]->0 0   0X50006004
LDR R0,=0X50006004
LDR R1,[R0]
BIC R1,R1,#(0x1<<8)
BIC R1,R1,#(0x1<<10)
STR R1,[R0] 

@设置PF10管脚为推挽输出  GPIOE_OTYPER[10]->0   0X50007004
LDR R0,=0X50007004
LDR R1,[R0]
BIC R1,R1,#(0x1<<10)
STR R1,[R0] 

@4.设置PE10 PE8管脚为低速输出   GPIOE_OSPEEDR[21:20,17:16]->00,00  0X50006008
LDR R0,=0x50006008
LDR R1,[R0]
BIC R1,R1,#(0x3<<20)@[21:20]清0
BIC R1,R1,#(0x3<<16)
STR R1,[R0] 

@设置PF10管脚为低速输出   GPIOF_OSPEEDR[21:20]->00  0X50007008
LDR R0,=0x50007008
LDR R1,[R0]
BIC R1,R1,#(0x3<<20)@[21:20]清0
STR R1,[R0] 

@5.设置PE10 PE8管脚输出时没有上拉下拉电阻  GPIOE_PUPDR[21:20,17:16]->00,00  0X5000600C
LDR R0,=0x5000600c
LDR R1,[R0]
BIC R1,R1,#(0x3<<20)@[21L20]清0
BIC R1,R1,#(0x3<<16)
STR R1,[R0] 

@设置PF10管脚输出时没有上拉下拉电阻  GPIOE_PUPDR[21:20]->00  0X5000700C
LDR R0,=0x5000700c
LDR R1,[R0]
BIC R1,R1,#(0x3<<20)@[21L20]清0
STR R1,[R0] 

@6. PE10 PE8 PF10交替输出高低电平      
@GPIOE_ODR[10,8]->1(高电平)  0(低电平)    0X50006014
@GPIOF_ODR[10]->1  0    0x50007014
@LED1亮灭交替
loop:
    @亮
    LDR R0,=0X50006014
    LDR R1,[R0]
    ORR R1,R1,#(0x1<<10)
    STR R1,[R0]
    BL delay
    @灭
    LDR R0,=0X50006014
    LDR R1,[R0]
    BIC R1,R1,#(0x1<<10)
    STR R1,[R0]
	
	LDR R0,=0X50007014
	LDR R1,[R0]
	ORR R1,R1,#(0x1<<10)    
	STR R1,[R0]
	BL delay

	LDR R0,=0X50007014
    LDR R1,[R0]
    BIC R1,R1,#(0x1<<10)
    STR R1,[R0]
	
	LDR R0,=0X50006014
	LDR R1,[R0]
	ORR R1,R1,#(0x1<<8)    
	STR R1,[R0]
	BL delay

	LDR R0,=0X50006014
    LDR R1,[R0]
    BIC R1,R1,#(0x1<<8)
    STR R1,[R0]
    b loop



@封装延时函数

delay:
    LDR R4,=0X10000000
mm:
    cmp r4,#0
    subne r4,r4,#1
    bne mm
    mov pc,lr  @程序返回
.end

C语言点灯

GPIO.h

objectivec 复制代码
#ifndef __GPIO_H__
#define __GPIO_H__

#define RCC_BAS ((volatile unsigned int*)0x50000000)
#define GPIOE_BAS ((volatile unsigned int*)0x50006000)

typedef struct gpio_t
{
	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;

typedef enum gpio_states_t
{
	GPIO_RESET,
	GPIO_SET	
}gpio_states_t;


#define GPIOE (gpio_t*)0x50006000
#define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)
void hal_gpio_init(gpio_t *gpio,unsigned int pin);
void hal_gpio_write(gpio_t *gpio,unsigned int pin, gpio_states_t state);
gpio_states_t hal_gpio_read(gpio_t *gpio, unsigned int pin);
#endif //__GPIO_H__

GPIO.c

objectivec 复制代码
#include "gpio.h"

// gpio初始化函数 
// 函数的参数: 
// 		gpio : 那组的GPIO引脚
// 		pin : 哪个引脚
void hal_gpio_init(struct gpio_t *gpio,unsigned int pin)
{
	// 1. 设置 GPIO引脚为输出模式 
	gpio->MODER &= (~(0x3 << (pin * 2)));
	gpio->MODER |= (0x1 << (pin * 2));
	// 2. 设置 GPIO引脚为推挽输出
	gpio->OTYPER &= ~(1<<pin);
	// 3. 设置 GPIO引脚为低速模式 
	gpio->OSPEEDR &= (~(3<<(pin*2)));
	gpio->OSPEEDR |= (1<<(pin*2));
	// 4. 设置 GPIO引脚禁止上拉和下拉
	gpio->PUPDR &= (~(3<<(pin*2)));
}

// 函数功能:gpio引脚输出高低电平
// 函数的参数:
// 		gpio : 那组的GPIO引脚
// 		pin : 哪个引脚
// 		state : 引脚的状态
// 函数返回值:无
void hal_gpio_write(struct gpio_t *gpio, 
		unsigned int pin, gpio_states_t state)
{
	// 5. 设置GPIO引脚输出高低电瓶
	if(state != GPIO_RESET)
	{
		gpio->ODR |= state<<pin;	
	}
	else
	{
		gpio->ODR &= state<<pin;
	}
}

// 函数功能:gpio 引脚输出的状态
// 函数的参数: 
// 		gpio : 那组的GPIO引脚
// 		pin : 哪个引脚
// 函数的返回值: 
// 		引脚的输入状态
gpio_states_t hal_gpio_read(gpio_t *gpio, 
		unsigned int pin)
{

	return GPIO_RESET;
}

main.c

objectivec 复制代码
#include "gpio.h"
void delay(unsigned int a)
{
	while(a--);
}
int main()
{
	RCC_MP_AHB4ENSETR |= 1<<4;
	hal_gpio_init(GPIOE,10);
	while(1)
	{
		hal_gpio_write(GPIOE,10,GPIO_SET);
		delay(1000000);
		hal_gpio_write(GPIOE,10,GPIO_RESET);
		delay(1000000);
	}
	return 0;
}
相关推荐
caimouse1 小时前
ReactOS 窗口系统架构分析
服务器·c语言
caimouse1 小时前
ReactOS 图形系统分析(46):DC 工具 — dcutil.c
c语言·开发语言
BreezeJuvenile1 小时前
嵌入式C语言常见考察点(2)
c语言·嵌入式
caimouse2 小时前
ReactOS 图形系统分析(50):画笔子系统 — pen.c
c语言·开发语言·stm32
caimouse2 小时前
ReactOS 图形系统分析(48):弧线绘制 — arc.c
c语言·开发语言
cypking3 小时前
Objective-C 语法完整学习手册(小白自学 + 开发备查)
c语言·开发语言·学习·objective-c
wuyk55512 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
wp123_113 小时前
IPX8 防水 Type‑C连接器:安费诺 124018792112A 与 TONEVEE TY48087‑24A 技术梳理
c语言·开发语言
2401_8628808219 小时前
数据结构 --- 栈
c语言·数据结构·算法
额额额对了20 小时前
数据结构:二叉树
c语言·数据结构·算法