s5pv210 裸机之LED流水灯

1:LED流水灯原理图

从地板原理图看出GPJ0_3、GPJ0_4、GPJ0_5、PWMTOUT1输出为低电平则LED亮,所以首先要设置相应引脚为输出模式,在把输出值设置为0

则led亮,查核心板原理图找到相应的引脚,在搜索user_manul设置相应为即可;

2:s5pv210_LED流水灯之汇编代码,代码测试有效

/*
 *        s5pv210裸机实验
 *        
 *        LED流水灯
 *
 */
 
#define WTCON                0xE2700000
#define PS_HOLD_CONTROL      0xE010E81C
#define SVC_STACK            0xD0037D80

//LED相关寄存器
#define _GPJ0CON            0xE0200240
#define _GPJ0DAT            0xE0200244
#define _GPD0CON            0xE02000A0
#define _GPD0DAT            0xE02000A4
#define _GPJ0CON_EN         0x11111111    
#define LED_1_ON            ((0<<3) | (1<<4) | (1<<5))
#define LED_2_ON            ((1<<3) | (0<<4) | (1<<5))
#define LED_3_ON            ((1<<3) | (1<<4) | (0<<5))
#define LED_OFF             ((1<<3) | (1<<4) | (1<<5))

#define DELAY_TIME          10000000
 
    .global _start
_start:
    
    //第一步关看门狗
    ldr r0, =WTCON
    ldr r1, =0x0
    str r1, [r0]
    
    //第二步电源开关置锁,PS_HOLD_CONTROL寄存器中的0、8、9三位置1
    ldr r0, =PS_HOLD_CONTROL
    ldr r1, [r0]
    ldr r2, =0x301
    orr r1, r1, r2
    str r1, [r0]
 
    //设置svc模式下的栈
    ldr sp, =SVC_STACK
    
    //清bss
bss_clean:
    ldr r0, =bss_start            //把bss的起始地址读到r0中
    ldr r1, =bss_end            //把bss的结束地址读到r1中
    mov r2, #0x0                //把r2寄存器写入
    cmp r0, r1                    //对比r0 和r1 如果相等则跳转到led_blink
    beq led_blink
bss_clean_loop:
    str r2, [r0], #4            //不等则把r0地址写入0,r0 + 4
    cmp r0, r1                    //判断r0 r1是否相等 不相等跳转到bss_clean_loop循环
    bne bss_clean_loop
    
    
    
led_blink:    
    //_GPJ0CON设置为输出模式
    ldr r0, =_GPJ0CON            
    ldr r1, =_GPJ0CON_EN
    str r1, [r0]
    
    //_GPD0CON的GPD0_1设置为0001输出模式
    ldr r0, =_GPD0CON
    ldr r1, [r0]
    bic r1, r1, #(0xF<<4)
    orr r1, r1, #(0x1<<4)
    str r1, [r0]
    
led_flash:
    //因为LED4初始m默认是亮的所以先关闭LED4
    ldr r0, =_GPD0DAT
    ldr r1, [r0]
    orr r1, r1, #(0x1<<1)    
    str r1, [r0]

    //流水灯LED1 亮
    ldr r0, =_GPJ0DAT
    ldr r1, =LED_1_ON
    str r1, [r0]
    
    //delay
    bl delay
    
    //流水灯LED2 亮
    ldr r0, =_GPJ0DAT
    ldr r1, =LED_2_ON
    str r1, [r0]
    
    //delay
    bl delay
    
    //流水灯LED3 亮
    ldr r0, =_GPJ0DAT
    ldr r1, =LED_3_ON
    str r1, [r0]
    
    //delay
    bl delay
    
    //全部暗
    ldr r0, =_GPJ0DAT
    ldr r1, =LED_OFF
    str r1, [r0]
    
    //流水灯LED4 亮
    ldr r0, =_GPD0DAT
    ldr r1, [r0]
    bic r1, r1, #(0x1<<1)    
    str r1, [r0]
    
    //delay
    bl delay
    
    b led_flash
    
    
    
    
    
    
    //设置死循环放置跑飞
    b .
    
delay:
    ldr r0, =DELAY_TIME
    mov r1, #0x0
delay_loop:
    subne r0, r0, #1
    cmp r0, r1
    bne delay_loop
    mov pc, lr
    

 

3:s5pv210_LED流水灯之C代码,代码测试有效。

/*
 *        s5pv210裸机实验
 *        
 *        LED流水灯
 *
 */

#include "all.h"
 
#define _REG_GPJ0CON            *((unsigned int*)0xE0200240)
#define _REG_GPJ0DAT            *((unsigned int*)0xE0200244)
#define _REG_GPD0CON            *((unsigned int*)0xE02000A0)
#define _REG_GPD0DAT            *((unsigned int*)0xE02000A4)

//void delay(void);

void led_blink(void)
{
    //GPJ03、4、5设置为output模式
    
    _REG_GPJ0CON = 0x11111111;
    
    //GPD0 1设置为输出模式
    _REG_GPD0CON &= ~(0xF << 4);
    _REG_GPD0CON |= (0x1 << 4);
    
    while (1) {
        
        //led4 暗
        _REG_GPD0DAT |= (1<<1);        ////GPJ03、4、5输出低电平为亮
        //led1 亮
        _REG_GPJ0DAT = ((0<<3) | (1<<4) | (1<<5));                       
        
        //延时
        delay();
        
        //led2 亮
        _REG_GPJ0DAT = ((1<<3) | (0<<4) | (1<<5));
        
        //延时
        delay();
        
        //led3 亮
        _REG_GPJ0DAT = ((1<<3) | (1<<4) | (0<<5));
        
        //延时
        delay();
        //关 1 2 3
        _REG_GPJ0DAT = ((1<<3) | (1<<4) | (1<<5));
        //led4 亮
        _REG_GPD0DAT &= ~(1<<1);        ////延时
        delay();
        
        
        
    }    
}

 

posted @ 2017-01-23 14:39  biaohc  阅读(802)  评论(0编辑  收藏  举报