在学习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