汇编点灯
.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;
}