嘗試使用一下6410的匯編,發(fā)現(xiàn)跟當年的51差不多,一步一步的學習
;*************************************************************************************************************
;*文件名:ok6410.s
;*功能:S3C6410匯編
;*作者:cp1300@139.com
;*創(chuàng)建時間:2013年1月4日21:27
;*最后修改時間:2013年1月4日
;*詳細:
;*************************************************************************************************************/
TINT_CSTATEQU0x7F006044;定時器中斷控制和狀態(tài)寄存器
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;寫B(tài)IT6,清除定時器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,發(fā)現(xiàn)程序從中斷退出后并沒有從SPSR恢復,也就是中斷屏蔽沒有去除,添加-S后,這條指令會影響CPSR中標志位,在這也就是恢復了SPSR_IRQ到CRSP
SUBSPC,LR,#4;從中斷程序中退出,LR需要減4放入PC,子程序調用則不需要-4,應該是由于流水線的指令預取造成的
END
/*************************************************************************************************************
;*文件名:ok6410.h
;*功能:S3C6410匯編函數定義
;*作者:cp1300@139.com
;*創(chuàng)建時間: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





