📄 uart.lst
字号:
\ 000000E6 .... LDR.N R3,??DataTable0_19 ;; 0x40048028
\ 000000E8 1B68 LDR R3,[R3, #+0]
\ 000000EA 53F48063 ORRS R3,R3,#0x400
\ 000000EE .... LDR.N R4,??DataTable0_19 ;; 0x40048028
\ 000000F0 2360 STR R3,[R4, #+0]
\ 000000F2 05E0 B.N ??uart_init_7
77 else
78 SIM_SCGC1 |= SIM_SCGC1_UART5_MASK;
\ ??uart_init_11:
\ 000000F4 .... LDR.N R3,??DataTable0_19 ;; 0x40048028
\ 000000F6 1B68 LDR R3,[R3, #+0]
\ 000000F8 53F40063 ORRS R3,R3,#0x800
\ 000000FC .... LDR.N R4,??DataTable0_19 ;; 0x40048028
\ 000000FE 2360 STR R3,[R4, #+0]
79
80 //禁止发送接受
81 UART_C2_REG(uartch) &= ~(UART_C2_TE_MASK
82 | UART_C2_RE_MASK );
\ ??uart_init_7:
\ 00000100 C378 LDRB R3,[R0, #+3]
\ 00000102 13F0F303 ANDS R3,R3,#0xF3
\ 00000106 C370 STRB R3,[R0, #+3]
83
84 //配置成8位无校验模式
85 UART_C1_REG(uartch) = 0;
\ 00000108 0023 MOVS R3,#+0
\ 0000010A 8370 STRB R3,[R0, #+2]
86
87 //计算波特率,串口0、1使用内核时钟,其它串口使用外设时钟,系统时钟为
88 //外设时钟的2倍
89 if ((uartch == UART0_BASE_PTR) | (uartch == UART1_BASE_PTR))//
\ 0000010C .... LDR.N R3,??DataTable0 ;; 0x4006a000
\ 0000010E 9842 CMP R0,R3
\ 00000110 08D0 BEQ.N ??uart_init_12
\ 00000112 0023 MOVS R3,#+0
\ 00000114 .... LDR.N R4,??DataTable0_3 ;; 0x4006b000
\ 00000116 A042 CMP R0,R4
\ 00000118 04D0 BEQ.N ??uart_init_12
\ 0000011A 53F00003 ORRS R3,R3,#0x0
\ 0000011E DBB2 UXTB R3,R3 ;; ZeroExt R3,R3,#+24,#+24
\ 00000120 002B CMP R3,#+0
\ 00000122 00D0 BEQ.N ??uart_init_13
90 sysclk+=sysclk;
\ ??uart_init_12:
\ 00000124 4918 ADDS R1,R1,R1
91
92 sbr = (uint16)((sysclk*1000)/(baud * 16));
\ ??uart_init_13:
\ 00000126 4FF47A73 MOV R3,#+1000
\ 0000012A 03FB01F3 MUL R3,R3,R1
\ 0000012E 1401 LSLS R4,R2,#+4
\ 00000130 B3FBF4F3 UDIV R3,R3,R4
93 temp = UART_BDH_REG(uartch) & ~(UART_BDH_SBR(0x1F));
\ 00000134 0478 LDRB R4,[R0, #+0]
\ 00000136 14F0E004 ANDS R4,R4,#0xE0
94 UART_BDH_REG(uartch) = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8));
\ 0000013A 9BB2 UXTH R3,R3 ;; ZeroExt R3,R3,#+16,#+16
\ 0000013C 1D0A LSRS R5,R3,#+8
\ 0000013E 15F01F05 ANDS R5,R5,#0x1F
\ 00000142 2C43 ORRS R4,R5,R4
\ 00000144 0470 STRB R4,[R0, #+0]
95 UART_BDL_REG(uartch) = (uint8)(sbr & UART_BDL_SBR_MASK);
\ 00000146 4370 STRB R3,[R0, #+1]
96 brfa = (((sysclk*32000)/(baud * 16)) - (sbr * 32));
\ 00000148 4FF4FA44 MOV R4,#+32000
\ 0000014C 6143 MULS R1,R4,R1
\ 0000014E 1201 LSLS R2,R2,#+4
\ 00000150 B1FBF2F1 UDIV R1,R1,R2
\ 00000154 9BB2 UXTH R3,R3 ;; ZeroExt R3,R3,#+16,#+16
\ 00000156 B1EB4311 SUBS R1,R1,R3, LSL #+5
97 temp = UART_C4_REG(uartch) & ~(UART_C4_BRFA(0x1F));
\ 0000015A 827A LDRB R2,[R0, #+10]
\ 0000015C 12F0E004 ANDS R4,R2,#0xE0
98 UART_C4_REG(uartch) = temp | UART_C4_BRFA(brfa);
\ 00000160 11F01F01 ANDS R1,R1,#0x1F
\ 00000164 2143 ORRS R1,R1,R4
\ 00000166 8172 STRB R1,[R0, #+10]
99
100 //使能发送接受
101 UART_C2_REG(uartch) |= (UART_C2_TE_MASK
102 | UART_C2_RE_MASK );
\ 00000168 C178 LDRB R1,[R0, #+3]
\ 0000016A 51F00C01 ORRS R1,R1,#0xC
\ 0000016E C170 STRB R1,[R0, #+3]
103 }
\ 00000170 30BC POP {R4,R5}
\ 00000172 7047 BX LR ;; return
104
105 //-------------------------------------------------------------------------*
106 //函数名: uart_re1 *
107 //功 能: 串行接受1个字节 *
108 //参 数: uartch: 串口号 *
109 // ch: 接收到的字节 *
110 //返 回: 成功:1;失败:0 *
111 //说 明: *
112 //-------------------------------------------------------------------------*
\ In section .text, align 2, keep-with-next
113 uint8 uart_re1 (UART_MemMapPtr uartch,uint8 *ch)
114 {
115 uint32 k;
116
117 for (k = 0; k < 0xfbbb; k++)//有时间限制
\ uart_re1:
\ 00000000 0022 MOVS R2,#+0
\ 00000002 00E0 B.N ??uart_re1_0
\ ??uart_re1_1:
\ 00000004 521C ADDS R2,R2,#+1
\ ??uart_re1_0:
\ 00000006 4FF6BB33 MOVW R3,#+64443
\ 0000000A 9A42 CMP R2,R3
\ 0000000C 06D2 BCS.N ??uart_re1_2
118 if((UART_S1_REG(uartch) & UART_S1_RDRF_MASK)!= 0)//判断接收缓冲区是否满
\ 0000000E 0379 LDRB R3,[R0, #+4]
\ 00000010 9B06 LSLS R3,R3,#+26
\ 00000012 F7D5 BPL.N ??uart_re1_1
119 {
120 *ch = UART_D_REG(uartch);
\ 00000014 C079 LDRB R0,[R0, #+7]
\ 00000016 0870 STRB R0,[R1, #+0]
121 return 1; //接受成功
\ 00000018 0120 MOVS R0,#+1
\ 0000001A 06E0 B.N ??uart_re1_3
122 }
123 if(k>=0xfbbb)
\ ??uart_re1_2:
\ 0000001C 4FF6BB30 MOVW R0,#+64443
\ 00000020 8242 CMP R2,R0
\ 00000022 01D3 BCC.N ??uart_re1_4
124 {
125 return 0; //接受失败
\ 00000024 0020 MOVS R0,#+0
\ 00000026 00E0 B.N ??uart_re1_3
126 }
127 return 0;
\ ??uart_re1_4:
\ 00000028 0020 MOVS R0,#+0
\ ??uart_re1_3:
\ 0000002A 7047 BX LR ;; return
128 }
129
130 //-------------------------------------------------------------------------*
131 //函数名: uart_send1 *
132 //功 能: 串行发送1个字节 *
133 //参 数: uartch: 串口号 *
134 // ch: 要发送的字节 *
135 //返 回: 无 *
136 //说 明: *
137 //-------------------------------------------------------------------------*
\ In section .text, align 2, keep-with-next
138 void uart_send1 (UART_MemMapPtr uartch, uint8 ch)
139 {
140 //等待发送缓冲区空
141 while(!(UART_S1_REG(uartch) & UART_S1_TDRE_MASK));
\ uart_send1:
\ ??uart_send1_0:
\ 00000000 0279 LDRB R2,[R0, #+4]
\ 00000002 1206 LSLS R2,R2,#+24
\ 00000004 FCD5 BPL.N ??uart_send1_0
142 //发送数据
143 UART_D_REG(uartch) = (uint8)ch;
\ 00000006 C171 STRB R1,[R0, #+7]
144 }
\ 00000008 7047 BX LR ;; return
145
146 //-------------------------------------------------------------------------*
147 //函数名: uart_reN *
148 //功 能: 串行 接收n个字节 *
149 //参 数: uartch: 串口号 *
150 // buff: 接收缓冲区 *
151 // len:接收长度 *
152 //返 回: 1:成功;0:失败 *
153 //说 明: *
154 //-------------------------------------------------------------------------*
\ In section .text, align 2, keep-with-next
155 uint8 uart_reN (UART_MemMapPtr uartch ,uint8* buff,uint16 len)
156 {
\ uart_reN:
\ 00000000 F8B5 PUSH {R3-R7,LR}
\ 00000002 0400 MOVS R4,R0
\ 00000004 0D00 MOVS R5,R1
\ 00000006 1600 MOVS R6,R2
157 uint16 m=0;
\ 00000008 0027 MOVS R7,#+0
\ 0000000A 00E0 B.N ??uart_reN_0
158 while (m < len)
159 {
160 if(0==uart_re1(uartch,&buff[m]))
161 return 0; //接收失败
162 else m++;
\ ??uart_reN_1:
\ 0000000C 7F1C ADDS R7,R7,#+1
\ ??uart_reN_0:
\ 0000000E BFB2 UXTH R7,R7 ;; ZeroExt R7,R7,#+16,#+16
\ 00000010 B6B2 UXTH R6,R6 ;; ZeroExt R6,R6,#+16,#+16
\ 00000012 B742 CMP R7,R6
\ 00000014 08D2 BCS.N ??uart_reN_2
\ 00000016 BFB2 UXTH R7,R7 ;; ZeroExt R7,R7,#+16,#+16
\ 00000018 7919 ADDS R1,R7,R5
\ 0000001A 2000 MOVS R0,R4
\ 0000001C ........ BL uart_re1
\ 00000020 0028 CMP R0,#+0
\ 00000022 F3D1 BNE.N ??uart_reN_1
\ 00000024 0020 MOVS R0,#+0
\ 00000026 00E0 B.N ??uart_reN_3
163 }
164
165 return 1; //接收成功
\ ??uart_reN_2:
\ 00000028 0120 MOVS R0,#+1
\ ??uart_reN_3:
\ 0000002A F2BD POP {R1,R4-R7,PC} ;; return
166
167 }
168
169 //-------------------------------------------------------------------------*
170 //函数名: uart_sendN *
171 //功 能: 串行 接收n个字节 *
172 //参 数: uartch: 串口号 *
173 // buff: 发送缓冲区 *
174 // len:发送长度 *
175 //返 回: 无 *
176 //说 明: *
177 //-------------------------------------------------------------------------*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -