汇编点灯
.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,=0X50006014LDR R1,[R0]ORR R1,R1,#(0x1<<10)STR R1,[R0]BL delay@灭LDR R0,=0X50006014LDR R1,[R0]BIC R1,R1,#(0x1<<10)STR R1,[R0]LDR R0,=0X50007014LDR R1,[R0]ORR R1,R1,#(0x1<<10) STR R1,[R0]BL delayLDR R0,=0X50007014LDR R1,[R0]BIC R1,R1,#(0x1<<10)STR R1,[R0]LDR R0,=0X50006014LDR R1,[R0]ORR R1,R1,#(0x1<<8) STR R1,[R0]BL delayLDR R0,=0X50006014LDR R1,[R0]BIC R1,R1,#(0x1<<8)STR R1,[R0]b loop@封装延时函数delay:LDR R4,=0X10000000
mm:cmp r4,#0subne r4,r4,#1bne mmmov 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<<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
#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;
}