嘗試使用一下6410的匯編,發(fā)現(xiàn)跟當年的51差不多,一步一步的學習
?
;************************************************************************************************************* ;*?文件名: ok6410.s ;*?功能: S3C6410?匯編 ;*?作者: cp1300@139.com ;*?創(chuàng)建時間: 2013年1月4日21:27 ;*?最后修改時間:2013年1月4日 ;*?詳細: ;*************************************************************************************************************/ TINT_CSTAT EQU 0x7F006044 ;定時器中斷控制和狀態(tài)寄存器 VIC0ADDRESS EQU 0x71200F00 ;當前矢量地址寄存器0,寫入任意數(shù)據(jù)清除中斷 VIC1ADDRESS EQU 0x71300F00 ;當前矢量地址寄存器1,寫入任意數(shù)據(jù)清除中斷 ;調(diào)用外部函數(shù) IMPORT LED1_flash ;LED1閃爍程序 ;外部調(diào)用函數(shù) EXPORT Time_Isr ;時鐘中斷服務程序 PRESERVE8; AREA?S3C6410_CPU,?CODE,?READONLY ? ;定時器1中斷服務程序,注意:進入中斷后6410自動切換為IRQ模式,并關閉了IRQ中斷,退出的時候需要自己開啟,或者還原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,清除定時器1中斷 STR R1, [R0] ;回寫寄存器 BL LED1_flash ;調(diào)用LED閃爍程序 LDR R0, =VIC0ADDRESS ;寫VIC的當前中斷地址寄存器清除中斷 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恢復,也就是中斷屏蔽沒有去除,添加-S后,這條指令會影響CPSR中標志位,在這也就是恢復了SPSR_IRQ到CRSP SUBS PC, LR, #4 ;從中斷程序中退出,LR需要減4放入PC,子程序調(diào)用則不需要-4,應該是由于流水線的指令預取造成的 END
/************************************************************************************************************* ;*?文件名: ok6410.h ;*?功能: S3C6410?匯編函數(shù)定義 ;*?作者: cp1300@139.com ;*?創(chuàng)建時間: 2013年1月4日21:27 ;*?最后修改時間:2013年1月4日 ;*?詳細: ;*************************************************************************************************************/ #ifndef?S3C6410_H_ #define?S3C6410_H_ void?Time_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" void?LED1_flash(void); /************************************************************************************************************************* *函數(shù)???????? : void?Timer_Init(u32?RTime,FunctionalState?EnInt,void?(*TimerIsr)(void)) *功能???????? : 定時器1初始化函數(shù) *參數(shù)???????? : 無 *返回???????? : 無 *依賴????? :? 底層宏定義 *作者???????? : cp1300@139.com *時間????? : 20120520 *最后修改時間 : 20120520 *說明???????? : 定時器0和定時器1共用預分頻器 *************************************************************************************************************************/ void?Timer_Init(u32?RTime,FunctionalState?EnInt,void?(*TimerIsr)(void)) { rTCFG0?|=?65; //定時器0預分頻65+1,由PCLK=66提供時鐘,66分頻產(chǎn)生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 } //主函數(shù) int?main(void) { // u16?data; UART0_Init(DISABLE,115200); //初始化串口,失能中斷接收,波特率115200 LCD_Init(); //初始化LCD LED_Init(); //初始化LED Timer_Init(400000-1,ENABLE,Time_Isr); //初始化定時器1,周期400ms while(1); } //LED1閃爍程序,在定時器1中斷服務程序中閃爍,周期400MS void?LED1_flash(void) { LED1_FLASH(); }
?
?
?
?