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;
}
相关推荐
Peter_Deng.2 小时前
Linux 下基于 TCP 的 C 语言客户端/服务器通信详解(三个示例逐步进阶)
服务器·c语言·网络
John.Lewis5 小时前
数据结构初阶(13)排序算法-选择排序(选择排序、堆排序)(动图演示)
c语言·数据结构·排序算法
丑小鸭是白天鹅8 小时前
嵌入式C语言学习笔记之枚举、联合体
c语言·笔记·学习
GUET_一路向前8 小时前
【C语言防御性编程】if条件常量在前,变量在后
c语言·开发语言·if-else·防御性编程
pusue_the_sun9 小时前
数据结构——栈和队列oj练习
c语言·数据结构·算法··队列
Dontla10 小时前
Makefile介绍(Makefile教程)(C/C++编译构建、自动化构建工具)
c语言·c++·自动化
奶黄小甜包10 小时前
C语言零基础第18讲:自定义类型—结构体
c语言·数据结构·笔记·学习
一支闲人10 小时前
C语言相关简单数据结构:双向链表
c语言·数据结构·链表·基础知识·适用于新手小白
John.Lewis11 小时前
数据结构初阶(19)外排序·文件归并排序的实现
c语言·数据结构·排序算法
John.Lewis11 小时前
数据结构初阶(16)排序算法——归并排序
c语言·数据结构·排序算法