XSBASE 270-S_裸机程序_流水灯

开发板与平台:XSBASE 270-S、PXA270

裸机程序:流水灯

编译环境:ads 1.20

调试方法:直接用工具烧至片内norflash的0x0地址

 

一:分析

         由图1可知,点亮led需要激活led的片选信号LED_CS4,BD0-BD7决定了8个led灯的亮灭。由图2可知,led的片选地址为CS4+0x500000,在cpu手册上可以知道CS4的基址是0x10000000,所以led的片选地址为0x10500000。由图3和图4可知,CS4的片选信号由GPIO80的决定的,需要把GPIO80置成输出-功能复用2。

         由图5可知,把GPIO80置成输出-功能复用2需要配置GPSR2、GPDR2、GAFR2_U三个寄存器。具体寄存器的设置看下cpu手册就清楚了。

图1:

 

图2:

图3:

图4:

图5:

二:程序代码

 1     area boot, code, readonly
 2     entry
 3     
 4 GPSR2      equ        0x40e00020
 5 GPDR2      equ        0x40e00014
 6 GAFR2_U    equ        0x40e00068
 7 LED_CS     equ        0x10500000
 8     
 9     ldr        r8,    =0x1
10     
11     ;把GPIO80置成输出高电平
12     ldr        r0,    =GPSR2
13     ldr        r1,    [r0]
14     orr        r1,    r1,    r8,    lsl #16
15     str        r1,    [r0]
16     
17     ; 把GPIO80置成输出
18     ldr        r0,    =GPDR2
19     ldr        r1,    [r0]
20     orr        r1,    r1,    r8,    lsl    #16
21     str        r1,    [r0]
22     
23     ;把GPIO置成功能复用2
24     ldr        r0,    =GAFR2_U
25     ldr        r1,    [r0]
26     bic        r1,    r1,    r8,    lsl #0
27     orr        r1,    r1,    r8,    lsl #1
28     str        r1,    [r0]
29     
30     ;灭掉所有led灯
31     ldr        r0,    =LED_CS
32     ldr        r1,    =0xff
33     str        r1,    [r0]
34     
35     ;循环点亮led
36 led
37     ldr        r9, =0x0
38 1
39     bic        r1,    r1,    r8, lsl r9
40     str        r1,    [r0]
41     bl         delay
42     
43     orr        r1,    r1,    r8, lsl r9
44     str        r1,    [r0]
45         
46     add        r9,    r9,    #0x1
47     cmp        r9,    #0x8
48     bne        %b1
49     b          led    
50     
51     ;延时函数
52 delay
53     ldr        r10,   =0xfffff
54 2
55     sub        r10,   r10, #0x1
56     cmp        r10,   #0x0
57     bne        %b2
58     mov        pc,    lr
59     
60     end

转载于:https://www.cnblogs.com/ziqiuqiandao/archive/2012/07/12/2588821.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pxa270_LED,驱动,测试程序 #include <stdio.h> #include <fcntl.h> #define MOTOR_Forward 0x1 #define MOTOR_Reverse 0x2 #define MOTOR_SetSpeed 0x3 #define MOTOR_GetSpeed 0x4 #define MOTOR_STOP 0x5 #define DEC_Forward 0x6 #define DEC_Reverse 0x7 #define stmotor_dev "/dev/xsb_edr_step" int main_menu(void){ int key; printf("\n\n"); printf("********** MOTOR test menu **********\n"); printf("* 1. MOTOR Forward *\n"); printf("* 2. MOTOR Reverse *\n"); printf("* 3. MOTOR Set Speed *\n"); printf("* 4. MOTOR Get Speed *\n"); printf("* 5. MOTOR STOP *\n"); printf("* 6. DEC Forward *\n"); printf("* 7. DEC Reverse *\n"); //printf("* 8. *\n"); //printf("* 9. *\n"); printf("* 0. Exit Program *\n"); printf("********************************\n"); printf("\n\n"); printf("select the command number : "); scanf("%d",&key); return key; } void wait_for(int count) { int i,j; for(i=0; i<count; i++) for(j=0; j<1000; j++); } main(int ac, char *av[]){ int key, dev; int speed=600; int i=0; int count; int j=5; dev = open(stmotor_dev, O_RDWR ); if ( dev < 0) { fprintf(stderr, "cannot open ST_MOTOR (%d)", dev); exit(2); } /* while((key = main_menu()) != 0){ switch(key){ case 1: printf("\t MOTOR Forward \n"); ioctl(dev, MOTOR_Forward, 0); break; case 2: printf("\t MOTOR Reverse \n"); ioctl(dev, MOTOR_Reverse, 0); break; case 3: printf("\t MOTOR Speed Up \n"); ioctl(dev, MOTOR_SetSpeed, 0); break; case 4: printf("\t MOTOR Speed Down \n"); ioctl(dev, MOTOR_GetSpeed, 0); break; case 5: printf("\t MOTOR Stop \n"); ioctl(dev, MOTOR_STOP, 0); break; case 6: printf("\t DEC Forward \n"); ioctl(dev, DEC_Forward, 0); break; case 7: printf("\t DEC Reverse \n"); ioctl(dev, DEC_Reverse, 0); break; default: printf("\t Unknow command... \n"); //close(dev); printf("Close program\n"); exit(2); break; } } */ while(1) { count=100; for(; count>0; count--) ioctl(dev, MOTOR_Forward, speed); wait_for(100); count=100; for(; count>0; count--) ioctl(dev, MOTOR_Reverse, speed); ioctl(dev, DEC_Reverse, speed); wait_for(150); count=100; for(; count>0; count--) ioctl(dev, MOTOR_Reverse, speed); wait_for(100); count=100; for(; count>0; count--); ioctl(dev, DEC_Forward, speed); wait_for(150); i++; speed += 10*i; if (speed>1600) {speed=800; i=0;} } ioctl(dev,5,0); } /* EOF */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值