×
单片机 > 单片机程序设计 > 详情

OK6410汇编程序练习

发布时间:2020-06-16 发布时间:
|

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

 

  1. ;*************************************************************************************************************  

  2. ;* 文件名: ok6410.s  

  3. ;* 功能:      S3C6410 汇编  

  4. ;* 作者:      cp1300@139.com  

  5. ;* 创建时间:    2013年1月4日21:27  

  6. ;* 最后修改时间:2013年1月4日  

  7. ;* 详细:        

  8. ;*************************************************************************************************************/  

  9.   

  10. TINT_CSTAT      EQU     0x7F006044      ;定时器中断控制和状态寄存器  

  11. VIC0ADDRESS     EQU     0x71200F00      ;当前矢量地址寄存器0,写入任意数据清除中断  

  12. VIC1ADDRESS     EQU     0x71300F00      ;当前矢量地址寄存器1,写入任意数据清除中断  

  13.   

  14. ;调用外部函数  

  15.     IMPORT      LED1_flash              ;LED1闪烁程序  

  16.       

  17. ;外部调用函数  

  18.     EXPORT      Time_Isr                ;时钟中断服务程序  

  19.       

  20.       

  21.       

  22.     PRESERVE8;  

  23.     AREA S3C6410_CPU, CODE, READONLY       

  24.   

  25. ;定时器1中断服务程序,注意:进入中断后6410自动切换为IRQ模式,并关闭了IRQ中断,退出的时候需要自己开启,或者还原CPSR     

  26. Time_Isr  

  27.     STMFD   SP!,    {R0,R1,LR}              ;R0,R1,LR入栈  

  28.       

  29.     LDR     R0,     =TINT_CSTAT           

  30.     LDR     R1,     [R0]                    ;读取寄存器 TINT_CSTAT  

  31.     ORR     R1,     R1,     #0x01<<6      ;写BIT6,清除定时器1中断  

  32.     STR     R1,     [R0]                    ;回写寄存器  

  33.       

  34.     BL      LED1_flash                      ;调用LED闪烁程序  

  35.       

  36.     LDR     R0,     =VIC0ADDRESS            ;写VIC的当前中断地址寄存器清除中断  

  37.     LDR     R1,     =0xffffffff  

  38.     STR     R1,     [R0]  

  39.     LDR     R0,     =VIC1ADDRESS  

  40.     STR     R1,     [R0]      

  41.       

  42.     LDMFD   SP!,    {R0,R1,LR}              ;R0,R1,LR出栈  

  43.       

  44.     ;之前使用SUB,发现程序从中断退出后并没有从SPSR恢复,也就是中断屏蔽没有去除,添加-S后,这条指令会影响CPSR中标志位,在这也就是恢复了SPSR_IRQ到CRSP  

  45.     SUBS    PC,     LR,     #4              ;从中断程序中退出,LR需要减4放入PC,子程序调用则不需要-4,应该是由于流水线的指令预取造成的  

  46.       

  47.   

  48.   

  49.   

  50.     END  

  51.       

  52.       

  53.       


  1. /************************************************************************************************************* 

  2. ;* 文件名: ok6410.h 

  3. ;* 功能:      S3C6410 汇编函数定义 

  4. ;* 作者:      cp1300@139.com 

  5. ;* 创建时间:    2013年1月4日21:27 

  6. ;* 最后修改时间:2013年1月4日 

  7. ;* 详细:       

  8. ;*************************************************************************************************************/  

  9.   

  10. #ifndef S3C6410_H_  

  11. #define S3C6410_H_  

  12.   

  13.   

  14. void Time_Isr(void);    //定时器1中断服务程序  

  15.   

  16. #endif /*S3C6410_H_*/  


 


  1. #include "system.h"  

  2. #include "uart.h"  

  3. #include "tft_lcd.h"  

  4. #include "other.h"  

  5. #include "delay.h"  

  6. #include "timer.h"  

  7. #include "s3c6410.h"  

  8.   

  9. void LED1_flash(void);  

  10.   

  11. /************************************************************************************************************************* 

  12. *函数         :   void Timer_Init(u32 RTime,FunctionalState EnInt,void (*TimerIsr)(void)) 

  13. *功能         :   定时器1初始化函数 

  14. *参数         :   无 

  15. *返回         :   无 

  16. *依赖         :   底层宏定义 

  17. *作者         :   cp1300@139.com 

  18. *时间         :   20120520 

  19. *最后修改时间 :   20120520 

  20. *说明         :   定时器0和定时器1共用预分频器 

  21. *************************************************************************************************************************/  

  22. void Timer_Init(u32 RTime,FunctionalState EnInt,void (*TimerIsr)(void))  

  23. {  

  24.     rTCFG0 |= 65;           //定时器0预分频65+1,由PCLK=66提供时钟,66分频产生1MHz的定时器时钟,  

  25.     rTCON &= (~0xff00);     //清除设置  

  26.     rTCON |= BIT11;         //定时器1自动更新使能  

  27.     rTCNTB1 = RTime;        //重装值  

  28.     rTINT_CSTAT |= BIT6;    //清除中断标志  

  29.     rTINT_CSTAT |= (EnInt == ENABLE) ? BIT1 : 0;    //使能定时器0中断  

  30.     Set_IsrAddr(INT_TIMER1,(u32)TimerIsr);  //设置中断矢量入口  

  31.     Set_IntEnable(INT_TIMER1,EnInt);            //使能定时器1全局中断  

  32.     //以下操作启动定时器0  

  33.     rTCON |= BIT9;          //手动更新  

  34.     rTCON &= ~BIT9;         //结束手动更新  

  35.     rTCON |= BIT8;          //启动定时器0      

  36. }  

  37.   

  38.   

  39.   

  40. //主函数  

  41. int main(void)  

  42. {         

  43. //  u16 data;  

  44.       

  45.     UART0_Init(DISABLE,115200);                 //初始化串口,失能中断接收,波特率115200  

  46.     LCD_Init();                                 //初始化LCD  

  47.     LED_Init();                                 //初始化LED  

  48.     Timer_Init(400000-1,ENABLE,Time_Isr);       //初始化定时器1,周期400ms  

  49.       

  50.     while(1);     

  51. }  

  52.   

  53.   

  54.   

  55.   

  56. //LED1闪烁程序,在定时器1中断服务程序中闪烁,周期400MS  

  57. void LED1_flash(void)  

  58. {  

  59.     LED1_FLASH();  

  60. }  


 


关键字:OK6410  汇编程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容