MINI2440 LED驱动的汇编语言实现

来源:互联网 发布:caffe 提取所有参数 编辑:程序博客网 时间:2024/06/05 06:09

     在学习ARM的过程中,一直只能看懂ARM的汇编程序,但是,真正自己动手写程序的时候,还真是不太容易,最近在看相关代码优化的问题时,才知道核心代码应该应用汇编来书写,因为用C语言来实现,很多时候优化得不太满足所需。
     同时,在进行系统移植或者启动程序的书写时,也都要应用汇编来编写代码,而同时这一块也是我个人所喜爱的一块,所以,这几天有点时间,重新学习ARM汇编,同时将会把以前所做过的实验的相关部分应用汇编来进行实现。
下面是一个最简单的驱动程序,开发板为MINI2440,开发环境为MDK3.8。源代码如下。


主函数部分,由于这个驱动程序比较简单,所以,主函数部分比较简单。

 

/******************************************************************************
*说明:本程序是一个简单的LED流水灯驱动程序。所以在此不再进行说明。
*
*
*PCU与接口配置:
*         CPU:S3C2440A
*         LED1:GPB5
*         LED2:GPB6
*         LED3:GPB7
*         LED4:GPB8
*内存运行地址:0x30000000
*
*
*作者:舒稳
*部门:长沙理工大学   计通学院   计算机07级04班
*最后修改时间:2010.7.6
*
*版权所有:2010.7.6------------                             soon
*
*
******************************************************************************/
  



/*测试主函数*/
int main(void)
{
 
      _my_led_test();
  
   return 0;
}

 

 

下面为LED的真正驱动部分

 

rGPBCON EQU 0x56000010
rGPBDAT EQU 0x56000014

    AREA MY_LED_TEST,CODE,READONLY
    CODE32
   
    EXPORT _my_led_test        ;声明函数为外部可引用函数
   
_my_led_test
    LDR R1,=rGPBCON
    MOV R2,#0x00015400
    STR R2,[R1]                ;设计rGPBCON个引脚的工作方式
   
    LDR R1,=rGPBDAT
    LDR R3,=data_lable
    MOV R5,R3                ;用于保存data_lable的首地址
    MOV R4,#4                ;用于循环计数
   
my_led_test_loop
    LDR R2,[R3],#4            ;以字为单位起数据,后变址寻址
    STR R2,[R1]                ;点亮相应的LED灯
   
    MOV R0,#0x00100000        ;将要进行延时的时间
    BL _delay_time            ;进行延时

    SUBS R4,#1
    MOVEQ R4,#4
    MOVEQ R3,R5                ;重新装载data_lable的首地址
    B my_led_test_loop
   
_delay_time
delay_time_loop
    SUBS R0,R0,#1
    BNE delay_time_loop
   
    MOV PC, LR
   
data_lable DCD 0x1C0,0x1A0,0x160,0x0E0    ;分别用于点亮相应的LED灯
   
    END

 

有需要源工程的朋友,请给在下发邮件,

QQEMAIL:   443120079@qq.com

   

 

 

原创粉丝点击