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

#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

#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<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<ODR &= state<

main.c

#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;
}

你可能感兴趣的:(ARM,arm,c语言)