OK6410匯編程序練習(xí)
嘗試使用一下6410的匯編,發(fā)現(xiàn)跟當(dāng)年的51差不多,一步一步的學(xué)習(xí)
;*************************************************************************************************************
;*文件名:ok6410.s
;*功能:S3C6410匯編
;*作者:cp1300@139.com
;*創(chuàng)建時(shí)間:2013年1月4日21:27
;*最后修改時(shí)間:2013年1月4日
;*詳細(xì):
;*************************************************************************************************************/
TINT_CSTATEQU0x7F006044;定時(shí)器中斷控制和狀態(tài)寄存器
VIC0ADDRESSEQU0x71200F00;當(dāng)前矢量地址寄存器0,寫入任意數(shù)據(jù)清除中斷
VIC1ADDRESSEQU0x71300F00;當(dāng)前矢量地址寄存器1,寫入任意數(shù)據(jù)清除中斷
;調(diào)用外部函數(shù)
IMPORTLED1_flash;LED1閃爍程序
;外部調(diào)用函數(shù)
EXPORTTime_Isr;時(shí)鐘中斷服務(wù)程序
PRESERVE8;
AREAS3C6410_CPU,CODE,READONLY
;定時(shí)器1中斷服務(wù)程序,注意:進(jìn)入中斷后6410自動(dòng)切換為IRQ模式,并關(guān)閉了IRQ中斷,退出的時(shí)候需要自己開啟,或者還原CPSR
Time_Isr
STMFDSP!,{R0,R1,LR};R0,R1,LR入棧
LDRR0,=TINT_CSTAT
LDRR1,[R0];讀取寄存器TINT_CSTAT
ORRR1,R1,#0x01<<6;寫B(tài)IT6,清除定時(shí)器1中斷
STRR1,[R0];回寫寄存器
BLLED1_flash;調(diào)用LED閃爍程序
LDRR0,=VIC0ADDRESS;寫VIC的當(dāng)前中斷地址寄存器清除中斷
LDRR1,=0xffffffff
STRR1,[R0]
LDRR0,=VIC1ADDRESS
STRR1,[R0]
LDMFDSP!,{R0,R1,LR};R0,R1,LR出棧
;之前使用SUB,發(fā)現(xiàn)程序從中斷退出后并沒有從SPSR恢復(fù),也就是中斷屏蔽沒有去除,添加-S后,這條指令會(huì)影響CPSR中標(biāo)志位,在這也就是恢復(fù)了SPSR_IRQ到CRSP
SUBSPC,LR,#4;從中斷程序中退出,LR需要減4放入PC,子程序調(diào)用則不需要-4,應(yīng)該是由于流水線的指令預(yù)取造成的
END
/*************************************************************************************************************
;*文件名:ok6410.h
;*功能:S3C6410匯編函數(shù)定義
;*作者:cp1300@139.com
;*創(chuàng)建時(shí)間:2013年1月4日21:27
;*最后修改時(shí)間:2013年1月4日
;*詳細(xì):
;*************************************************************************************************************/
#ifndefS3C6410_H_
#defineS3C6410_H_
voidTime_Isr(void);//定時(shí)器1中斷服務(wù)程序
#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);
/*************************************************************************************************************************
*函數(shù):voidTimer_Init(u32RTime,FunctionalStateEnInt,void(*TimerIsr)(void))
*功能:定時(shí)器1初始化函數(shù)
*參數(shù):無
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時(shí)間:20120520
*最后修改時(shí)間:20120520
*說明:定時(shí)器0和定時(shí)器1共用預(yù)分頻器
*************************************************************************************************************************/
voidTimer_Init(u32RTime,FunctionalStateEnInt,void(*TimerIsr)(void))
{
rTCFG0|=65;//定時(shí)器0預(yù)分頻65+1,由PCLK=66提供時(shí)鐘,66分頻產(chǎn)生1MHz的定時(shí)器時(shí)鐘,
rTCON&=(~0xff00);//清除設(shè)置
rTCON|=BIT11;//定時(shí)器1自動(dòng)更新使能
rTCNTB1=RTime;//重裝值
rTINT_CSTAT|=BIT6;//清除中斷標(biāo)志
rTINT_CSTAT|=(EnInt==ENABLE)?BIT1:0;//使能定時(shí)器0中斷
Set_IsrAddr(INT_TIMER1,(u32)TimerIsr);//設(shè)置中斷矢量入口
Set_IntEnable(INT_TIMER1,EnInt);//使能定時(shí)器1全局中斷
//以下操作啟動(dòng)定時(shí)器0
rTCON|=BIT9;//手動(dòng)更新
rTCON&=~BIT9;//結(jié)束手動(dòng)更新
rTCON|=BIT8;//啟動(dòng)定時(shí)器0
}
//主函數(shù)
intmain(void)
{
//u16data;
UART0_Init(DISABLE,11520