#define WTDCON 0xE2700000
#define SVC_STACK 0xD0037D80
.global _start
_start:
ldr r0, =WTDCON //watchdog timer 控制寄存器地址写入r0寄存器
ldr r1, =0x0 //赋值0
str r1, [r0] //寻址,写0关闭watchdog
ldr sp, = SVC_STACK //设置c调用栈地址
bl led_blink
b . //死循环
//c源程序
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
#define rGPJ0CON *((volatile unsigned int *)GPJ0CON) //通过宏定义寄存器内存地址所代表的值
#define rGPJ0DAT *((volatile unsigned int *)GPJ0DAT)
void wait1s(void);
void led_blink(){
rGPJ0CON = 0x11111111;
while(1){
rGPJ0DAT = ((0<<3)|(0<<4)|(0<<5)); //3,4,5位写0
wait1s();
rGPJ0DAT = ((1<<3)|(1<<4)|(1<<5)); //3,4,5位写1
wait1s();
}
}
void wait1s(void){
volatile unsigned int i = 10000000;
while(i--); //循环至0结束
}
本文介绍了一个简单的ARM嵌入式系统程序,该程序实现了通过控制GPIO口使LED灯进行周期性的亮灭切换。首先,程序通过寄存器配置关闭了看门狗定时器,并设置了C语言调用栈的地址;接着,在C源程序中,通过宏定义对GPIO寄存器进行内存映射,从而控制GPJ0口的第3、4、5引脚状态,实现LED灯的闪烁。
3224

被折叠的 条评论
为什么被折叠?



