📄 uart.s
字号:
///////////////////////////////////////////////////////////////////////////////
// /
// IAR ANSI C/C++ Compiler V6.40.1.53790/W32 for ARM 09/Aug/2012 09:28:56 /
// Copyright 1999-2012 IAR Systems AB. /
// /
// Cpu mode = thumb /
// Endian = little /
// Source file = C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\src\Sources\C\Component_C\uart.c /
// Command line = "C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\src\Sources\C\Component_C\uart.c" /
// -D IAR -D TWR_K60N512 -lCN /
// "C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\bin\Flash\List\" -lB /
// "C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\bin\Flash\List\" -o /
// "C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\bin\Flash\Obj\" --no_cse /
// --no_unroll --no_inline --no_code_motion --no_tbaa /
// --no_clustering --no_scheduling --debug /
// --endian=little --cpu=Cortex-M4 -e --fpu=None /
// --dlib_config "C:\Program Files\IAR Systems\Embedded /
// Workbench 6.4_2\arm\INC\c\DLib_Config_Normal.h" -I /
// "C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\src\Sources\H\" -I /
// "C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\src\Sources\H\Component_H\" -I /
// "C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\src\Sources\H\Frame_H\" -Ol /
// --use_c++_inline /
// List file = C:\Users\305030973\Desktop\M4 /
// example\02_uart_loop\bin\Flash\List\uart.s /
// /
// /
///////////////////////////////////////////////////////////////////////////////
NAME uart
#define SHT_PROGBITS 0x1
EXTERN disable_irq
EXTERN enable_irq
PUBLIC disableuartreint
PUBLIC enableuartreint
PUBLIC uart_init
PUBLIC uart_re1
PUBLIC uart_reN
PUBLIC uart_send1
PUBLIC uart_sendN
// C:\Users\305030973\Desktop\M4 example\02_uart_loop\src\Sources\C\Component_C\uart.c
// 1 //-------------------------------------------------------------------------*
// 2 // 文件名: uart.c *
// 3 // 说 明: uart构件源文件 *
// 4 //-------------------------------------------------------------------------*
// 5
// 6 #include "uart.h"
// 7
// 8 //-------------------------------------------------------------------------*
// 9 //函数名: uart_init *
// 10 //功 能: 初始化uartx模块。 *
// 11 //参 数: uartch:串口号 *
// 12 // sysclk:系统总线时钟,以MHz为单位 *
// 13 // baud:波特率,如9600,38400等,一般来说,速度越慢,通信越稳 *
// 14 //返 回: 无 *
// 15 //说 明: *
// 16 //-------------------------------------------------------------------------*
SECTION `.text`:CODE:NOROOT(1)
THUMB
// 17 void uart_init (UART_MemMapPtr uartch, uint32 sysclk, uint32 baud)
// 18 {
uart_init:
PUSH {R4,R5}
// 19 register uint16 sbr, brfa;
// 20 uint8 temp;
// 21
// 22 //使能引脚
// 23 if (uartch == UART0_BASE_PTR)
LDR.N R3,??DataTable0 ;; 0x4006a000
CMP R0,R3
BNE.N ??uart_init_0
// 24 {
// 25 //在PTD6上使能UART0_TXD功能
// 26 PORTD_PCR6 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_1 ;; 0x4004c018
MOV R4,#+768
STR R4,[R3, #+0]
// 27 //在PTD7上使能UART0_RXD
// 28 PORTD_PCR7 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_2 ;; 0x4004c01c
MOV R4,#+768
STR R4,[R3, #+0]
B.N ??uart_init_1
// 29 }else if (uartch == UART1_BASE_PTR)
??uart_init_0:
LDR.N R3,??DataTable0_3 ;; 0x4006b000
CMP R0,R3
BNE.N ??uart_init_2
// 30 {
// 31 //在PTC4上使能UART1_TXD功能
// 32 PORTC_PCR4 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_4 ;; 0x4004b010
MOV R4,#+768
STR R4,[R3, #+0]
// 33
// 34 //在PTC3上使能UART1_RXD
// 35 PORTC_PCR3 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_5 ;; 0x4004b00c
MOV R4,#+768
STR R4,[R3, #+0]
B.N ??uart_init_1
// 36 }else if (uartch == UART2_BASE_PTR)
??uart_init_2:
LDR.N R3,??DataTable0_6 ;; 0x4006c000
CMP R0,R3
BNE.N ??uart_init_3
// 37 {
// 38 //在PTD3上使能UART2_TXD功能
// 39 PORTD_PCR3 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_7 ;; 0x4004c00c
MOV R4,#+768
STR R4,[R3, #+0]
// 40 //在PTD2上使能UART2_RXD
// 41 PORTD_PCR2 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_8 ;; 0x4004c008
MOV R4,#+768
STR R4,[R3, #+0]
B.N ??uart_init_1
// 42 }else if (uartch == UART3_BASE_PTR)
??uart_init_3:
LDR.N R3,??DataTable0_9 ;; 0x4006d000
CMP R0,R3
BNE.N ??uart_init_4
// 43 {
// 44 //在PTC17上使能UART3_TXD功能
// 45 PORTC_PCR17 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_10 ;; 0x4004b044
MOV R4,#+768
STR R4,[R3, #+0]
// 46 //在PTC16上使能UART3_RXD
// 47 PORTC_PCR16 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_11 ;; 0x4004b040
MOV R4,#+768
STR R4,[R3, #+0]
B.N ??uart_init_1
// 48 }else if (uartch == UART4_BASE_PTR)
??uart_init_4:
LDR.N R3,??DataTable0_12 ;; 0x400ea000
CMP R0,R3
BNE.N ??uart_init_5
// 49 {
// 50 //在PTE24上使能UART4_TXD功能
// 51 PORTE_PCR24 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_13 ;; 0x4004d060
MOV R4,#+768
STR R4,[R3, #+0]
// 52 //在PTE25上使能UART4_RXD
// 53 PORTE_PCR25 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_14 ;; 0x4004d064
MOV R4,#+768
STR R4,[R3, #+0]
B.N ??uart_init_1
// 54 }else if (uartch == UART5_BASE_PTR)
??uart_init_5:
LDR.N R3,??DataTable0_15 ;; 0x400eb000
CMP R0,R3
BNE.N ??uart_init_1
// 55 {
// 56 //在PTE8上使能UART5_TXD功能
// 57 PORTE_PCR8 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_16 ;; 0x4004d020
MOV R4,#+768
STR R4,[R3, #+0]
// 58 //在PTE9上使能UART5_RXD
// 59 PORTE_PCR9 = PORT_PCR_MUX(0x3);
LDR.N R3,??DataTable0_17 ;; 0x4004d024
MOV R4,#+768
STR R4,[R3, #+0]
// 60 }
// 61
// 62 //使能串口时钟
// 63 if(uartch == UART0_BASE_PTR)
??uart_init_1:
LDR.N R3,??DataTable0 ;; 0x4006a000
CMP R0,R3
BNE.N ??uart_init_6
// 64 SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;
LDR.N R3,??DataTable0_18 ;; 0x40048034
LDR R3,[R3, #+0]
ORRS R3,R3,#0x400
LDR.N R4,??DataTable0_18 ;; 0x40048034
STR R3,[R4, #+0]
B.N ??uart_init_7
// 65 else
// 66 if (uartch == UART1_BASE_PTR)
??uart_init_6:
LDR.N R3,??DataTable0_3 ;; 0x4006b000
CMP R0,R3
BNE.N ??uart_init_8
// 67 SIM_SCGC4 |= SIM_SCGC4_UART1_MASK;
LDR.N R3,??DataTable0_18 ;; 0x40048034
LDR R3,[R3, #+0]
ORRS R3,R3,#0x800
LDR.N R4,??DataTable0_18 ;; 0x40048034
STR R3,[R4, #+0]
B.N ??uart_init_7
// 68 else
// 69 if (uartch == UART2_BASE_PTR)
??uart_init_8:
LDR.N R3,??DataTable0_6 ;; 0x4006c000
CMP R0,R3
BNE.N ??uart_init_9
// 70 SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
LDR.N R3,??DataTable0_18 ;; 0x40048034
LDR R3,[R3, #+0]
ORRS R3,R3,#0x1000
LDR.N R4,??DataTable0_18 ;; 0x40048034
STR R3,[R4, #+0]
B.N ??uart_init_7
// 71 else
// 72 if(uartch == UART3_BASE_PTR)
??uart_init_9:
LDR.N R3,??DataTable0_9 ;; 0x4006d000
CMP R0,R3
BNE.N ??uart_init_10
// 73 SIM_SCGC4 |= SIM_SCGC4_UART3_MASK;
LDR.N R3,??DataTable0_18 ;; 0x40048034
LDR R3,[R3, #+0]
ORRS R3,R3,#0x2000
LDR.N R4,??DataTable0_18 ;; 0x40048034
STR R3,[R4, #+0]
B.N ??uart_init_7
// 74 else
// 75 if(uartch == UART4_BASE_PTR)
??uart_init_10:
LDR.N R3,??DataTable0_12 ;; 0x400ea000
CMP R0,R3
BNE.N ??uart_init_11
// 76 SIM_SCGC1 |= SIM_SCGC1_UART4_MASK;
LDR.N R3,??DataTable0_19 ;; 0x40048028
LDR R3,[R3, #+0]
ORRS R3,R3,#0x400
LDR.N R4,??DataTable0_19 ;; 0x40048028
STR R3,[R4, #+0]
B.N ??uart_init_7
// 77 else
// 78 SIM_SCGC1 |= SIM_SCGC1_UART5_MASK;
??uart_init_11:
LDR.N R3,??DataTable0_19 ;; 0x40048028
LDR R3,[R3, #+0]
ORRS R3,R3,#0x800
LDR.N R4,??DataTable0_19 ;; 0x40048028
STR R3,[R4, #+0]
// 79
// 80 //禁止发送接受
// 81 UART_C2_REG(uartch) &= ~(UART_C2_TE_MASK
// 82 | UART_C2_RE_MASK );
??uart_init_7:
LDRB R3,[R0, #+3]
ANDS R3,R3,#0xF3
STRB R3,[R0, #+3]
// 83
// 84 //配置成8位无校验模式
// 85 UART_C1_REG(uartch) = 0;
MOVS R3,#+0
STRB R3,[R0, #+2]
// 86
// 87 //计算波特率,串口0、1使用内核时钟,其它串口使用外设时钟,系统时钟为
// 88 //外设时钟的2倍
// 89 if ((uartch == UART0_BASE_PTR) | (uartch == UART1_BASE_PTR))//
LDR.N R3,??DataTable0 ;; 0x4006a000
CMP R0,R3
BNE.N ??uart_init_12
MOVS R3,#+1
B.N ??uart_init_13
??uart_init_12:
MOVS R3,#+0
??uart_init_13:
LDR.N R4,??DataTable0_3 ;; 0x4006b000
CMP R0,R4
BNE.N ??uart_init_14
MOVS R4,#+1
B.N ??uart_init_15
??uart_init_14:
MOVS R4,#+0
??uart_init_15:
UXTB R3,R3 ;; ZeroExt R3,R3,#+24,#+24
UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
ORRS R3,R4,R3
CMP R3,#+0
BEQ.N ??uart_init_16
// 90 sysclk+=sysclk;
ADDS R1,R1,R1
// 91
// 92 sbr = (uint16)((sysclk*1000)/(baud * 16));
??uart_init_16:
MOV R3,#+1000
MUL R3,R3,R1
LSLS R4,R2,#+4
UDIV R3,R3,R4
// 93 temp = UART_BDH_REG(uartch) & ~(UART_BDH_SBR(0x1F));
LDRB R4,[R0, #+0]
ANDS R4,R4,#0xE0
// 94 UART_BDH_REG(uartch) = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8));
UXTH R3,R3 ;; ZeroExt R3,R3,#+16,#+16
LSRS R5,R3,#+8
ANDS R5,R5,#0x1F
ORRS R4,R5,R4
STRB R4,[R0, #+0]
// 95 UART_BDL_REG(uartch) = (uint8)(sbr & UART_BDL_SBR_MASK);
STRB R3,[R0, #+1]
// 96 brfa = (((sysclk*32000)/(baud * 16)) - (sbr * 32));
MOV R4,#+32000
MULS R1,R4,R1
LSLS R2,R2,#+4
UDIV R1,R1,R2
UXTH R3,R3 ;; ZeroExt R3,R3,#+16,#+16
SUBS R1,R1,R3, LSL #+5
// 97 temp = UART_C4_REG(uartch) & ~(UART_C4_BRFA(0x1F));
LDRB R2,[R0, #+10]
ANDS R4,R2,#0xE0
// 98 UART_C4_REG(uartch) = temp | UART_C4_BRFA(brfa);
ANDS R1,R1,#0x1F
ORRS R1,R1,R4
STRB R1,[R0, #+10]
// 99
// 100 //使能发送接受
// 101 UART_C2_REG(uartch) |= (UART_C2_TE_MASK
// 102 | UART_C2_RE_MASK );
LDRB R1,[R0, #+3]
ORRS R1,R1,#0xC
STRB R1,[R0, #+3]
// 103 }
POP {R4,R5}
BX LR ;; return
SECTION `.text`:CODE:NOROOT(2)
SECTION_TYPE SHT_PROGBITS, 0
DATA
??DataTable0:
DC32 0x4006a000
SECTION `.text`:CODE:NOROOT(2)
SECTION_TYPE SHT_PROGBITS, 0
DATA
??DataTable0_1:
DC32 0x4004c018
SECTION `.text`:CODE:NOROOT(2)
SECTION_TYPE SHT_PROGBITS, 0
DATA
??DataTable0_2:
DC32 0x4004c01c
SECTION `.text`:CODE:NOROOT(2)
SECTION_TYPE SHT_PROGBITS, 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -