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;
}
相关推荐
SY师弟1 小时前
台湾TEMI协会竞赛——0、竞赛介绍及开发板介绍
c语言·单片机·嵌入式硬件·嵌入式·台湾temi协会
HUN金克斯1 小时前
C++/C函数
c语言·开发语言·c++
慢半拍iii1 小时前
数据结构——F/图
c语言·开发语言·数据结构·c++
m0_637146931 小时前
零基础入门 C 语言基础知识(含面试题):结构体、联合体、枚举、链表、环形队列、指针全解析!
c语言·开发语言·链表
weixin_461259413 小时前
[C]C语言日志系统宏技巧解析
java·服务器·c语言
whoarethenext6 小时前
使用 C/C++的OpenCV 实时播放火柴人爱心舞蹈动画
c语言·c++·opencv
能工智人小辰6 小时前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
iCxhust11 小时前
Prj10--8088单板机C语言8259测试(1)
c语言·开发语言
apocelipes16 小时前
Linux c 运行时获取动态库所在路径
linux·c语言·linux编程
int型码农17 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序