OK6410汇编程序练习

来源:互联网 发布:软件使用手册标准 编辑:程序博客网 时间:2024/05/16 11:58

尝试使用一下6410的汇编,发现跟当年的51差不多,一步一步的学习

 

;*************************************************************************************************************;* 文件名:ok6410.s;* 功能:S3C6410 汇编;* 作者:cp1300@139.com;* 创建时间:2013年1月4日21:27;* 最后修改时间:2013年1月4日;* 详细:;*************************************************************************************************************/TINT_CSTATEQU0x7F006044;定时器中断控制和状态寄存器VIC0ADDRESSEQU0x71200F00;当前矢量地址寄存器0,写入任意数据清除中断VIC1ADDRESSEQU0x71300F00;当前矢量地址寄存器1,写入任意数据清除中断;调用外部函数IMPORTLED1_flash;LED1闪烁程序;外部调用函数EXPORTTime_Isr;时钟中断服务程序PRESERVE8;AREA S3C6410_CPU, CODE, READONLY ;定时器1中断服务程序,注意:进入中断后6410自动切换为IRQ模式,并关闭了IRQ中断,退出的时候需要自己开启,或者还原CPSRTime_IsrSTMFDSP!,{R0,R1,LR};R0,R1,LR入栈LDRR0,=TINT_CSTATLDRR1,[R0];读取寄存器 TINT_CSTATORRR1,R1,#0x01<<6;写BIT6,清除定时器1中断STRR1,[R0];回写寄存器BLLED1_flash;调用LED闪烁程序LDRR0,=VIC0ADDRESS;写VIC的当前中断地址寄存器清除中断LDRR1,=0xffffffffSTRR1,[R0]LDRR0,=VIC1ADDRESSSTRR1,[R0]LDMFDSP!,{R0,R1,LR};R0,R1,LR出栈;之前使用SUB,发现程序从中断退出后并没有从SPSR恢复,也就是中断屏蔽没有去除,添加-S后,这条指令会影响CPSR中标志位,在这也就是恢复了SPSR_IRQ到CRSPSUBSPC,LR,#4;从中断程序中退出,LR需要减4放入PC,子程序调用则不需要-4,应该是由于流水线的指令预取造成的END
/*************************************************************************************************************;* 文件名:ok6410.h;* 功能:S3C6410 汇编函数定义;* 作者:cp1300@139.com;* 创建时间: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);/**************************************************************************************************************************函数        :void Timer_Init(u32 RTime,FunctionalState EnInt,void (*TimerIsr)(void))*功能        :定时器1初始化函数*参数        :无*返回        :无*依赖     : 底层宏定义*作者        :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分频产生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全局中断//以下操作启动定时器0rTCON |= BIT9;//手动更新rTCON &= ~BIT9;//结束手动更新rTCON |= BIT8;//启动定时器0}//主函数int main(void){//u16 data;UART0_Init(DISABLE,115200);//初始化串口,失能中断接收,波特率115200LCD_Init();//初始化LCDLED_Init();//初始化LEDTimer_Init(400000-1,ENABLE,Time_Isr);//初始化定时器1,周期400mswhile(1);}//LED1闪烁程序,在定时器1中断服务程序中闪烁,周期400MSvoid LED1_flash(void){LED1_FLASH();}


 


 

 

 

原创粉丝点击