OK6410汇编程序练习
扫描二维码
随时随地手机看文章
尝试使用一下6410的汇编,发现跟当年的51差不多,一步一步的学习
;*************************************************************************************************************
;*文件名:ok6410.s
;*功能:S3C6410汇编
;*作者:cp1300@139.com
;*创建时间:2013年1月4日21:27
;*最后修改时间:2013年1月4日
;*详细:
;*************************************************************************************************************/
TINT_CSTATEQU0x7F006044;定时器中断控制和状态寄存器
VIC0ADDRESSEQU0x71200F00;当前矢量地址寄存器0,写入任意数据清除中断
VIC1ADDRESSEQU0x71300F00;当前矢量地址寄存器1,写入任意数据清除中断
;调用外部函数
IMPORTLED1_flash;LED1闪烁程序
;外部调用函数
EXPORTTime_Isr;时钟中断服务程序
PRESERVE8;
AREAS3C6410_CPU,CODE,READONLY
;定时器1中断服务程序,注意:进入中断后6410自动切换为IRQ模式,并关闭了IRQ中断,退出的时候需要自己开启,或者还原CPSR
Time_Isr
STMFDSP!,{R0,R1,LR};R0,R1,LR入栈
LDRR0,=TINT_CSTAT
LDRR1,[R0];读取寄存器TINT_CSTAT
ORRR1,R1,#0x01<<6;写BIT6,清除定时器1中断
STRR1,[R0];回写寄存器
BLLED1_flash;调用LED闪烁程序
LDRR0,=VIC0ADDRESS;写VIC的当前中断地址寄存器清除中断
LDRR1,=0xffffffff
STRR1,[R0]
LDRR0,=VIC1ADDRESS
STRR1,[R0]
LDMFDSP!,{R0,R1,LR};R0,R1,LR出栈
;之前使用SUB,发现程序从中断退出后并没有从SPSR恢复,也就是中断屏蔽没有去除,添加-S后,这条指令会影响CPSR中标志位,在这也就是恢复了SPSR_IRQ到CRSP
SUBSPC,LR,#4;从中断程序中退出,LR需要减4放入PC,子程序调用则不需要-4,应该是由于流水线的指令预取造成的
END
/*************************************************************************************************************
;*文件名:ok6410.h
;*功能:S3C6410汇编函数定义
;*作者:cp1300@139.com
;*创建时间:2013年1月4日21:27
;*最后修改时间:2013年1月4日
;*详细:
;*************************************************************************************************************/
#ifndefS3C6410_H_
#defineS3C6410_H_
voidTime_Isr(void);//定时器1中断服务程序
#endif/*S3C6410_H_*/
#include"system.h"
#include"uart.h"
#include"tft_lcd.h"
#include"other.h"
#include"delay.h"
#include"timer.h"
#include"s3c6410.h"
voidLED1_flash(void);
/*************************************************************************************************************************
*函数:voidTimer_Init(u32RTime,FunctionalStateEnInt,void(*TimerIsr)(void))
*功能:定时器1初始化函数
*参数:无
*返回:无
*依赖:底层宏定义
*作者:cp1300@139.com
*时间:20120520
*最后修改时间:20120520
*说明:定时器0和定时器1共用预分频器
*************************************************************************************************************************/
voidTimer_Init(u32RTime,FunctionalStateEnInt,void(*TimerIsr)(void))
{
rTCFG0|=65;//定时器0预分频65+1,由PCLK=66提供时钟,66分频产生1MHz的定时器时钟,
rTCON&=(~0xff00);//清除设置
rTCON|=BIT11;//定时器1自动更新使能
rTCNTB1=RTime;//重装值
rTINT_CSTAT|=BIT6;//清除中断标志
rTINT_CSTAT|=(EnInt==ENABLE)?BIT1:0;//使能定时器0中断
Set_IsrAddr(INT_TIMER1,(u32)TimerIsr);//设置中断矢量入口
Set_IntEnable(INT_TIMER1,EnInt);//使能定时器1全局中断
//以下操作启动定时器0
rTCON|=BIT9;//手动更新
rTCON&=~BIT9;//结束手动更新
rTCON|=BIT8;//启动定时器0
}
//主函数
intmain(void)
{
//u16data;
UART0_Init(DISABLE,11520