📄 sys.txt
字号:
; generated by ARM C/C++ Compiler, 4.1 [Build 481]
; commandline ArmCC [--debug -c --asm --interleave -o.\OBJ\sys.o --depend=.\OBJ\sys.d --cpu=Cortex-M3 --apcs=interwork -O0 -I..\Demo -I.\HARDWARE\EXTI -I.\HARDWARE\KEY -I.\HARDWARE\LCD -I.\HARDWARE\LED -I.\HARDWARE\TIMER -I.\HARDWARE\WDG -I.\SYSTEM\delay -I.\SYSTEM\sys -I.\SYSTEM\usart -I.\USER -IC:\Keil\ARM\INC -IC:\Keil\ARM\INC\ST\STM32F10x --omf_browse=.\OBJ\sys.crf SYSTEM\sys\sys.c]
THUMB
AREA ||.text||, CODE, READONLY, ALIGN=2
MY_NVIC_SetVectorTable PROC
;;;15 //091207
;;;16 void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)
000000 4aab LDR r2,|L1.688|
;;;17 {
;;;18 //检查参数合法性
;;;19 assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
;;;20 assert_param(IS_NVIC_OFFSET(Offset));
;;;21 SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
000002 400a ANDS r2,r2,r1
000004 4302 ORRS r2,r2,r0
000006 4bab LDR r3,|L1.692|
000008 601a STR r2,[r3,#0]
;;;22 //用于标识向量表是在CODE区还是在RAM区
;;;23 }
00000a 4770 BX lr
;;;24 //设置NVIC分组
ENDP
MY_NVIC_PriorityGroupConfig PROC
;;;27 //091209
;;;28 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
00000c 4601 MOV r1,r0
;;;29 {
;;;30 u32 temp,temp1;
;;;31 temp1=(~NVIC_Group)&0x07;//取后三位
00000e 2307 MOVS r3,#7
000010 ea230201 BIC r2,r3,r1
;;;32 temp1<<=8;
000014 0212 LSLS r2,r2,#8
;;;33 temp=SCB->AIRCR; //读取先前的设置
000016 4ba8 LDR r3,|L1.696|
000018 6818 LDR r0,[r3,#0]
;;;34 temp&=0X0000F8FF; //清空先前分组
00001a f64f03ff MOV r3,#0xf8ff
00001e ea000003 AND r0,r0,r3
;;;35 temp|=0X05FA0000; //写入钥匙
000022 4ba6 LDR r3,|L1.700|
000024 ea400003 ORR r0,r0,r3
;;;36 temp|=temp1;
000028 ea400002 ORR r0,r0,r2
;;;37 SCB->AIRCR=temp; //设置分组
00002c f04f23e0 MOV r3,#0xe000e000
000030 f8c30d0c STR r0,[r3,#0xd0c]
;;;38 }
000034 4770 BX lr
;;;39 //设置NVIC
ENDP
MY_NVIC_Init PROC
;;;53 //100329
;;;54 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
000036 e92d47f0 PUSH {r4-r10,lr}
;;;55 {
00003a 4680 MOV r8,r0
00003c 4689 MOV r9,r1
00003e 4614 MOV r4,r2
000040 461d MOV r5,r3
;;;56 u32 temp;
;;;57 u8 IPRADDR=NVIC_Channel/4; //每组只能存4个,得到组地址
000042 4620 MOV r0,r4
000044 17e1 ASRS r1,r4,#31
000046 eb047191 ADD r1,r4,r1,LSR #30
00004a ea4f0aa1 ASR r10,r1,#2
;;;58 u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
00004e 17e1 ASRS r1,r4,#31
000050 eb047191 ADD r1,r4,r1,LSR #30
000054 1089 ASRS r1,r1,#2
000056 eba40181 SUB r1,r4,r1,LSL #2
00005a b2cf UXTB r7,r1
;;;59 IPROFFSET=IPROFFSET*8+4; //得到偏移的确切位置
00005c 2004 MOVS r0,#4
00005e eb0000c7 ADD r0,r0,r7,LSL #3
000062 b2c7 UXTB r7,r0
;;;60 MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
000064 4628 MOV r0,r5
000066 f7fffffe BL MY_NVIC_PriorityGroupConfig
;;;61 temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
00006a f1c50004 RSB r0,r5,#4
00006e fa08f600 LSL r6,r8,r0
;;;62 temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
000072 200f MOVS r0,#0xf
000074 4128 ASRS r0,r0,r5
000076 ea000009 AND r0,r0,r9
00007a 4306 ORRS r6,r6,r0
;;;63 temp&=0xf;//取低四位
00007c f006060f AND r6,r6,#0xf
;;;64
;;;65 if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
000080 2c20 CMP r4,#0x20
000082 da0c BGE |L1.158|
000084 488e LDR r0,|L1.704|
000086 6800 LDR r0,[r0,#0]
000088 f04f0101 MOV r1,#1
00008c fa01f104 LSL r1,r1,r4
000090 ea400001 ORR r0,r0,r1
000094 f04f21e0 MOV r1,#0xe000e000
000098 f8c10100 STR r0,[r1,#0x100]
00009c e00d B |L1.186|
|L1.158|
;;;66 else NVIC->ISER[1]|=1<<(NVIC_Channel-32);
00009e 4889 LDR r0,|L1.708|
0000a0 6800 LDR r0,[r0,#0]
0000a2 f1a40120 SUB r1,r4,#0x20
0000a6 f04f0201 MOV r2,#1
0000aa fa02f201 LSL r2,r2,r1
0000ae ea400002 ORR r0,r0,r2
0000b2 f04f21e0 MOV r1,#0xe000e000
0000b6 f8c10104 STR r0,[r1,#0x104]
|L1.186|
;;;67 NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级
0000ba 4883 LDR r0,|L1.712|
0000bc f850002a LDR r0,[r0,r10,LSL #2]
0000c0 fa06f107 LSL r1,r6,r7
0000c4 4308 ORRS r0,r0,r1
0000c6 4980 LDR r1,|L1.712|
0000c8 f841002a STR r0,[r1,r10,LSL #2]
;;;68 }
0000cc e8bd87f0 POP {r4-r10,pc}
;;;69
ENDP
Ex_NVIC_Config PROC
;;;75 //待测试...
;;;76 void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
0000d0 b570 PUSH {r4-r6,lr}
;;;77 {
0000d2 4603 MOV r3,r0
;;;78 u8 EXTADDR;
;;;79 u8 EXTOFFSET;
;;;80 EXTADDR=BITx/4;//得到中断寄存器组的编号
0000d4 4608 MOV r0,r1
0000d6 17ce ASRS r6,r1,#31
0000d8 eb017696 ADD r6,r1,r6,LSR #30
0000dc 10b4 ASRS r4,r6,#2
;;;81 EXTOFFSET=(BITx%4)*4;
0000de 17ce ASRS r6,r1,#31
0000e0 eb017696 ADD r6,r1,r6,LSR #30
0000e4 10b6 ASRS r6,r6,#2
0000e6 eba10686 SUB r6,r1,r6,LSL #2
0000ea 06b6 LSLS r6,r6,#26
0000ec 0e35 LSRS r5,r6,#24
;;;82
;;;83 RCC->APB2ENR|=0x01;//使能io复用时钟
0000ee 4877 LDR r0,|L1.716|
0000f0 6980 LDR r0,[r0,#0x18]
0000f2 f0400001 ORR r0,r0,#1
0000f6 4e75 LDR r6,|L1.716|
0000f8 61b0 STR r0,[r6,#0x18]
;;;84 AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx
0000fa ea4f30b6 ROR r0,r6,#14
0000fe f8500024 LDR r0,[r0,r4,LSL #2]
000102 fa03f605 LSL r6,r3,r5
000106 4306 ORRS r6,r6,r0
000108 4871 LDR r0,|L1.720|
00010a f8406024 STR r6,[r0,r4,LSL #2]
;;;85
;;;86 //自动设置
;;;87 EXTI->IMR|=1<<BITx;// 开启line BITx上的中断
00010e 4871 LDR r0,|L1.724|
000110 6800 LDR r0,[r0,#0]
000112 f04f0601 MOV r6,#1
000116 fa06f601 LSL r6,r6,r1
00011a ea400006 ORR r0,r0,r6
00011e 4e6e LDR r6,|L1.728|
000120 f8c60400 STR r0,[r6,#0x400]
;;;88 //EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
;;;89 if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
000124 f0120f01 TST r2,#1
000128 d00a BEQ |L1.320|
00012a 486c LDR r0,|L1.732|
00012c 6800 LDR r0,[r0,#0]
00012e f04f0601 MOV r6,#1
000132 fa06f601 LSL r6,r6,r1
000136 ea400006 ORR r0,r0,r6
00013a 4e67 LDR r6,|L1.728|
00013c f8c6040c STR r0,[r6,#0x40c]
|L1.320|
;;;90 if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
000140 f0120f02 TST r2,#2
000144 d00a BEQ |L1.348|
000146 4866 LDR r0,|L1.736|
000148 6800 LDR r0,[r0,#0]
00014a f04f0601 MOV r6,#1
00014e fa06f601 LSL r6,r6,r1
000152 ea400006 ORR r0,r0,r6
000156 4e60 LDR r6,|L1.728|
000158 f8c60408 STR r0,[r6,#0x408]
|L1.348|
;;;91 }
00015c bd70 POP {r4-r6,pc}
;;;92
ENDP
MYRCC_DeInit PROC
;;;97 //091209
;;;98 void MYRCC_DeInit(void)
00015e b500 PUSH {lr}
;;;99 {
;;;100 RCC->APB1RSTR = 0x00000000;//复位结束
000160 2000 MOVS r0,#0
000162 495a LDR r1,|L1.716|
000164 6108 STR r0,[r1,#0x10]
;;;101 RCC->APB2RSTR = 0x00000000;
000166 60c8 STR r0,[r1,#0xc]
;;;102
;;;103 RCC->AHBENR = 0x00000014; //睡眠模式闪存和SRAM时钟使能.其他关闭.
000168 2014 MOVS r0,#0x14
00016a 6148 STR r0,[r1,#0x14]
;;;104 RCC->APB2ENR = 0x00000000; //外设时钟关闭.
00016c 2000 MOVS r0,#0
00016e 6188 STR r0,[r1,#0x18]
;;;105 RCC->APB1ENR = 0x00000000;
000170 61c8 STR r0,[r1,#0x1c]
;;;106 RCC->CR |= 0x00000001; //使能内部高速时钟HSION
000172 4608 MOV r0,r1
000174 6800 LDR r0,[r0,#0]
000176 f0400001 ORR r0,r0,#1
00017a 6008 STR r0,[r1,#0]
;;;107 RCC->CFGR &= 0xF8FF0000; //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]
00017c 4608 MOV r0,r1
00017e 6840 LDR r0,[r0,#4]
000180 4958 LDR r1,|L1.740|
000182 4008 ANDS r0,r0,r1
000184 4951 LDR r1,|L1.716|
000186 6048 STR r0,[r1,#4]
;;;108 RCC->CR &= 0xFEF6FFFF; //复位HSEON,CSSON,PLLON
000188 4608 MOV r0,r1
00018a 6800 LDR r0,[r0,#0]
00018c 4956 LDR r1,|L1.744|
00018e 4008 ANDS r0,r0,r1
000190 494e LDR r1,|L1.716|
000192 6008 STR r0,[r1,#0]
;;;109 RCC->CR &= 0xFFFBFFFF; //复位HSEBYP
000194 4608 MOV r0,r1
000196 6800 LDR r0,[r0,#0]
000198 f4202080 BIC r0,r0,#0x40000
00019c 6008 STR r0,[r1,#0]
;;;110 RCC->CFGR &= 0xFF80FFFF; //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -