do_irq.c
extern void printf(const char *fmt, ...);
unsigned int i = 0;
#include"gpio.h"
void gpioe()
{
GPIO_X=GPIO_X|(0x1<<4);
}
void moder()
{
GPIOE.MODER=0x50006000;
GPIOE.MODER=GPIOE.MODER&(~(0x3<<20));
GPIOE.MODER=GPIOE.MODER|(0x3<<20);
GPIOE.MODER=GPIOE.MODER&(~(0x3<<16));
GPIOE.MODER=GPIOE.MODER|(0x3<<16);
GPIOE.MODER=0x50007000;
GPIOE.MODER=GPIOE.MODER&(~(0x3<<20));
GPIOE.MODER=GPIOE.MODER|(0x3<<20);
}
void otyper()
{
GPIOE.OTYPER=0x50006004;
GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));
GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<8));
GPIOE.OTYPER=0x50007004;
GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));
}
void ospeedr()
{
GPIOE.OSPEEDR=0x50006008;
GPIOE.OSPEEDR=GPIOE.OSPEEDR&(~(0x3<<20));
GPIOE.OSPEEDR=GPIOE.OSPEEDR&(~(0x3<<16));
GPIOE.OSPEEDR=0x50007008;
GPIOE.OSPEEDR=GPIOE.OSPEEDR&(~(0x3<<20));
}
void pupdr()
{
GPIOE.PUPDR=0x5000600c;
GPIOE.PUPDR=GPIOE.PUPDR&(~(0x3<<20));
GPIOE.PUPDR=GPIOE.PUPDR&(~(0x3<<16));
GPIOE.PUPDR=0x5000700c;
GPIOE.PUPDR=GPIOE.PUPDR&(~(0x3<<20));
}
void led_off()
{
GPIOE.OTYPER=0x50006014;
GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));
GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<8));
GPIOE.OTYPER=0x50007014;
GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));
}
void led_on()
{
GPIOE.OTYPER=0x50006014;
GPIOE.OTYPER=GPIOE.OTYPER&(0x1<<10);
GPIOE.OTYPER=GPIOE.OTYPER&(0x1<<8);
GPIOE.OTYPER=0x50007014;
GPIOE.OTYPER=GPIOE.OTYPER&(0x1<<10);
}
main.c
ubuntu@ubuntu:02-led-c$ vi main.c
ubuntu@ubuntu:02-led-c$ cat main.c
#include "gpio.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
void gpioe();//设置GPIOE组时钟使能 通过RCC_AHB4ENSETR寄存器设置
void moder(); //通过GPIOE_MODER寄存器设置PE10引脚为输出模式
void otyper(); //通过GPIOE_OTYPER设置PE10引脚为推挽输出模式
void ospeedr(); //通过GPIOE_OSPEEDR设置PE10引脚为低速输出
void pupdr(); // 通过GPIOE_PUPDR设置PE10引脚禁止上下拉电阻
while(1)
{
led_off(); //通过GPIOE_ODR设置PE10引脚输出高电平
delay_ms(500);
led_on();//通过GPIOE_ODR设置PE10引脚输出低电平
delay_ms(500);
}
return 0;
}
arm.s
.text
.global _start
_start:
/**********LED1点灯**************/
/*********RCC章节****************/
@1.设置GPIOE组时钟使能 通过RCC_AHB4ENSETR寄存器设置0x50000A28[4]=1
ldr r0,=0x50000A28
ldr r1,[r0]
orr r1,#(0x1<<4)
str r1,[r0]
/**********GPIO章节***************/
@设置LED1 LED2 LED3 对于的寄存器为输出模式
ldr r0,=0x50006000
ldr r1,[r0]
and r1,#(~(0x3<<20))
orr r1,#(0x1<<20)
str r1,[r0]
ldr r0,=0x50007000
ldr r1,[r0]
and r1,#(~(0x3<<20))
orr r1,#(0x1<<20)
str r1,[r0]
ldr r0,=0x50006000
ldr r1,[r0]
and r1,#(~(0x3<<16))
orr r1,#(0x1<<16)
str r1,[r0]
@设置LED1 LED2 LED3 对于的寄存器为推挽输出模式
ldr r0,=0x50006004
ldr r1,[r0]
and r1,#(~(0x1<<10))
str r1,[r0]
ldr r0,=0x50007004
ldr r1,[r0]
and r1,#(~(0x1<<10))
str r1,[r0]
ldr r0,=0x50006004
ldr r1,[r0]
and r1,#(~(0x1<<8))
str r1,[r0]
@设置LED1 LED2 LED3 对于的寄存器为低速输出模式
ldr r0,=0x50006008
ldr r1,[r0]
and r1,#(~(0x3<<20))
str r1,[r0]
ldr r0,=0x50007008
ldr r1,[r0]
and r1,#(~(0x3<<20))
str r1,[r0]
ldr r0,=0x50006008
ldr r1,[r0]
and r1,#(~(0x3<<16))
str r1,[r0]
@设置LED1 LED2 LED3 对于的寄存器为低速输出模式
ldr r0,=0x5000600c
ldr r1,[r0]
and r1,#(~(0x3<<20))
str r1,[r0]
ldr r0,=0x5000700c
ldr r1,[r0]
and r1,#(~(0x3<<20))
str r1,[r0]
ldr r0,=0x5000600c
ldr r1,[r0]
and r1,#(~(0x3<<16))
str r1,[r0]
loop:
bl LED1_OFF
bl delay_1s
bl LED1_ON
bl delay_1s
b loop
LED1_ON:
ldr r0,=0x50006014
ldr r1,[r0]
orr r1,#(0x1<<10)
str r1,[r0]
ldr r0,=0x50007014
ldr r1,[r0]
orr r1,#(0x1<<10)
str r1,[r0]
ldr r0,=0x50006014
ldr r1,[r0]
orr r1,#(0x1<<8)
str r1,[r0]
mov pc,lr
LED1_OFF:
ldr r0,=0x50006014
ldr r1,[r0]
and r1,#(~(0x1<<10))
str r1,[r0]
ldr r0,=0x50007014
ldr r1,[r0]
and r1,#(~(0x1<<10))
str r1,[r0]
ldr r0,=0x50006014
ldr r1,[r0]
and r1,#(~(0x1<<8))
str r1,[r0]
mov pc,lr
@ 大概1s的延时函数
delay_1s:
mov r3, #0x10000000
mm:
cmp r3, #0
subne r3, r3, #1
bne mm
mov pc, lr
.end