📄 main.lst
字号:
ARM COMPILER V2.50a, main 22/04/06 16:43:25 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE main
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe main.c ARM BROWSE DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 main.c file
3
4 ADuC7027的第八个实验——中断
5
6 作者:Computer-lov
7 建立日期:2006-4-20
8 修改日期:2006-4-20
9 版本:V1.0
10 版权所有,盗版必究。
11 任何技术问题可到我的博客上留言: http://computer00.21ic.org
12 Copyright(C) Computer-lov 2006-2016
13 All rights reserved
14 **********************************************************************************************/
15
16 #include <ADuC7027.H>
17 #include <../my_type.h>
18 #include <../LED.H>
19 #include "interrupt.h"
20
21 volatile uint32 pll_lock;
22
23 /*********************************************************************************************/
24 void sys_clk_init(void)
25 {
26 1 PLLKEY1=0xAA;
27 1 PLLCON=0x01; //PLL配置
28 1 PLLKEY2=0x55;
29 1 POWKEY1=0x01;
30 1 POWCON=0x00; //CPU时钟配置为41.78MHz
31 1 POWKEY2=0xF4;
32 1 // while(!(PLLSTA & 0x01));
33 1 }
34 ///////////////////////////////////////////////////////////////////////////////////////////////
35
36 /*********************************************************************************************/
37 void IRQ_Handler(void) __irq //IRQ中断服务程序
38 {
39 1 if(IRQSTA & EXTERNAL_IRQ0) //读取IRQ中断状态,判断IRQ中断源
40 1 {
41 2 ON_LED4();
42 2 return;
43 2 }
44 1 }
45 ///////////////////////////////////////////////////////////////////////////////////////////////
46
47 /*********************************************************************************************/
48 void FIQ_Handler(void) __fiq //FIQ中断服务程序
49 {
50 1 if(FIQSTA & EXTERNAL_IRQ1) //读取FIQ中断状态,判断FIQ中断源
51 1 {
52 2 ON_LED5();
53 2 return;
54 2 }
55 1 }
56 ///////////////////////////////////////////////////////////////////////////////////////////////
57
58 /*********************************************************************************************/
59 void SWI_0(void) __swi(0) //0号软中断,打开LED6
ARM COMPILER V2.50a, main 22/04/06 16:43:25 PAGE 2
60 {
61 1 ON_LED6();
62 1 }
63
64 ///////////////////////////////////////////////////////////////////////////////////////////////
65
66 /*********************************************************************************************/
67 void SWI_1(void) __swi(1) //1号软中断,打开LED7
68 {
69 1 ON_LED7();
70 1 }
71 ///////////////////////////////////////////////////////////////////////////////////////////////
72
73 /*********************************************************************************************/
74 uint32 SWI_2(uint32 a,uint32 b) __swi(2) //2号软中断,实现两个整数相加
75 {
76 1 return a+b;
77 1 }
78 ///////////////////////////////////////////////////////////////////////////////////////////////
79
80 /*********************************************************************************************/
81 void main(void)
82 {
83 1
84 1 sys_clk_init();
85 1
86 1 EN_LED4(); //使能LED
87 1 EN_LED5();
88 1 EN_LED6();
89 1 EN_LED7();
90 1 EN_LED8();
91 1
92 1 OFF_LED4(); //初始化关掉LED
93 1 OFF_LED5();
94 1 OFF_LED6();
95 1 OFF_LED7();
96 1 OFF_LED8();
97 1
98 1 SWI_0(); //用软中断的方法来打开LED6
99 1 SWI_1(); //用软中断的方法来打开LED7
100 1 if(SWI_2(100,200)==300) //调用软中断,计算100加200,如果结果等于300,则点亮LED8
101 1 {
102 2 ON_LED8();
103 2 }
104 1
105 1 IRQEN |= EXTERNAL_IRQ0; //将外部中断0配置成IRQ中断(按键S4)
106 1 FIQEN |= EXTERNAL_IRQ1; //将外部中断1配置成FIQ中断(按键S3)
107 1
108 1 while(1) //由于是高电平触发中断,所以要同时按住S4、S3键才能运行主程序,即熄灭LED
109 1 { //放开某个按键,则进入相应的中断,点亮相应的LED。由于FIQ的优先级高于IRQ,
110 2 OFF_LED4(); //当先放开S4,后放开S3时,FIQ可中断IRQ,从而能点亮LED5。相反,如果先放开
111 2 OFF_LED5(); //S3,后放开S4,则IRQ不能中断FIQ,所以不能点亮LED4。
112 2 }
113 1 }
114 ///////////////////////////////////////////////////////////////////////////////////////////////
ARM COMPILER V2.50a, main 22/04/06 16:43:25 PAGE 3
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN NUMBER (__startup)
*** PUBLICS:
PUBLIC sys_clk_init?A
PUBLIC IRQ_Handler?A
PUBLIC FIQ_Handler?A
PUBLIC SWI_0?A
PUBLIC SWI_1?A
PUBLIC SWI_2?A
PUBLIC main
PUBLIC pll_lock
*** DATA SEGMENT '?DT0?main':
00000000 pll_lock:
00000000 DS 4
*** CODE SEGMENT '?PR?sys_clk_init?A?main':
26: PLLKEY1=0xAA;
00000000 E3A010AA MOV R1,#0xAA
00000004 E5100000 LDR R0,=0xFFFF0410
00000008 E5801000 STR R1,[R0,#0x0]
27: PLLCON=0x01; //PLL配置
0000000C E3A01001 MOV R1,#0x1
00000010 E5100000 LDR R0,=0xFFFF0414
00000014 E5801000 STR R1,[R0,#0x0]
28: PLLKEY2=0x55;
00000018 E3A02055 MOV R2,#0x55
0000001C E5100000 LDR R0,=0xFFFF0418
00000020 E5802000 STR R2,[R0,#0x0]
29: POWKEY1=0x01;
00000024 E5100000 LDR R0,=0xFFFF0404
00000028 E5801000 STR R1,[R0,#0x0]
30: POWCON=0x00; //CPU时钟配置为41.78MHz
0000002C E3A01000 MOV R1,#0x0
00000030 E5100000 LDR R0,=0xFFFF0408
00000034 E5801000 STR R1,[R0,#0x0]
31: POWKEY2=0xF4;
00000038 E3A010F4 MOV R1,#0xF4
0000003C E5100000 LDR R0,=0xFFFF040C
00000040 E5801000 STR R1,[R0,#0x0]
33: }
00000044 E12FFF1E BX R14
00000048 ENDP ; 'sys_clk_init?A'
*** CODE SEGMENT '?PR?IRQ_Handler?A?main':
37: void IRQ_Handler(void) __irq //IRQ中断服务程序
00000000 E92D0003 STMDB R13!,{R0-R1}
39: if(IRQSTA & EXTERNAL_IRQ0) //读取IRQ中断状态,判断IRQ中断源
00000004 E5100000 LDR R0,=0xFFFF0000
00000008 E5900000 LDR R0,[R0,#0x0]
0000000C E3100902 TST R0,#0x8000
00000010 0A000002 BEQ L_2 ; Targ=0x20
41: ON_LED4();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -