📄 uart.txt
字号:
;;;96 U0DLL = Fdiv % 256;
000260 e1a00005 MOV r0,r5
000264 e1a01fc5 ASR r1,r5,#31
000268 e0851c21 ADD r1,r5,r1,LSR #24
00026c e1a01441 ASR r1,r1,#8
000270 e0451401 SUB r1,r5,r1,LSL #8
000274 e5c21000 STRB r1,[r2,#0]
;;;97 U0LCR = 0x03;
000278 e3a00003 MOV r0,#3
00027c e1c21000 BIC r1,r2,r0
000280 e5c1000c STRB r0,[r1,#0xc]
;;;98
;;;99 U0FCR = 0x01;// U0FCR = 0x81; // 设置FIFO控制寄存器,使能FIFO,并设置触发点为1字节。
000284 e3a00001 MOV r0,#1
000288 e5c10008 STRB r0,[r1,#8]
;;;100 U0IER = 0x01; // 设置中断使能寄存器,允许RBR中断,即接收中断
00028c e5c10004 STRB r0,[r1,#4]
;;;101
;;;102 VICIntSelect &=~(1<<6); // 设置所有通道为IRQ中断
000290 e3a00000 MOV r0,#0
000294 e5100ff4 LDR r0,[r0,#-0xff4]
000298 e3c00040 BIC r0,r0,#0x40
00029c e3a01000 MOV r1,#0
0002a0 e5010ff4 STR r0,[r1,#-0xff4]
;;;103 VICVectCntl5 = 0x20 | 6; // UART0中断通道分配到IRQ slot 10,即优先级10
0002a4 e3a00026 MOV r0,#0x26
0002a8 e5010dec STR r0,[r1,#-0xdec]
;;;104 VICVectAddr5 = (int)IRQ_UART0; // 设置UART0向量地址为10
0002ac e24f0fa2 ADR r0,IRQ_UART0
0002b0 e5010eec STR r0,[r1,#-0xeec]
;;;105 VICIntEnable |=(1<<6); // 使能UART0中断
0002b4 e3a00000 MOV r0,#0
0002b8 e5100ff0 LDR r0,[r0,#-0xff0]
0002bc e3800040 ORR r0,r0,#0x40
0002c0 e5010ff0 STR r0,[r1,#-0xff0]
;;;106 }
0002c4 e8bd4070 POP {r4-r6,lr}
0002c8 e12fff1e BX lr
;;;107
ENDP
UART0_SendByte PROC
;;;116 void UART0_SendByte(uint8 data)
;;;117 { U0THR = data; // 发送数据
0002cc e59f1310 LDR r1,|L1.1508|
0002d0 e5c10000 STRB r0,[r1,#0]
;;;118
;;;119 while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
0002d4 e1a00000 MOV r0,r0
|L1.728|
0002d8 e59f1304 LDR r1,|L1.1508|
0002dc e5d11014 LDRB r1,[r1,#0x14]
0002e0 e3110040 TST r1,#0x40
0002e4 0afffffb BEQ |L1.728|
;;;120 }
0002e8 e12fff1e BX lr
;;;121 /****************************************************************************
ENDP
IRQ_UART1 PROC
;;;128 void __irq IRQ_UART1(void)
;;;129 {
0002ec e92d0007 PUSH {r0-r2}
;;;130 uint8 i;
;;;131 if ( (IO1SET&RY4) == 0 ) IO1SET |= RY4; // 控制LED4点亮
0002f0 e59f1318 LDR r1,|L1.1552|
0002f4 e5911014 LDR r1,[r1,#0x14]
0002f8 e3110602 TST r1,#0x200000
0002fc 1a000005 BNE |L1.792|
000300 e59f1308 LDR r1,|L1.1552|
000304 e5911014 LDR r1,[r1,#0x14]
000308 e3811602 ORR r1,r1,#0x200000
00030c e59f22fc LDR r2,|L1.1552|
000310 e5821014 STR r1,[r2,#0x14]
000314 ea000004 B |L1.812|
|L1.792|
;;;132 else IO1CLR |= RY4; // 控制LED4熄灭
000318 e59f12f0 LDR r1,|L1.1552|
00031c e591101c LDR r1,[r1,#0x1c]
000320 e3811602 ORR r1,r1,#0x200000
000324 e59f22e4 LDR r2,|L1.1552|
000328 e582101c STR r1,[r2,#0x1c]
|L1.812|
;;;133
;;;134 if( 0x04==(U1IIR&0x0F))
00032c e59f12e0 LDR r1,|L1.1556|
000330 e5d11008 LDRB r1,[r1,#8]
000334 e201100f AND r1,r1,#0xf
000338 e3510004 CMP r1,#4
00033c 1a00002c BNE |L1.1012|
;;;135 {
;;;136
;;;137 switch(uart1_rec_flag)
000340 e59f12d0 LDR r1,|L1.1560|
000344 e5d11000 LDRB r1,[r1,#0] ; uart1_rec_flag
000348 e3510000 CMP r1,#0
00034c 0a000002 BEQ |L1.860|
000350 e3510001 CMP r1,#1
000354 1a000023 BNE |L1.1000|
000358 ea000010 B |L1.928|
|L1.860|
;;;138 {
;;;139 case 0:
00035c e1a00000 MOV r0,r0
;;;140 for(i=0; i<8; i++)
000360 e3a00000 MOV r0,#0
000364 ea000005 B |L1.896|
|L1.872|
;;;141 {
;;;142 rcv_buf1[i] = U1RBR;
000368 e59f12a4 LDR r1,|L1.1556|
00036c e5d11000 LDRB r1,[r1,#0]
000370 e59f22a4 LDR r2,|L1.1564|
000374 e7c21000 STRB r1,[r2,r0]
000378 e2801001 ADD r1,r0,#1 ;140
00037c e20100ff AND r0,r1,#0xff ;140
|L1.896|
000380 e3500008 CMP r0,#8 ;140
000384 bafffff7 BLT |L1.872|
;;;143 }
;;;144 uart1_rec_flag++;
000388 e59f1288 LDR r1,|L1.1560|
00038c e5d11000 LDRB r1,[r1,#0] ; uart1_rec_flag
000390 e2811001 ADD r1,r1,#1
000394 e59f227c LDR r2,|L1.1560|
000398 e5c21000 STRB r1,[r2,#0] ; uart1_rec_flag
;;;145 break;
00039c ea000013 B |L1.1008|
|L1.928|
;;;146 case 1:
0003a0 e1a00000 MOV r0,r0
;;;147 for(i=8; i<16; i++)
0003a4 e3a00008 MOV r0,#8
0003a8 ea000005 B |L1.964|
|L1.940|
;;;148 {
;;;149 rcv_buf1[i] = U1RBR;
0003ac e59f1260 LDR r1,|L1.1556|
0003b0 e5d11000 LDRB r1,[r1,#0]
0003b4 e59f2260 LDR r2,|L1.1564|
0003b8 e7c21000 STRB r1,[r2,r0]
0003bc e2801001 ADD r1,r0,#1 ;147
0003c0 e20100ff AND r0,r1,#0xff ;147
|L1.964|
0003c4 e3500010 CMP r0,#0x10 ;147
0003c8 bafffff7 BLT |L1.940|
;;;150 }
;;;151
;;;152 uart1_rec_flag = 0; //接收结束
0003cc e3a01000 MOV r1,#0
0003d0 e59f2240 LDR r2,|L1.1560|
0003d4 e5c21000 STRB r1,[r2,#0] ; uart1_rec_flag
;;;153 rcv_new1 = 1; // 设置接收到新的数据标志,表明RX数据可用。 //设置接收到新的数据标志
0003d8 e3a01001 MOV r1,#1
0003dc e59f223c LDR r2,|L1.1568|
0003e0 e5c21000 STRB r1,[r2,#0] ; rcv_new1
;;;154
;;;155 break;
0003e4 ea000001 B |L1.1008|
|L1.1000|
;;;156 default:
0003e8 e1a00000 MOV r0,r0
;;;157 break;
0003ec e1a00000 MOV r0,r0
|L1.1008|
0003f0 e1a00000 MOV r0,r0 ;145
|L1.1012|
;;;158 }
;;;159 }
;;;160 VICVectAddr = 0x00; // 中断处理结束
0003f4 e3a01000 MOV r1,#0
0003f8 e5011fd0 STR r1,[r1,#-0xfd0]
;;;161
;;;162 }
0003fc e8bd0007 POP {r0-r2}
000400 e25ef004 SUBS pc,lr,#4
;;;163
ENDP
UART1_Ini PROC
;;;170 void UART1_Ini(uint32 bps)
;;;171 { uint16 Fdiv;
000404 e92d4070 PUSH {r4-r6,lr}
000408 e1a04000 MOV r4,r0
;;;172 U1LCR = 0x83; // DLAB = 1,可设置波特率
00040c e3a00083 MOV r0,#0x83
000410 e59f11fc LDR r1,|L1.1556|
000414 e5c1000c STRB r0,[r1,#0xc]
;;;173 Fdiv = (Fpclk / 16) / bps; // 设置波特率
000418 e1a01004 MOV r1,r4
00041c e59f01e8 LDR r0,|L1.1548|
000420 ebfffffe BL __aeabi_uidivmod
000424 e1a05800 LSL r5,r0,#16
000428 e1a05825 LSR r5,r5,#16
;;;174 U1DLM = Fdiv / 256;
00042c e1a00005 MOV r0,r5
000430 e1a01fc5 ASR r1,r5,#31
000434 e0851c21 ADD r1,r5,r1,LSR #24
000438 e1a01801 LSL r1,r1,#16
00043c e1a01c21 LSR r1,r1,#24
000440 e59f21cc LDR r2,|L1.1556|
000444 e5c21004 STRB r1,[r2,#4]
;;;175 U1DLL = Fdiv % 256;
000448 e1a00005 MOV r0,r5
00044c e1a01fc5 ASR r1,r5,#31
000450 e0851c21 ADD r1,r5,r1,LSR #24
000454 e1a01441 ASR r1,r1,#8
000458 e0451401 SUB r1,r5,r1,LSL #8
00045c e5c21000 STRB r1,[r2,#0]
;;;176 U1LCR = 0x03;
000460 e3a00003 MOV r0,#3
000464 e1c21000 BIC r1,r2,r0
000468 e5c1000c STRB r0,[r1,#0xc]
;;;177
;;;178 U1FCR = 0x81; // 设置FIFO控制寄存器,使能FIFO,并设置触发点为8字节。
00046c e3a00081 MOV r0,#0x81
000470 e5c10008 STRB r0,[r1,#8]
;;;179 U1IER = 0x01; // 设置中断使能寄存器,允许RBR中断,即接收中断
000474 e3a00001 MOV r0,#1
000478 e5c10004 STRB r0,[r1,#4]
;;;180 //IO0SET=M485_EN;
;;;181
;;;182
;;;183 VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
00047c e3a00000 MOV r0,#0
000480 e5000ff4 STR r0,[r0,#-0xff4]
;;;184 VICVectCntl0 = 0x27; // UART0中断通道分配到IRQ slot 10,即优先级10
000484 e3a00027 MOV r0,#0x27
000488 e3a01000 MOV r1,#0
00048c e5010e00 STR r0,[r1,#-0xe00]
;;;185 VICVectAddr0 = (int)IRQ_UART1; // 设置UART0向量地址为10
000490 e24f0f6b ADR r0,IRQ_UART1
000494 e5010f00 STR r0,[r1,#-0xf00]
;;;186 VICIntEnable = 0x00000080; // 使能UART0中断
000498 e3a00080 MOV r0,#0x80
00049c e5010ff0 STR r0,[r1,#-0xff0]
;;;187 }
0004a0 e8bd4070 POP {r4-r6,lr}
0004a4 e12fff1e BX lr
;;;188 /****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -