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)程序從中斷退出后并沒(méi)有從SPSR恢復(fù),也就是中斷屏蔽沒(méi)有去除,添加-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ù)???????? : 無(wú) *返回???????? : 無(wú) *依賴????? :? 底層宏定義 *作者???????? : cp1300@139.com *時(shí)間????? : 20120520 *最后修改時(shí)間 : 20120520 *說(shuō)明???????? : 定時(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(); }
?
?
?
?