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_CSTAT EQU 0x7F006044 ;定時(shí)器中斷控制和狀態(tài)寄存器
VIC0ADDRESS EQU 0x71200F00 ;當(dāng)前矢量地址寄存器0,寫入任意數(shù)據(jù)清除中斷
VIC1ADDRESS EQU 0x71300F00 ;當(dāng)前矢量地址寄存器1,寫入任意數(shù)據(jù)清除中斷
;調(diào)用外部函數(shù)
IMPORT LED1_flash ;LED1閃爍程序
;外部調(diào)用函數(shù)
EXPORT Time_Isr ;時(shí)鐘中斷服務(wù)程序
PRESERVE8;
AREA?S3C6410_CPU,?CODE,?READONLY ?
;定時(shí)器1中斷服務(wù)程序,注意:進(jìn)入中斷后6410自動(dòng)切換為IRQ模式,并關(guān)閉了IRQ中斷,退出的時(shí)候需要自己開啟,或者還原CPSR
Time_Isr
STMFD SP!, {R0,R1,LR} ;R0,R1,LR入棧
LDR R0, =TINT_CSTAT
LDR R1, [R0] ;讀取寄存器?TINT_CSTAT
ORR R1, R1, #0x01<<6 ;寫B(tài)IT6,清除定時(shí)器1中斷
STR R1, [R0] ;回寫寄存器
BL LED1_flash ;調(diào)用LED閃爍程序
LDR R0, =VIC0ADDRESS ;寫VIC的當(dāng)前中斷地址寄存器清除中斷
LDR R1, =0xffffffff
STR R1, [R0]
LDR R0, =VIC1ADDRESS
STR R1, [R0]
LDMFD SP!, {R0,R1,LR} ;R0,R1,LR出棧
;之前使用SUB,發(fā)現(xiàn)程序從中斷退出后并沒有從SPSR恢復(fù),也就是中斷屏蔽沒有去除,添加-S后,這條指令會(huì)影響CPSR中標(biāo)志位,在這也就是恢復(fù)了SPSR_IRQ到CRSP
SUBS PC, 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ì): ;*************************************************************************************************************/ #ifndef?S3C6410_H_ #define?S3C6410_H_ void?Time_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"
void?LED1_flash(void);
/*************************************************************************************************************************
*函數(shù)???????? : void?Timer_Init(u32?RTime,FunctionalState?EnInt,void?(*TimerIsr)(void))
*功能???????? : 定時(shí)器1初始化函數(shù)
*參數(shù)???????? : 無
*返回???????? : 無
*依賴????? :? 底層宏定義
*作者???????? : cp1300@139.com
*時(shí)間????? : 20120520
*最后修改時(shí)間 : 20120520
*說明???????? : 定時(shí)器0和定時(shí)器1共用預(yù)分頻器
*************************************************************************************************************************/
void?Timer_Init(u32?RTime,FunctionalState?EnInt,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ù)
int?main(void)
{
// u16?data;
UART0_Init(DISABLE,115200); //初始化串口,失能中斷接收,波特率115200
LCD_Init(); //初始化LCD
LED_Init(); //初始化LED
Timer_Init(400000-1,ENABLE,Time_Isr); //初始化定時(shí)器1,周期400ms
while(1);
}
//LED1閃爍程序,在定時(shí)器1中斷服務(wù)程序中閃爍,周期400MS
void?LED1_flash(void)
{
LED1_FLASH();
}
?
?
?
?





